about summary refs log tree commit diff stats
path: root/wiki/inc
diff options
context:
space:
mode:
Diffstat (limited to 'wiki/inc')
-rw-r--r--wiki/inc/.htaccess8
-rw-r--r--wiki/inc/Action/AbstractAclAction.php25
-rw-r--r--wiki/inc/Action/AbstractAction.php88
-rw-r--r--wiki/inc/Action/AbstractAliasAction.php28
-rw-r--r--wiki/inc/Action/AbstractUserAction.php25
-rw-r--r--wiki/inc/Action/Admin.php56
-rw-r--r--wiki/inc/Action/Backlink.php24
-rw-r--r--wiki/inc/Action/Cancel.php25
-rw-r--r--wiki/inc/Action/Check.php26
-rw-r--r--wiki/inc/Action/Conflict.php34
-rw-r--r--wiki/inc/Action/Denied.php23
-rw-r--r--wiki/inc/Action/Diff.php35
-rw-r--r--wiki/inc/Action/Draft.php39
-rw-r--r--wiki/inc/Action/Draftdel.php36
-rw-r--r--wiki/inc/Action/Edit.php91
-rw-r--r--wiki/inc/Action/Exception/ActionAbort.php20
-rw-r--r--wiki/inc/Action/Exception/ActionAclRequiredException.php17
-rw-r--r--wiki/inc/Action/Exception/ActionDisabledException.php17
-rw-r--r--wiki/inc/Action/Exception/ActionException.php66
-rw-r--r--wiki/inc/Action/Exception/ActionUserRequiredException.php17
-rw-r--r--wiki/inc/Action/Exception/FatalException.php29
-rw-r--r--wiki/inc/Action/Exception/NoActionException.php15
-rw-r--r--wiki/inc/Action/Export.php112
-rw-r--r--wiki/inc/Action/Index.php25
-rw-r--r--wiki/inc/Action/Locked.php24
-rw-r--r--wiki/inc/Action/Login.php36
-rw-r--r--wiki/inc/Action/Logout.php50
-rw-r--r--wiki/inc/Action/Media.php24
-rw-r--r--wiki/inc/Action/Plugin.php32
-rw-r--r--wiki/inc/Action/Preview.php58
-rw-r--r--wiki/inc/Action/Profile.php45
-rw-r--r--wiki/inc/Action/ProfileDelete.php42
-rw-r--r--wiki/inc/Action/Recent.php40
-rw-r--r--wiki/inc/Action/Recover.php21
-rw-r--r--wiki/inc/Action/Redirect.php64
-rw-r--r--wiki/inc/Action/Register.php45
-rw-r--r--wiki/inc/Action/Resendpwd.php177
-rw-r--r--wiki/inc/Action/Revert.php65
-rw-r--r--wiki/inc/Action/Revisions.php24
-rw-r--r--wiki/inc/Action/Save.php60
-rw-r--r--wiki/inc/Action/Search.php135
-rw-r--r--wiki/inc/Action/Show.php36
-rw-r--r--wiki/inc/Action/Sitemap.php65
-rw-r--r--wiki/inc/Action/Source.php36
-rw-r--r--wiki/inc/Action/Subscribe.php166
-rw-r--r--wiki/inc/ActionRouter.php228
-rw-r--r--wiki/inc/Ajax.php446
-rw-r--r--wiki/inc/DifferenceEngine.php1544
-rw-r--r--wiki/inc/FeedParser.php84
-rw-r--r--wiki/inc/Form/ButtonElement.php34
-rw-r--r--wiki/inc/Form/CheckableElement.php62
-rw-r--r--wiki/inc/Form/DropdownElement.php190
-rw-r--r--wiki/inc/Form/Element.php151
-rw-r--r--wiki/inc/Form/FieldsetCloseElement.php30
-rw-r--r--wiki/inc/Form/FieldsetOpenElement.php36
-rw-r--r--wiki/inc/Form/Form.php456
-rw-r--r--wiki/inc/Form/HTMLElement.php29
-rw-r--r--wiki/inc/Form/InputElement.php159
-rw-r--r--wiki/inc/Form/LabelElement.php27
-rw-r--r--wiki/inc/Form/LegacyForm.php181
-rw-r--r--wiki/inc/Form/OptGroup.php100
-rw-r--r--wiki/inc/Form/TagCloseElement.php88
-rw-r--r--wiki/inc/Form/TagElement.php29
-rw-r--r--wiki/inc/Form/TagOpenElement.php30
-rw-r--r--wiki/inc/Form/TextareaElement.php51
-rw-r--r--wiki/inc/Form/ValueElement.php45
-rw-r--r--wiki/inc/HTTPClient.php943
-rw-r--r--wiki/inc/IXR_Library.php1132
-rw-r--r--wiki/inc/Input.class.php335
-rw-r--r--wiki/inc/JSON.php656
-rw-r--r--wiki/inc/JpegMeta.php3188
-rw-r--r--wiki/inc/Mailer.class.php730
-rw-r--r--wiki/inc/Manifest.php80
-rw-r--r--wiki/inc/Menu/AbstractMenu.php95
-rw-r--r--wiki/inc/Menu/DetailMenu.php21
-rw-r--r--wiki/inc/Menu/Item/AbstractItem.php253
-rw-r--r--wiki/inc/Menu/Item/Admin.php24
-rw-r--r--wiki/inc/Menu/Item/Back.php29
-rw-r--r--wiki/inc/Menu/Item/Backlink.php18
-rw-r--r--wiki/inc/Menu/Item/Edit.php65
-rw-r--r--wiki/inc/Menu/Item/ImgBackto.php24
-rw-r--r--wiki/inc/Menu/Item/Index.php27
-rw-r--r--wiki/inc/Menu/Item/Login.php29
-rw-r--r--wiki/inc/Menu/Item/Media.php21
-rw-r--r--wiki/inc/Menu/Item/MediaManager.php32
-rw-r--r--wiki/inc/Menu/Item/Profile.php24
-rw-r--r--wiki/inc/Menu/Item/Recent.php20
-rw-r--r--wiki/inc/Menu/Item/Register.php24
-rw-r--r--wiki/inc/Menu/Item/Resendpwd.php24
-rw-r--r--wiki/inc/Menu/Item/Revert.php26
-rw-r--r--wiki/inc/Menu/Item/Revisions.php21
-rw-r--r--wiki/inc/Menu/Item/Subscribe.php24
-rw-r--r--wiki/inc/Menu/Item/Top.php36
-rw-r--r--wiki/inc/Menu/MenuInterface.php20
-rw-r--r--wiki/inc/Menu/MobileMenu.php91
-rw-r--r--wiki/inc/Menu/PageMenu.php23
-rw-r--r--wiki/inc/Menu/SiteMenu.php20
-rw-r--r--wiki/inc/Menu/UserMenu.php21
-rw-r--r--wiki/inc/PassHash.class.php639
-rw-r--r--wiki/inc/Plugin.php11
-rw-r--r--wiki/inc/PluginInterface.php158
-rw-r--r--wiki/inc/PluginTrait.php238
-rw-r--r--wiki/inc/RemoteAPICore.php960
-rw-r--r--wiki/inc/SafeFN.class.php158
-rw-r--r--wiki/inc/Sitemapper.php220
-rw-r--r--wiki/inc/StyleUtils.php118
-rw-r--r--wiki/inc/Ui/Admin.php173
-rw-r--r--wiki/inc/Ui/Search.php644
-rw-r--r--wiki/inc/Ui/SearchState.php141
-rw-r--r--wiki/inc/Ui/Ui.php20
-rw-r--r--wiki/inc/actions.php64
-rw-r--r--wiki/inc/auth.php1267
-rw-r--r--wiki/inc/cache.php337
-rw-r--r--wiki/inc/changelog.php1059
-rw-r--r--wiki/inc/cli.php655
-rw-r--r--wiki/inc/common.php2087
-rw-r--r--wiki/inc/compatibility.php82
-rw-r--r--wiki/inc/config_cascade.php87
-rw-r--r--wiki/inc/confutils.php467
-rw-r--r--wiki/inc/events.php257
-rw-r--r--wiki/inc/farm.php150
-rw-r--r--wiki/inc/fetch.functions.php186
-rw-r--r--wiki/inc/form.php1098
-rw-r--r--wiki/inc/fulltext.php919
-rw-r--r--wiki/inc/html.php2255
-rw-r--r--wiki/inc/httputils.php346
-rw-r--r--wiki/inc/indexer.php1611
-rw-r--r--wiki/inc/infoutils.php530
-rw-r--r--wiki/inc/init.php601
-rw-r--r--wiki/inc/io.php827
-rw-r--r--wiki/inc/lang/af/jquery.ui.datepicker.js37
-rw-r--r--wiki/inc/lang/af/lang.php68
-rw-r--r--wiki/inc/lang/ar/admin.txt3
-rw-r--r--wiki/inc/lang/ar/adminplugins.txt1
-rw-r--r--wiki/inc/lang/ar/backlinks.txt3
-rw-r--r--wiki/inc/lang/ar/conflict.txt5
-rw-r--r--wiki/inc/lang/ar/denied.txt3
-rw-r--r--wiki/inc/lang/ar/diff.txt3
-rw-r--r--wiki/inc/lang/ar/draft.txt5
-rw-r--r--wiki/inc/lang/ar/edit.txt1
-rw-r--r--wiki/inc/lang/ar/editrev.txt2
-rw-r--r--wiki/inc/lang/ar/index.txt3
-rw-r--r--wiki/inc/lang/ar/install.html12
-rw-r--r--wiki/inc/lang/ar/jquery.ui.datepicker.js39
-rw-r--r--wiki/inc/lang/ar/lang.php348
-rw-r--r--wiki/inc/lang/ar/locked.txt3
-rw-r--r--wiki/inc/lang/ar/login.txt3
-rw-r--r--wiki/inc/lang/ar/mailtext.txt12
-rw-r--r--wiki/inc/lang/ar/mailwrap.html13
-rw-r--r--wiki/inc/lang/ar/newpage.txt3
-rw-r--r--wiki/inc/lang/ar/norev.txt3
-rw-r--r--wiki/inc/lang/ar/password.txt6
-rw-r--r--wiki/inc/lang/ar/preview.txt3
-rw-r--r--wiki/inc/lang/ar/pwconfirm.txt6
-rw-r--r--wiki/inc/lang/ar/read.txt1
-rw-r--r--wiki/inc/lang/ar/recent.txt3
-rw-r--r--wiki/inc/lang/ar/register.txt3
-rw-r--r--wiki/inc/lang/ar/registermail.txt10
-rw-r--r--wiki/inc/lang/ar/resendpwd.txt3
-rw-r--r--wiki/inc/lang/ar/resetpwd.txt3
-rw-r--r--wiki/inc/lang/ar/revisions.txt2
-rw-r--r--wiki/inc/lang/ar/searchpage.txt4
-rw-r--r--wiki/inc/lang/ar/showrev.txt2
-rw-r--r--wiki/inc/lang/ar/stopwords.txt192
-rw-r--r--wiki/inc/lang/ar/subscr_digest.txt16
-rw-r--r--wiki/inc/lang/ar/subscr_form.txt3
-rw-r--r--wiki/inc/lang/ar/subscr_list.txt13
-rw-r--r--wiki/inc/lang/ar/subscr_single.txt19
-rw-r--r--wiki/inc/lang/ar/updateprofile.txt3
-rw-r--r--wiki/inc/lang/ar/uploadmail.txt10
-rw-r--r--wiki/inc/lang/az/admin.txt4
-rw-r--r--wiki/inc/lang/az/adminplugins.txt1
-rw-r--r--wiki/inc/lang/az/backlinks.txt4
-rw-r--r--wiki/inc/lang/az/conflict.txt5
-rw-r--r--wiki/inc/lang/az/denied.txt3
-rw-r--r--wiki/inc/lang/az/diff.txt4
-rw-r--r--wiki/inc/lang/az/draft.txt5
-rw-r--r--wiki/inc/lang/az/edit.txt1
-rw-r--r--wiki/inc/lang/az/editrev.txt2
-rw-r--r--wiki/inc/lang/az/index.txt4
-rw-r--r--wiki/inc/lang/az/install.html7
-rw-r--r--wiki/inc/lang/az/jquery.ui.datepicker.js37
-rw-r--r--wiki/inc/lang/az/lang.php231
-rw-r--r--wiki/inc/lang/az/locked.txt3
-rw-r--r--wiki/inc/lang/az/login.txt4
-rw-r--r--wiki/inc/lang/az/mailtext.txt12
-rw-r--r--wiki/inc/lang/az/newpage.txt3
-rw-r--r--wiki/inc/lang/az/norev.txt4
-rw-r--r--wiki/inc/lang/az/password.txt6
-rw-r--r--wiki/inc/lang/az/preview.txt4
-rw-r--r--wiki/inc/lang/az/pwconfirm.txt9
-rw-r--r--wiki/inc/lang/az/read.txt2
-rw-r--r--wiki/inc/lang/az/recent.txt5
-rw-r--r--wiki/inc/lang/az/register.txt3
-rw-r--r--wiki/inc/lang/az/registermail.txt10
-rw-r--r--wiki/inc/lang/az/resendpwd.txt3
-rw-r--r--wiki/inc/lang/az/revisions.txt3
-rw-r--r--wiki/inc/lang/az/searchpage.txt4
-rw-r--r--wiki/inc/lang/az/showrev.txt2
-rw-r--r--wiki/inc/lang/az/stopwords.txt64
-rw-r--r--wiki/inc/lang/az/updateprofile.txt5
-rw-r--r--wiki/inc/lang/az/uploadmail.txt10
-rw-r--r--wiki/inc/lang/az/wordblock.txt3
-rw-r--r--wiki/inc/lang/be/admin.txt3
-rw-r--r--wiki/inc/lang/be/adminplugins.txt1
-rw-r--r--wiki/inc/lang/bg/admin.txt3
-rw-r--r--wiki/inc/lang/bg/adminplugins.txt1
-rw-r--r--wiki/inc/lang/bg/backlinks.txt3
-rw-r--r--wiki/inc/lang/bg/conflict.txt6
-rw-r--r--wiki/inc/lang/bg/denied.txt4
-rw-r--r--wiki/inc/lang/bg/diff.txt3
-rw-r--r--wiki/inc/lang/bg/draft.txt6
-rw-r--r--wiki/inc/lang/bg/edit.txt2
-rw-r--r--wiki/inc/lang/bg/editrev.txt2
-rw-r--r--wiki/inc/lang/bg/index.txt4
-rw-r--r--wiki/inc/lang/bg/install.html15
-rw-r--r--wiki/inc/lang/bg/jquery.ui.datepicker.js38
-rw-r--r--wiki/inc/lang/bg/lang.php337
-rw-r--r--wiki/inc/lang/bg/locked.txt3
-rw-r--r--wiki/inc/lang/bg/login.txt3
-rw-r--r--wiki/inc/lang/bg/mailtext.txt12
-rw-r--r--wiki/inc/lang/bg/mailwrap.html13
-rw-r--r--wiki/inc/lang/bg/newpage.txt4
-rw-r--r--wiki/inc/lang/bg/norev.txt4
-rw-r--r--wiki/inc/lang/bg/password.txt6
-rw-r--r--wiki/inc/lang/bg/preview.txt3
-rw-r--r--wiki/inc/lang/bg/pwconfirm.txt10
-rw-r--r--wiki/inc/lang/bg/read.txt2
-rw-r--r--wiki/inc/lang/bg/recent.txt4
-rw-r--r--wiki/inc/lang/bg/register.txt4
-rw-r--r--wiki/inc/lang/bg/registermail.txt10
-rw-r--r--wiki/inc/lang/bg/resendpwd.txt3
-rw-r--r--wiki/inc/lang/bg/resetpwd.txt4
-rw-r--r--wiki/inc/lang/bg/revisions.txt4
-rw-r--r--wiki/inc/lang/bg/searchpage.txt4
-rw-r--r--wiki/inc/lang/bg/showrev.txt2
-rw-r--r--wiki/inc/lang/bg/stopwords.txt29
-rw-r--r--wiki/inc/lang/bg/subscr_digest.txt15
-rw-r--r--wiki/inc/lang/bg/subscr_form.txt3
-rw-r--r--wiki/inc/lang/bg/subscr_list.txt12
-rw-r--r--wiki/inc/lang/bg/subscr_single.txt18
-rw-r--r--wiki/inc/lang/bg/updateprofile.txt3
-rw-r--r--wiki/inc/lang/bg/uploadmail.txt10
-rw-r--r--wiki/inc/lang/bn/admin.txt3
-rw-r--r--wiki/inc/lang/bn/adminplugins.txt1
-rw-r--r--wiki/inc/lang/bn/backlinks.txt3
-rw-r--r--wiki/inc/lang/bn/conflict.txt5
-rw-r--r--wiki/inc/lang/bn/denied.txt3
-rw-r--r--wiki/inc/lang/bn/diff.txt3
-rw-r--r--wiki/inc/lang/bn/draft.txt5
-rw-r--r--wiki/inc/lang/bn/edit.txt1
-rw-r--r--wiki/inc/lang/bn/editrev.txt2
-rw-r--r--wiki/inc/lang/bn/index.txt3
-rw-r--r--wiki/inc/lang/bn/lang.php226
-rw-r--r--wiki/inc/lang/ca-valencia/admin.txt4
-rw-r--r--wiki/inc/lang/ca-valencia/adminplugins.txt1
-rw-r--r--wiki/inc/lang/ca-valencia/backlinks.txt3
-rw-r--r--wiki/inc/lang/ca-valencia/conflict.txt6
-rw-r--r--wiki/inc/lang/ca-valencia/denied.txt4
-rw-r--r--wiki/inc/lang/ca-valencia/diff.txt4
-rw-r--r--wiki/inc/lang/ca-valencia/draft.txt6
-rw-r--r--wiki/inc/lang/ca-valencia/edit.txt2
-rw-r--r--wiki/inc/lang/ca-valencia/editrev.txt2
-rw-r--r--wiki/inc/lang/ca-valencia/index.txt4
-rw-r--r--wiki/inc/lang/ca-valencia/install.html8
-rw-r--r--wiki/inc/lang/ca-valencia/lang.php223
-rw-r--r--wiki/inc/lang/ca-valencia/locked.txt3
-rw-r--r--wiki/inc/lang/ca-valencia/login.txt4
-rw-r--r--wiki/inc/lang/ca-valencia/mailtext.txt12
-rw-r--r--wiki/inc/lang/ca-valencia/newpage.txt3
-rw-r--r--wiki/inc/lang/ca-valencia/norev.txt3
-rw-r--r--wiki/inc/lang/ca-valencia/password.txt6
-rw-r--r--wiki/inc/lang/ca-valencia/preview.txt4
-rw-r--r--wiki/inc/lang/ca-valencia/pwconfirm.txt11
-rw-r--r--wiki/inc/lang/ca-valencia/read.txt2
-rw-r--r--wiki/inc/lang/ca-valencia/recent.txt5
-rw-r--r--wiki/inc/lang/ca-valencia/register.txt4
-rw-r--r--wiki/inc/lang/ca-valencia/registermail.txt10
-rw-r--r--wiki/inc/lang/ca-valencia/resendpwd.txt4
-rw-r--r--wiki/inc/lang/ca-valencia/revisions.txt4
-rw-r--r--wiki/inc/lang/ca-valencia/searchpage.txt4
-rw-r--r--wiki/inc/lang/ca-valencia/showrev.txt2
-rw-r--r--wiki/inc/lang/ca-valencia/stopwords.txt73
-rw-r--r--wiki/inc/lang/ca-valencia/updateprofile.txt5
-rw-r--r--wiki/inc/lang/ca-valencia/uploadmail.txt10
-rw-r--r--wiki/inc/lang/ca/admin.txt4
-rw-r--r--wiki/inc/lang/ca/adminplugins.txt1
-rw-r--r--wiki/inc/lang/ca/backlinks.txt4
-rw-r--r--wiki/inc/lang/ca/conflict.txt6
-rw-r--r--wiki/inc/lang/ca/denied.txt4
-rw-r--r--wiki/inc/lang/ca/diff.txt4
-rw-r--r--wiki/inc/lang/ca/draft.txt5
-rw-r--r--wiki/inc/lang/ca/edit.txt2
-rw-r--r--wiki/inc/lang/ca/editrev.txt2
-rw-r--r--wiki/inc/lang/ca/index.txt4
-rw-r--r--wiki/inc/lang/ca/install.html8
-rw-r--r--wiki/inc/lang/ca/jquery.ui.datepicker.js37
-rw-r--r--wiki/inc/lang/ca/lang.php347
-rw-r--r--wiki/inc/lang/ca/locked.txt3
-rw-r--r--wiki/inc/lang/ca/login.txt4
-rw-r--r--wiki/inc/lang/ca/mailtext.txt11
-rw-r--r--wiki/inc/lang/ca/mailwrap.html13
-rw-r--r--wiki/inc/lang/ca/newpage.txt3
-rw-r--r--wiki/inc/lang/ca/norev.txt5
-rw-r--r--wiki/inc/lang/ca/password.txt6
-rw-r--r--wiki/inc/lang/ca/preview.txt4
-rw-r--r--wiki/inc/lang/ca/pwconfirm.txt11
-rw-r--r--wiki/inc/lang/ca/read.txt2
-rw-r--r--wiki/inc/lang/ca/recent.txt5
-rw-r--r--wiki/inc/lang/ca/register.txt4
-rw-r--r--wiki/inc/lang/ca/registermail.txt10
-rw-r--r--wiki/inc/lang/ca/resendpwd.txt3
-rw-r--r--wiki/inc/lang/ca/resetpwd.txt3
-rw-r--r--wiki/inc/lang/ca/revisions.txt4
-rw-r--r--wiki/inc/lang/ca/searchpage.txt4
-rw-r--r--wiki/inc/lang/ca/showrev.txt2
-rw-r--r--wiki/inc/lang/ca/stopwords.txt106
-rw-r--r--wiki/inc/lang/ca/subscr_digest.txt16
-rw-r--r--wiki/inc/lang/ca/subscr_form.txt3
-rw-r--r--wiki/inc/lang/ca/subscr_list.txt16
-rw-r--r--wiki/inc/lang/ca/subscr_single.txt16
-rw-r--r--wiki/inc/lang/ca/updateprofile.txt3
-rw-r--r--wiki/inc/lang/ca/uploadmail.txt10
-rw-r--r--wiki/inc/lang/cs/admin.txt3
-rw-r--r--wiki/inc/lang/cs/adminplugins.txt1
-rw-r--r--wiki/inc/lang/cs/backlinks.txt3
-rw-r--r--wiki/inc/lang/cs/conflict.txt5
-rw-r--r--wiki/inc/lang/cs/denied.txt3
-rw-r--r--wiki/inc/lang/cs/diff.txt4
-rw-r--r--wiki/inc/lang/cs/draft.txt5
-rw-r--r--wiki/inc/lang/cs/edit.txt1
-rw-r--r--wiki/inc/lang/cs/editrev.txt2
-rw-r--r--wiki/inc/lang/cs/index.txt3
-rw-r--r--wiki/inc/lang/cs/install.html23
-rw-r--r--wiki/inc/lang/cs/jquery.ui.datepicker.js37
-rw-r--r--wiki/inc/lang/cs/lang.php366
-rw-r--r--wiki/inc/lang/cs/locked.txt3
-rw-r--r--wiki/inc/lang/cs/login.txt3
-rw-r--r--wiki/inc/lang/cs/mailtext.txt12
-rw-r--r--wiki/inc/lang/cs/mailwrap.html13
-rw-r--r--wiki/inc/lang/cs/newpage.txt3
-rw-r--r--wiki/inc/lang/cs/norev.txt3
-rw-r--r--wiki/inc/lang/cs/password.txt7
-rw-r--r--wiki/inc/lang/cs/preview.txt3
-rw-r--r--wiki/inc/lang/cs/pwconfirm.txt9
-rw-r--r--wiki/inc/lang/cs/read.txt1
-rw-r--r--wiki/inc/lang/cs/recent.txt3
-rw-r--r--wiki/inc/lang/cs/register.txt3
-rw-r--r--wiki/inc/lang/cs/registermail.txt10
-rw-r--r--wiki/inc/lang/cs/resendpwd.txt3
-rw-r--r--wiki/inc/lang/cs/resetpwd.txt3
-rw-r--r--wiki/inc/lang/cs/revisions.txt3
-rw-r--r--wiki/inc/lang/cs/searchpage.txt4
-rw-r--r--wiki/inc/lang/cs/showrev.txt2
-rw-r--r--wiki/inc/lang/cs/stopwords.txt944
-rw-r--r--wiki/inc/lang/cs/subscr_digest.txt18
-rw-r--r--wiki/inc/lang/cs/subscr_form.txt3
-rw-r--r--wiki/inc/lang/cs/subscr_list.txt15
-rw-r--r--wiki/inc/lang/cs/subscr_single.txt21
-rw-r--r--wiki/inc/lang/cs/updateprofile.txt5
-rw-r--r--wiki/inc/lang/cs/uploadmail.txt10
-rw-r--r--wiki/inc/lang/cy/admin.txt4
-rw-r--r--wiki/inc/lang/cy/adminplugins.txt2
-rw-r--r--wiki/inc/lang/cy/backlinks.txt4
-rw-r--r--wiki/inc/lang/cy/conflict.txt6
-rw-r--r--wiki/inc/lang/cy/denied.txt4
-rw-r--r--wiki/inc/lang/cy/diff.txt4
-rw-r--r--wiki/inc/lang/cy/draft.txt8
-rw-r--r--wiki/inc/lang/cy/edit.txt2
-rw-r--r--wiki/inc/lang/cy/editrev.txt2
-rw-r--r--wiki/inc/lang/cy/index.txt4
-rw-r--r--wiki/inc/lang/cy/install.html24
-rw-r--r--wiki/inc/lang/cy/jquery.ui.datepicker.js45
-rw-r--r--wiki/inc/lang/cy/lang.php372
-rw-r--r--wiki/inc/lang/cy/locked.txt3
-rw-r--r--wiki/inc/lang/cy/login.txt4
-rw-r--r--wiki/inc/lang/cy/mailtext.txt17
-rw-r--r--wiki/inc/lang/cy/mailwrap.html13
-rw-r--r--wiki/inc/lang/cy/newpage.txt4
-rw-r--r--wiki/inc/lang/cy/norev.txt4
-rw-r--r--wiki/inc/lang/cy/password.txt10
-rw-r--r--wiki/inc/lang/cy/preview.txt4
-rw-r--r--wiki/inc/lang/cy/pwconfirm.txt15
-rw-r--r--wiki/inc/lang/cy/read.txt2
-rw-r--r--wiki/inc/lang/cy/recent.txt5
-rw-r--r--wiki/inc/lang/cy/register.txt4
-rw-r--r--wiki/inc/lang/cy/registermail.txt14
-rw-r--r--wiki/inc/lang/cy/resendpwd.txt4
-rw-r--r--wiki/inc/lang/cy/resetpwd.txt4
-rw-r--r--wiki/inc/lang/cy/revisions.txt4
-rw-r--r--wiki/inc/lang/cy/searchpage.txt4
-rw-r--r--wiki/inc/lang/cy/showrev.txt2
-rw-r--r--wiki/inc/lang/cy/stopwords.txt31
-rw-r--r--wiki/inc/lang/cy/subscr_digest.txt20
-rw-r--r--wiki/inc/lang/cy/subscr_form.txt3
-rw-r--r--wiki/inc/lang/cy/subscr_list.txt17
-rw-r--r--wiki/inc/lang/cy/subscr_single.txt23
-rw-r--r--wiki/inc/lang/cy/updateprofile.txt5
-rw-r--r--wiki/inc/lang/cy/uploadmail.txt15
-rw-r--r--wiki/inc/lang/da/admin.txt4
-rw-r--r--wiki/inc/lang/da/adminplugins.txt1
-rw-r--r--wiki/inc/lang/da/backlinks.txt4
-rw-r--r--wiki/inc/lang/da/conflict.txt5
-rw-r--r--wiki/inc/lang/da/denied.txt3
-rw-r--r--wiki/inc/lang/da/diff.txt4
-rw-r--r--wiki/inc/lang/da/draft.txt6
-rw-r--r--wiki/inc/lang/da/edit.txt2
-rw-r--r--wiki/inc/lang/da/editrev.txt2
-rw-r--r--wiki/inc/lang/da/index.txt3
-rw-r--r--wiki/inc/lang/da/install.html24
-rw-r--r--wiki/inc/lang/da/jquery.ui.datepicker.js37
-rw-r--r--wiki/inc/lang/da/lang.php356
-rw-r--r--wiki/inc/lang/da/locked.txt3
-rw-r--r--wiki/inc/lang/da/login.txt3
-rw-r--r--wiki/inc/lang/da/mailtext.txt12
-rw-r--r--wiki/inc/lang/da/mailwrap.html13
-rw-r--r--wiki/inc/lang/da/newpage.txt3
-rw-r--r--wiki/inc/lang/da/norev.txt4
-rw-r--r--wiki/inc/lang/da/password.txt6
-rw-r--r--wiki/inc/lang/da/preview.txt4
-rw-r--r--wiki/inc/lang/da/pwconfirm.txt10
-rw-r--r--wiki/inc/lang/da/read.txt2
-rw-r--r--wiki/inc/lang/da/recent.txt5
-rw-r--r--wiki/inc/lang/da/register.txt4
-rw-r--r--wiki/inc/lang/da/registermail.txt10
-rw-r--r--wiki/inc/lang/da/resendpwd.txt3
-rw-r--r--wiki/inc/lang/da/resetpwd.txt3
-rw-r--r--wiki/inc/lang/da/revisions.txt3
-rw-r--r--wiki/inc/lang/da/searchpage.txt4
-rw-r--r--wiki/inc/lang/da/showrev.txt2
-rw-r--r--wiki/inc/lang/da/stopwords.txt87
-rw-r--r--wiki/inc/lang/da/subscr_digest.txt16
-rw-r--r--wiki/inc/lang/da/subscr_form.txt3
-rw-r--r--wiki/inc/lang/da/subscr_list.txt13
-rw-r--r--wiki/inc/lang/da/subscr_single.txt19
-rw-r--r--wiki/inc/lang/da/updateprofile.txt3
-rw-r--r--wiki/inc/lang/da/uploadmail.txt10
-rw-r--r--wiki/inc/lang/de-informal/admin.txt4
-rw-r--r--wiki/inc/lang/de-informal/adminplugins.txt1
-rw-r--r--wiki/inc/lang/de-informal/backlinks.txt5
-rw-r--r--wiki/inc/lang/de-informal/conflict.txt6
-rw-r--r--wiki/inc/lang/de-informal/denied.txt4
-rw-r--r--wiki/inc/lang/de-informal/diff.txt5
-rw-r--r--wiki/inc/lang/de-informal/draft.txt6
-rw-r--r--wiki/inc/lang/de-informal/edit.txt4
-rw-r--r--wiki/inc/lang/de-informal/editrev.txt2
-rw-r--r--wiki/inc/lang/de-informal/index.txt4
-rw-r--r--wiki/inc/lang/de-informal/install.html27
-rw-r--r--wiki/inc/lang/de-informal/jquery.ui.datepicker.js37
-rw-r--r--wiki/inc/lang/de-informal/lang.php358
-rw-r--r--wiki/inc/lang/de-informal/locked.txt4
-rw-r--r--wiki/inc/lang/de-informal/login.txt4
-rw-r--r--wiki/inc/lang/de-informal/mailtext.txt12
-rw-r--r--wiki/inc/lang/de-informal/mailwrap.html13
-rw-r--r--wiki/inc/lang/de-informal/newpage.txt5
-rw-r--r--wiki/inc/lang/de-informal/norev.txt4
-rw-r--r--wiki/inc/lang/de-informal/password.txt6
-rw-r--r--wiki/inc/lang/de-informal/preview.txt5
-rw-r--r--wiki/inc/lang/de-informal/pwconfirm.txt12
-rw-r--r--wiki/inc/lang/de-informal/read.txt2
-rw-r--r--wiki/inc/lang/de-informal/recent.txt5
-rw-r--r--wiki/inc/lang/de-informal/register.txt4
-rw-r--r--wiki/inc/lang/de-informal/registermail.txt10
-rw-r--r--wiki/inc/lang/de-informal/resendpwd.txt3
-rw-r--r--wiki/inc/lang/de-informal/resetpwd.txt4
-rw-r--r--wiki/inc/lang/de-informal/revisions.txt4
-rw-r--r--wiki/inc/lang/de-informal/searchpage.txt4
-rw-r--r--wiki/inc/lang/de-informal/showrev.txt2
-rw-r--r--wiki/inc/lang/de-informal/stopwords.txt125
-rw-r--r--wiki/inc/lang/de-informal/subscr_digest.txt16
-rw-r--r--wiki/inc/lang/de-informal/subscr_form.txt3
-rw-r--r--wiki/inc/lang/de-informal/subscr_list.txt13
-rw-r--r--wiki/inc/lang/de-informal/subscr_single.txt19
-rw-r--r--wiki/inc/lang/de-informal/updateprofile.txt5
-rw-r--r--wiki/inc/lang/de-informal/uploadmail.txt11
-rw-r--r--wiki/inc/lang/de/admin.txt4
-rw-r--r--wiki/inc/lang/de/adminplugins.txt1
-rw-r--r--wiki/inc/lang/de/backlinks.txt5
-rw-r--r--wiki/inc/lang/de/conflict.txt6
-rw-r--r--wiki/inc/lang/de/denied.txt4
-rw-r--r--wiki/inc/lang/de/diff.txt5
-rw-r--r--wiki/inc/lang/de/draft.txt6
-rw-r--r--wiki/inc/lang/de/edit.txt4
-rw-r--r--wiki/inc/lang/de/editrev.txt2
-rw-r--r--wiki/inc/lang/de/index.txt4
-rw-r--r--wiki/inc/lang/de/install.html27
-rw-r--r--wiki/inc/lang/de/jquery.ui.datepicker.js37
-rw-r--r--wiki/inc/lang/de/lang.php384
-rw-r--r--wiki/inc/lang/de/locked.txt4
-rw-r--r--wiki/inc/lang/de/login.txt4
-rw-r--r--wiki/inc/lang/de/mailtext.txt12
-rw-r--r--wiki/inc/lang/de/mailwrap.html13
-rw-r--r--wiki/inc/lang/de/newpage.txt5
-rw-r--r--wiki/inc/lang/de/norev.txt4
-rw-r--r--wiki/inc/lang/de/password.txt6
-rw-r--r--wiki/inc/lang/de/preview.txt5
-rw-r--r--wiki/inc/lang/de/pwconfirm.txt12
-rw-r--r--wiki/inc/lang/de/read.txt2
-rw-r--r--wiki/inc/lang/de/recent.txt5
-rw-r--r--wiki/inc/lang/de/register.txt4
-rw-r--r--wiki/inc/lang/de/registermail.txt10
-rw-r--r--wiki/inc/lang/de/resendpwd.txt3
-rw-r--r--wiki/inc/lang/de/resetpwd.txt4
-rw-r--r--wiki/inc/lang/de/revisions.txt4
-rw-r--r--wiki/inc/lang/de/searchpage.txt3
-rw-r--r--wiki/inc/lang/de/showrev.txt2
-rw-r--r--wiki/inc/lang/de/stopwords.txt125
-rw-r--r--wiki/inc/lang/de/subscr_digest.txt16
-rw-r--r--wiki/inc/lang/de/subscr_form.txt3
-rw-r--r--wiki/inc/lang/de/subscr_list.txt13
-rw-r--r--wiki/inc/lang/de/subscr_single.txt19
-rw-r--r--wiki/inc/lang/de/updateprofile.txt5
-rw-r--r--wiki/inc/lang/de/uploadmail.txt11
-rw-r--r--wiki/inc/lang/el/admin.txt3
-rw-r--r--wiki/inc/lang/el/adminplugins.txt1
-rw-r--r--wiki/inc/lang/el/backlinks.txt3
-rw-r--r--wiki/inc/lang/el/conflict.txt8
-rw-r--r--wiki/inc/lang/el/denied.txt4
-rw-r--r--wiki/inc/lang/el/diff.txt3
-rw-r--r--wiki/inc/lang/el/draft.txt9
-rw-r--r--wiki/inc/lang/el/edit.txt3
-rw-r--r--wiki/inc/lang/el/editrev.txt2
-rw-r--r--wiki/inc/lang/el/index.txt3
-rw-r--r--wiki/inc/lang/el/install.html26
-rw-r--r--wiki/inc/lang/el/jquery.ui.datepicker.js37
-rw-r--r--wiki/inc/lang/el/lang.php338
-rw-r--r--wiki/inc/lang/el/locked.txt5
-rw-r--r--wiki/inc/lang/el/login.txt5
-rw-r--r--wiki/inc/lang/el/mailtext.txt13
-rw-r--r--wiki/inc/lang/el/mailwrap.html13
-rw-r--r--wiki/inc/lang/el/newpage.txt4
-rw-r--r--wiki/inc/lang/el/norev.txt5
-rw-r--r--wiki/inc/lang/el/password.txt6
-rw-r--r--wiki/inc/lang/el/preview.txt5
-rw-r--r--wiki/inc/lang/el/pwconfirm.txt10
-rw-r--r--wiki/inc/lang/el/read.txt2
-rw-r--r--wiki/inc/lang/el/recent.txt3
-rw-r--r--wiki/inc/lang/el/register.txt5
-rw-r--r--wiki/inc/lang/el/registermail.txt10
-rw-r--r--wiki/inc/lang/el/resendpwd.txt6
-rw-r--r--wiki/inc/lang/el/resetpwd.txt3
-rw-r--r--wiki/inc/lang/el/revisions.txt8
-rw-r--r--wiki/inc/lang/el/searchpage.txt4
-rw-r--r--wiki/inc/lang/el/showrev.txt2
-rw-r--r--wiki/inc/lang/el/stopwords.txt103
-rw-r--r--wiki/inc/lang/el/subscr_digest.txt16
-rw-r--r--wiki/inc/lang/el/subscr_form.txt3
-rw-r--r--wiki/inc/lang/el/subscr_list.txt16
-rw-r--r--wiki/inc/lang/el/subscr_single.txt18
-rw-r--r--wiki/inc/lang/el/updateprofile.txt4
-rw-r--r--wiki/inc/lang/el/uploadmail.txt11
-rw-r--r--wiki/inc/lang/en/admin.txt4
-rw-r--r--wiki/inc/lang/en/adminplugins.txt2
-rw-r--r--wiki/inc/lang/en/backlinks.txt4
-rw-r--r--wiki/inc/lang/en/conflict.txt6
-rw-r--r--wiki/inc/lang/en/denied.txt4
-rw-r--r--wiki/inc/lang/en/diff.txt4
-rw-r--r--wiki/inc/lang/en/draft.txt6
-rw-r--r--wiki/inc/lang/en/edit.txt2
-rw-r--r--wiki/inc/lang/en/editrev.txt2
-rw-r--r--wiki/inc/lang/en/index.txt4
-rw-r--r--wiki/inc/lang/en/install.html24
-rw-r--r--wiki/inc/lang/en/lang.php389
-rw-r--r--wiki/inc/lang/en/locked.txt3
-rw-r--r--wiki/inc/lang/en/login.txt4
-rw-r--r--wiki/inc/lang/en/mailtext.txt12
-rw-r--r--wiki/inc/lang/en/mailwrap.html13
-rw-r--r--wiki/inc/lang/en/newpage.txt4
-rw-r--r--wiki/inc/lang/en/norev.txt4
-rw-r--r--wiki/inc/lang/en/password.txt6
-rw-r--r--wiki/inc/lang/en/preview.txt4
-rw-r--r--wiki/inc/lang/en/pwconfirm.txt11
-rw-r--r--wiki/inc/lang/en/read.txt2
-rw-r--r--wiki/inc/lang/en/recent.txt5
-rw-r--r--wiki/inc/lang/en/register.txt4
-rw-r--r--wiki/inc/lang/en/registermail.txt10
-rw-r--r--wiki/inc/lang/en/resendpwd.txt4
-rw-r--r--wiki/inc/lang/en/resetpwd.txt4
-rw-r--r--wiki/inc/lang/en/revisions.txt4
-rw-r--r--wiki/inc/lang/en/searchpage.txt4
-rw-r--r--wiki/inc/lang/en/showrev.txt2
-rw-r--r--wiki/inc/lang/en/stopwords.txt39
-rw-r--r--wiki/inc/lang/en/subscr_digest.txt16
-rw-r--r--wiki/inc/lang/en/subscr_form.txt3
-rw-r--r--wiki/inc/lang/en/subscr_list.txt13
-rw-r--r--wiki/inc/lang/en/subscr_single.txt19
-rw-r--r--wiki/inc/lang/en/updateprofile.txt5
-rw-r--r--wiki/inc/lang/en/uploadmail.txt11
-rw-r--r--wiki/inc/lang/eo/admin.txt3
-rw-r--r--wiki/inc/lang/eo/adminplugins.txt1
-rw-r--r--wiki/inc/lang/eo/backlinks.txt3
-rw-r--r--wiki/inc/lang/eo/conflict.txt5
-rw-r--r--wiki/inc/lang/eo/denied.txt4
-rw-r--r--wiki/inc/lang/eo/diff.txt4
-rw-r--r--wiki/inc/lang/eo/draft.txt5
-rw-r--r--wiki/inc/lang/eo/edit.txt1
-rw-r--r--wiki/inc/lang/eo/editrev.txt2
-rw-r--r--wiki/inc/lang/eo/index.txt3
-rw-r--r--wiki/inc/lang/eo/install.html9
-rw-r--r--wiki/inc/lang/eo/jquery.ui.datepicker.js37
-rw-r--r--wiki/inc/lang/eo/lang.php340
-rw-r--r--wiki/inc/lang/eo/locked.txt3
-rw-r--r--wiki/inc/lang/eo/login.txt3
-rw-r--r--wiki/inc/lang/eo/mailtext.txt12
-rw-r--r--wiki/inc/lang/eo/mailwrap.html13
-rw-r--r--wiki/inc/lang/eo/newpage.txt4
-rw-r--r--wiki/inc/lang/eo/norev.txt3
-rw-r--r--wiki/inc/lang/eo/password.txt6
-rw-r--r--wiki/inc/lang/eo/preview.txt3
-rw-r--r--wiki/inc/lang/eo/pwconfirm.txt10
-rw-r--r--wiki/inc/lang/eo/read.txt2
-rw-r--r--wiki/inc/lang/eo/recent.txt3
-rw-r--r--wiki/inc/lang/eo/register.txt4
-rw-r--r--wiki/inc/lang/eo/registermail.txt10
-rw-r--r--wiki/inc/lang/eo/resendpwd.txt3
-rw-r--r--wiki/inc/lang/eo/resetpwd.txt4
-rw-r--r--wiki/inc/lang/eo/revisions.txt3
-rw-r--r--wiki/inc/lang/eo/searchpage.txt4
-rw-r--r--wiki/inc/lang/eo/showrev.txt2
-rw-r--r--wiki/inc/lang/eo/stopwords.txt20
-rw-r--r--wiki/inc/lang/eo/subscr_digest.txt16
-rw-r--r--wiki/inc/lang/eo/subscr_form.txt3
-rw-r--r--wiki/inc/lang/eo/subscr_list.txt13
-rw-r--r--wiki/inc/lang/eo/subscr_single.txt19
-rw-r--r--wiki/inc/lang/eo/updateprofile.txt3
-rw-r--r--wiki/inc/lang/eo/uploadmail.txt10
-rw-r--r--wiki/inc/lang/es/admin.txt3
-rw-r--r--wiki/inc/lang/es/adminplugins.txt1
-rw-r--r--wiki/inc/lang/es/backlinks.txt4
-rw-r--r--wiki/inc/lang/es/conflict.txt5
-rw-r--r--wiki/inc/lang/es/denied.txt4
-rw-r--r--wiki/inc/lang/es/diff.txt4
-rw-r--r--wiki/inc/lang/es/draft.txt6
-rw-r--r--wiki/inc/lang/es/edit.txt2
-rw-r--r--wiki/inc/lang/es/editrev.txt2
-rw-r--r--wiki/inc/lang/es/index.txt4
-rw-r--r--wiki/inc/lang/es/install.html14
-rw-r--r--wiki/inc/lang/es/jquery.ui.datepicker.js37
-rw-r--r--wiki/inc/lang/es/lang.php395
-rw-r--r--wiki/inc/lang/es/locked.txt3
-rw-r--r--wiki/inc/lang/es/login.txt3
-rw-r--r--wiki/inc/lang/es/mailtext.txt12
-rw-r--r--wiki/inc/lang/es/mailwrap.html13
-rw-r--r--wiki/inc/lang/es/newpage.txt3
-rw-r--r--wiki/inc/lang/es/norev.txt4
-rw-r--r--wiki/inc/lang/es/password.txt6
-rw-r--r--wiki/inc/lang/es/preview.txt4
-rw-r--r--wiki/inc/lang/es/pwconfirm.txt11
-rw-r--r--wiki/inc/lang/es/read.txt1
-rw-r--r--wiki/inc/lang/es/recent.txt5
-rw-r--r--wiki/inc/lang/es/register.txt3
-rw-r--r--wiki/inc/lang/es/registermail.txt10
-rw-r--r--wiki/inc/lang/es/resendpwd.txt3
-rw-r--r--wiki/inc/lang/es/resetpwd.txt3
-rw-r--r--wiki/inc/lang/es/revisions.txt4
-rw-r--r--wiki/inc/lang/es/searchpage.txt4
-rw-r--r--wiki/inc/lang/es/showrev.txt2
-rw-r--r--wiki/inc/lang/es/stopwords.txt171
-rw-r--r--wiki/inc/lang/es/subscr_digest.txt16
-rw-r--r--wiki/inc/lang/es/subscr_form.txt3
-rw-r--r--wiki/inc/lang/es/subscr_list.txt13
-rw-r--r--wiki/inc/lang/es/subscr_single.txt19
-rw-r--r--wiki/inc/lang/es/updateprofile.txt3
-rw-r--r--wiki/inc/lang/es/uploadmail.txt11
-rw-r--r--wiki/inc/lang/et/admin.txt4
-rw-r--r--wiki/inc/lang/et/adminplugins.txt1
-rw-r--r--wiki/inc/lang/et/backlinks.txt4
-rw-r--r--wiki/inc/lang/et/conflict.txt6
-rw-r--r--wiki/inc/lang/et/denied.txt4
-rw-r--r--wiki/inc/lang/et/diff.txt4
-rw-r--r--wiki/inc/lang/et/draft.txt6
-rw-r--r--wiki/inc/lang/et/edit.txt2
-rw-r--r--wiki/inc/lang/et/editrev.txt3
-rw-r--r--wiki/inc/lang/et/index.txt3
-rw-r--r--wiki/inc/lang/et/jquery.ui.datepicker.js45
-rw-r--r--wiki/inc/lang/et/lang.php336
-rw-r--r--wiki/inc/lang/et/locked.txt3
-rw-r--r--wiki/inc/lang/et/login.txt3
-rw-r--r--wiki/inc/lang/et/mailtext.txt12
-rw-r--r--wiki/inc/lang/et/newpage.txt3
-rw-r--r--wiki/inc/lang/et/norev.txt4
-rw-r--r--wiki/inc/lang/et/password.txt6
-rw-r--r--wiki/inc/lang/et/preview.txt3
-rw-r--r--wiki/inc/lang/et/pwconfirm.txt8
-rw-r--r--wiki/inc/lang/et/read.txt2
-rw-r--r--wiki/inc/lang/et/recent.txt5
-rw-r--r--wiki/inc/lang/et/register.txt4
-rw-r--r--wiki/inc/lang/et/registermail.txt10
-rw-r--r--wiki/inc/lang/et/resendpwd.txt4
-rw-r--r--wiki/inc/lang/et/resetpwd.txt3
-rw-r--r--wiki/inc/lang/et/revisions.txt4
-rw-r--r--wiki/inc/lang/et/searchpage.txt4
-rw-r--r--wiki/inc/lang/et/showrev.txt2
-rw-r--r--wiki/inc/lang/et/stopwords.txt15
-rw-r--r--wiki/inc/lang/et/subscr_digest.txt17
-rw-r--r--wiki/inc/lang/et/subscr_form.txt3
-rw-r--r--wiki/inc/lang/et/subscr_list.txt15
-rw-r--r--wiki/inc/lang/et/subscr_single.txt19
-rw-r--r--wiki/inc/lang/et/updateprofile.txt5
-rw-r--r--wiki/inc/lang/et/uploadmail.txt12
-rw-r--r--wiki/inc/lang/eu/admin.txt3
-rw-r--r--wiki/inc/lang/eu/adminplugins.txt1
-rw-r--r--wiki/inc/lang/eu/backlinks.txt3
-rw-r--r--wiki/inc/lang/eu/conflict.txt5
-rw-r--r--wiki/inc/lang/eu/denied.txt4
-rw-r--r--wiki/inc/lang/eu/diff.txt4
-rw-r--r--wiki/inc/lang/eu/draft.txt5
-rw-r--r--wiki/inc/lang/eu/edit.txt1
-rw-r--r--wiki/inc/lang/eu/editrev.txt2
-rw-r--r--wiki/inc/lang/eu/index.txt4
-rw-r--r--wiki/inc/lang/eu/install.html9
-rw-r--r--wiki/inc/lang/eu/jquery.ui.datepicker.js36
-rw-r--r--wiki/inc/lang/eu/lang.php339
-rw-r--r--wiki/inc/lang/eu/locked.txt3
-rw-r--r--wiki/inc/lang/eu/login.txt4
-rw-r--r--wiki/inc/lang/eu/mailtext.txt12
-rw-r--r--wiki/inc/lang/eu/mailwrap.html13
-rw-r--r--wiki/inc/lang/eu/newpage.txt3
-rw-r--r--wiki/inc/lang/eu/norev.txt3
-rw-r--r--wiki/inc/lang/eu/password.txt6
-rw-r--r--wiki/inc/lang/eu/preview.txt3
-rw-r--r--wiki/inc/lang/eu/pwconfirm.txt9
-rw-r--r--wiki/inc/lang/eu/read.txt1
-rw-r--r--wiki/inc/lang/eu/recent.txt3
-rw-r--r--wiki/inc/lang/eu/register.txt3
-rw-r--r--wiki/inc/lang/eu/registermail.txt10
-rw-r--r--wiki/inc/lang/eu/resendpwd.txt3
-rw-r--r--wiki/inc/lang/eu/resetpwd.txt3
-rw-r--r--wiki/inc/lang/eu/revisions.txt3
-rw-r--r--wiki/inc/lang/eu/searchpage.txt4
-rw-r--r--wiki/inc/lang/eu/showrev.txt2
-rw-r--r--wiki/inc/lang/eu/stopwords.txt26
-rw-r--r--wiki/inc/lang/eu/subscr_digest.txt16
-rw-r--r--wiki/inc/lang/eu/subscr_form.txt3
-rw-r--r--wiki/inc/lang/eu/subscr_list.txt13
-rw-r--r--wiki/inc/lang/eu/subscr_single.txt19
-rw-r--r--wiki/inc/lang/eu/updateprofile.txt3
-rw-r--r--wiki/inc/lang/eu/uploadmail.txt10
-rw-r--r--wiki/inc/lang/fa/admin.txt3
-rw-r--r--wiki/inc/lang/fa/adminplugins.txt1
-rw-r--r--wiki/inc/lang/fa/backlinks.txt3
-rw-r--r--wiki/inc/lang/fa/conflict.txt5
-rw-r--r--wiki/inc/lang/fa/denied.txt4
-rw-r--r--wiki/inc/lang/fa/diff.txt3
-rw-r--r--wiki/inc/lang/fa/draft.txt5
-rw-r--r--wiki/inc/lang/fa/edit.txt1
-rw-r--r--wiki/inc/lang/fa/editrev.txt2
-rw-r--r--wiki/inc/lang/fa/index.txt3
-rw-r--r--wiki/inc/lang/fa/install.html12
-rw-r--r--wiki/inc/lang/fa/jquery.ui.datepicker.js73
-rw-r--r--wiki/inc/lang/fa/lang.php353
-rw-r--r--wiki/inc/lang/fa/locked.txt3
-rw-r--r--wiki/inc/lang/fa/login.txt3
-rw-r--r--wiki/inc/lang/fa/mailtext.txt12
-rw-r--r--wiki/inc/lang/fa/mailwrap.html13
-rw-r--r--wiki/inc/lang/fa/newpage.txt3
-rw-r--r--wiki/inc/lang/fa/norev.txt3
-rw-r--r--wiki/inc/lang/fa/password.txt6
-rw-r--r--wiki/inc/lang/fa/preview.txt3
-rw-r--r--wiki/inc/lang/fa/pwconfirm.txt9
-rw-r--r--wiki/inc/lang/fa/read.txt1
-rw-r--r--wiki/inc/lang/fa/recent.txt3
-rw-r--r--wiki/inc/lang/fa/register.txt3
-rw-r--r--wiki/inc/lang/fa/registermail.txt10
-rw-r--r--wiki/inc/lang/fa/resendpwd.txt3
-rw-r--r--wiki/inc/lang/fa/resetpwd.txt3
-rw-r--r--wiki/inc/lang/fa/revisions.txt3
-rw-r--r--wiki/inc/lang/fa/searchpage.txt4
-rw-r--r--wiki/inc/lang/fa/showrev.txt2
-rw-r--r--wiki/inc/lang/fa/stopwords.txt445
-rw-r--r--wiki/inc/lang/fa/subscr_digest.txt13
-rw-r--r--wiki/inc/lang/fa/subscr_form.txt3
-rw-r--r--wiki/inc/lang/fa/subscr_list.txt13
-rw-r--r--wiki/inc/lang/fa/subscr_single.txt16
-rw-r--r--wiki/inc/lang/fa/updateprofile.txt3
-rw-r--r--wiki/inc/lang/fa/uploadmail.txt10
-rw-r--r--wiki/inc/lang/fi/admin.txt3
-rw-r--r--wiki/inc/lang/fi/adminplugins.txt1
-rw-r--r--wiki/inc/lang/fi/backlinks.txt4
-rw-r--r--wiki/inc/lang/fi/conflict.txt5
-rw-r--r--wiki/inc/lang/fi/denied.txt4
-rw-r--r--wiki/inc/lang/fi/diff.txt3
-rw-r--r--wiki/inc/lang/fi/draft.txt5
-rw-r--r--wiki/inc/lang/fi/edit.txt1
-rw-r--r--wiki/inc/lang/fi/editrev.txt2
-rw-r--r--wiki/inc/lang/fi/index.txt3
-rw-r--r--wiki/inc/lang/fi/install.html21
-rw-r--r--wiki/inc/lang/fi/jquery.ui.datepicker.js37
-rw-r--r--wiki/inc/lang/fi/lang.php342
-rw-r--r--wiki/inc/lang/fi/locked.txt3
-rw-r--r--wiki/inc/lang/fi/login.txt3
-rw-r--r--wiki/inc/lang/fi/mailtext.txt12
-rw-r--r--wiki/inc/lang/fi/mailwrap.html13
-rw-r--r--wiki/inc/lang/fi/newpage.txt3
-rw-r--r--wiki/inc/lang/fi/norev.txt3
-rw-r--r--wiki/inc/lang/fi/password.txt6
-rw-r--r--wiki/inc/lang/fi/preview.txt3
-rw-r--r--wiki/inc/lang/fi/pwconfirm.txt9
-rw-r--r--wiki/inc/lang/fi/read.txt1
-rw-r--r--wiki/inc/lang/fi/recent.txt4
-rw-r--r--wiki/inc/lang/fi/register.txt3
-rw-r--r--wiki/inc/lang/fi/registermail.txt10
-rw-r--r--wiki/inc/lang/fi/resendpwd.txt3
-rw-r--r--wiki/inc/lang/fi/resetpwd.txt3
-rw-r--r--wiki/inc/lang/fi/revisions.txt3
-rw-r--r--wiki/inc/lang/fi/searchpage.txt4
-rw-r--r--wiki/inc/lang/fi/showrev.txt2
-rw-r--r--wiki/inc/lang/fi/stopwords.txt11
-rw-r--r--wiki/inc/lang/fi/subscr_digest.txt16
-rw-r--r--wiki/inc/lang/fi/subscr_form.txt3
-rw-r--r--wiki/inc/lang/fi/subscr_list.txt13
-rw-r--r--wiki/inc/lang/fi/subscr_single.txt19
-rw-r--r--wiki/inc/lang/fi/updateprofile.txt3
-rw-r--r--wiki/inc/lang/fi/uploadmail.txt10
-rw-r--r--wiki/inc/lang/fo/admin.txt4
-rw-r--r--wiki/inc/lang/fo/backlinks.txt4
-rw-r--r--wiki/inc/lang/fo/conflict.txt5
-rw-r--r--wiki/inc/lang/fo/denied.txt4
-rw-r--r--wiki/inc/lang/fo/diff.txt4
-rw-r--r--wiki/inc/lang/fo/edit.txt2
-rw-r--r--wiki/inc/lang/fo/editrev.txt2
-rw-r--r--wiki/inc/lang/fo/index.txt3
-rw-r--r--wiki/inc/lang/fo/jquery.ui.datepicker.js45
-rw-r--r--wiki/inc/lang/fo/lang.php170
-rw-r--r--wiki/inc/lang/fo/locked.txt3
-rw-r--r--wiki/inc/lang/fo/login.txt3
-rw-r--r--wiki/inc/lang/fo/mailtext.txt12
-rw-r--r--wiki/inc/lang/fo/newpage.txt3
-rw-r--r--wiki/inc/lang/fo/norev.txt4
-rw-r--r--wiki/inc/lang/fo/password.txt6
-rw-r--r--wiki/inc/lang/fo/preview.txt4
-rw-r--r--wiki/inc/lang/fo/read.txt2
-rw-r--r--wiki/inc/lang/fo/recent.txt5
-rw-r--r--wiki/inc/lang/fo/register.txt4
-rw-r--r--wiki/inc/lang/fo/resendpwd.txt3
-rw-r--r--wiki/inc/lang/fo/revisions.txt3
-rw-r--r--wiki/inc/lang/fo/searchpage.txt4
-rw-r--r--wiki/inc/lang/fo/showrev.txt2
-rw-r--r--wiki/inc/lang/fo/stopwords.txt87
-rw-r--r--wiki/inc/lang/fo/subscr_digest.txt16
-rw-r--r--wiki/inc/lang/fo/updateprofile.txt3
-rw-r--r--wiki/inc/lang/fr/admin.txt3
-rw-r--r--wiki/inc/lang/fr/adminplugins.txt1
-rw-r--r--wiki/inc/lang/fr/backlinks.txt4
-rw-r--r--wiki/inc/lang/fr/conflict.txt6
-rw-r--r--wiki/inc/lang/fr/denied.txt4
-rw-r--r--wiki/inc/lang/fr/diff.txt4
-rw-r--r--wiki/inc/lang/fr/draft.txt6
-rw-r--r--wiki/inc/lang/fr/edit.txt2
-rw-r--r--wiki/inc/lang/fr/editrev.txt2
-rw-r--r--wiki/inc/lang/fr/index.txt4
-rw-r--r--wiki/inc/lang/fr/install.html13
-rw-r--r--wiki/inc/lang/fr/jquery.ui.datepicker.js39
-rw-r--r--wiki/inc/lang/fr/lang.php389
-rw-r--r--wiki/inc/lang/fr/locked.txt3
-rw-r--r--wiki/inc/lang/fr/login.txt3
-rw-r--r--wiki/inc/lang/fr/mailtext.txt13
-rw-r--r--wiki/inc/lang/fr/mailwrap.html13
-rw-r--r--wiki/inc/lang/fr/newpage.txt4
-rw-r--r--wiki/inc/lang/fr/norev.txt4
-rw-r--r--wiki/inc/lang/fr/password.txt6
-rw-r--r--wiki/inc/lang/fr/preview.txt4
-rw-r--r--wiki/inc/lang/fr/pwconfirm.txt11
-rw-r--r--wiki/inc/lang/fr/read.txt2
-rw-r--r--wiki/inc/lang/fr/recent.txt5
-rw-r--r--wiki/inc/lang/fr/register.txt3
-rw-r--r--wiki/inc/lang/fr/registermail.txt10
-rw-r--r--wiki/inc/lang/fr/resendpwd.txt4
-rw-r--r--wiki/inc/lang/fr/resetpwd.txt3
-rw-r--r--wiki/inc/lang/fr/revisions.txt4
-rw-r--r--wiki/inc/lang/fr/searchpage.txt4
-rw-r--r--wiki/inc/lang/fr/showrev.txt2
-rw-r--r--wiki/inc/lang/fr/stopwords.txt112
-rw-r--r--wiki/inc/lang/fr/subscr_digest.txt15
-rw-r--r--wiki/inc/lang/fr/subscr_form.txt3
-rw-r--r--wiki/inc/lang/fr/subscr_list.txt12
-rw-r--r--wiki/inc/lang/fr/subscr_single.txt18
-rw-r--r--wiki/inc/lang/fr/updateprofile.txt5
-rw-r--r--wiki/inc/lang/fr/uploadmail.txt10
-rw-r--r--wiki/inc/lang/gl/admin.txt4
-rw-r--r--wiki/inc/lang/gl/adminplugins.txt1
-rw-r--r--wiki/inc/lang/gl/backlinks.txt4
-rw-r--r--wiki/inc/lang/gl/conflict.txt6
-rw-r--r--wiki/inc/lang/gl/denied.txt4
-rw-r--r--wiki/inc/lang/gl/diff.txt4
-rw-r--r--wiki/inc/lang/gl/draft.txt6
-rw-r--r--wiki/inc/lang/gl/edit.txt2
-rw-r--r--wiki/inc/lang/gl/editrev.txt2
-rw-r--r--wiki/inc/lang/gl/index.txt4
-rw-r--r--wiki/inc/lang/gl/install.html25
-rw-r--r--wiki/inc/lang/gl/jquery.ui.datepicker.js37
-rw-r--r--wiki/inc/lang/gl/lang.php318
-rw-r--r--wiki/inc/lang/gl/locked.txt3
-rw-r--r--wiki/inc/lang/gl/login.txt4
-rw-r--r--wiki/inc/lang/gl/mailtext.txt12
-rw-r--r--wiki/inc/lang/gl/mailwrap.html13
-rw-r--r--wiki/inc/lang/gl/newpage.txt4
-rw-r--r--wiki/inc/lang/gl/norev.txt4
-rw-r--r--wiki/inc/lang/gl/password.txt6
-rw-r--r--wiki/inc/lang/gl/preview.txt4
-rw-r--r--wiki/inc/lang/gl/pwconfirm.txt11
-rw-r--r--wiki/inc/lang/gl/read.txt2
-rw-r--r--wiki/inc/lang/gl/recent.txt5
-rw-r--r--wiki/inc/lang/gl/register.txt4
-rw-r--r--wiki/inc/lang/gl/registermail.txt10
-rw-r--r--wiki/inc/lang/gl/resendpwd.txt3
-rw-r--r--wiki/inc/lang/gl/resetpwd.txt3
-rw-r--r--wiki/inc/lang/gl/revisions.txt4
-rw-r--r--wiki/inc/lang/gl/searchpage.txt4
-rw-r--r--wiki/inc/lang/gl/showrev.txt2
-rw-r--r--wiki/inc/lang/gl/stopwords.txt692
-rw-r--r--wiki/inc/lang/gl/subscr_digest.txt16
-rw-r--r--wiki/inc/lang/gl/subscr_form.txt3
-rw-r--r--wiki/inc/lang/gl/subscr_list.txt13
-rw-r--r--wiki/inc/lang/gl/subscr_single.txt19
-rw-r--r--wiki/inc/lang/gl/updateprofile.txt5
-rw-r--r--wiki/inc/lang/gl/uploadmail.txt10
-rw-r--r--wiki/inc/lang/gl/wordblock.txt4
-rw-r--r--wiki/inc/lang/he/admin.txt4
-rw-r--r--wiki/inc/lang/he/adminplugins.txt1
-rw-r--r--wiki/inc/lang/he/backlinks.txt3
-rw-r--r--wiki/inc/lang/he/conflict.txt6
-rw-r--r--wiki/inc/lang/he/denied.txt4
-rw-r--r--wiki/inc/lang/he/diff.txt4
-rw-r--r--wiki/inc/lang/he/draft.txt5
-rw-r--r--wiki/inc/lang/he/edit.txt1
-rw-r--r--wiki/inc/lang/he/editrev.txt2
-rw-r--r--wiki/inc/lang/he/index.txt4
-rw-r--r--wiki/inc/lang/he/install.html13
-rw-r--r--wiki/inc/lang/he/jquery.ui.datepicker.js37
-rw-r--r--wiki/inc/lang/he/lang.php353
-rw-r--r--wiki/inc/lang/he/locked.txt3
-rw-r--r--wiki/inc/lang/he/login.txt3
-rw-r--r--wiki/inc/lang/he/mailtext.txt12
-rw-r--r--wiki/inc/lang/he/newpage.txt3
-rw-r--r--wiki/inc/lang/he/norev.txt4
-rw-r--r--wiki/inc/lang/he/password.txt6
-rw-r--r--wiki/inc/lang/he/preview.txt4
-rw-r--r--wiki/inc/lang/he/pwconfirm.txt9
-rw-r--r--wiki/inc/lang/he/read.txt2
-rw-r--r--wiki/inc/lang/he/recent.txt5
-rw-r--r--wiki/inc/lang/he/register.txt3
-rw-r--r--wiki/inc/lang/he/registermail.txt10
-rw-r--r--wiki/inc/lang/he/resendpwd.txt4
-rw-r--r--wiki/inc/lang/he/resetpwd.txt3
-rw-r--r--wiki/inc/lang/he/revisions.txt4
-rw-r--r--wiki/inc/lang/he/searchpage.txt4
-rw-r--r--wiki/inc/lang/he/showrev.txt2
-rw-r--r--wiki/inc/lang/he/stopwords.txt29
-rw-r--r--wiki/inc/lang/he/subscr_digest.txt16
-rw-r--r--wiki/inc/lang/he/subscr_single.txt18
-rw-r--r--wiki/inc/lang/he/updateprofile.txt5
-rw-r--r--wiki/inc/lang/he/uploadmail.txt10
-rw-r--r--wiki/inc/lang/hi/diff.txt3
-rw-r--r--wiki/inc/lang/hi/jquery.ui.datepicker.js37
-rw-r--r--wiki/inc/lang/hi/lang.php116
-rw-r--r--wiki/inc/lang/hr/admin.txt3
-rw-r--r--wiki/inc/lang/hr/adminplugins.txt1
-rw-r--r--wiki/inc/lang/hr/backlinks.txt3
-rw-r--r--wiki/inc/lang/hr/conflict.txt5
-rw-r--r--wiki/inc/lang/hr/denied.txt4
-rw-r--r--wiki/inc/lang/hr/diff.txt3
-rw-r--r--wiki/inc/lang/hr/draft.txt4
-rw-r--r--wiki/inc/lang/hr/edit.txt1
-rw-r--r--wiki/inc/lang/hr/editrev.txt2
-rw-r--r--wiki/inc/lang/hr/index.txt3
-rw-r--r--wiki/inc/lang/hr/jquery.ui.datepicker.js37
-rw-r--r--wiki/inc/lang/hr/lang.php359
-rw-r--r--wiki/inc/lang/hr/locked.txt3
-rw-r--r--wiki/inc/lang/hr/login.txt3
-rw-r--r--wiki/inc/lang/hr/mailtext.txt12
-rw-r--r--wiki/inc/lang/hr/newpage.txt3
-rw-r--r--wiki/inc/lang/hr/norev.txt3
-rw-r--r--wiki/inc/lang/hr/password.txt6
-rw-r--r--wiki/inc/lang/hr/preview.txt3
-rw-r--r--wiki/inc/lang/hr/pwconfirm.txt9
-rw-r--r--wiki/inc/lang/hr/read.txt1
-rw-r--r--wiki/inc/lang/hr/recent.txt3
-rw-r--r--wiki/inc/lang/hr/register.txt3
-rw-r--r--wiki/inc/lang/hr/registermail.txt10
-rw-r--r--wiki/inc/lang/hr/resendpwd.txt3
-rw-r--r--wiki/inc/lang/hr/resetpwd.txt3
-rw-r--r--wiki/inc/lang/hr/revisions.txt3
-rw-r--r--wiki/inc/lang/hr/searchpage.txt4
-rw-r--r--wiki/inc/lang/hr/showrev.txt2
-rw-r--r--wiki/inc/lang/hr/stopwords.txt29
-rw-r--r--wiki/inc/lang/hr/subscr_digest.txt15
-rw-r--r--wiki/inc/lang/hr/subscr_form.txt3
-rw-r--r--wiki/inc/lang/hr/subscr_list.txt11
-rw-r--r--wiki/inc/lang/hr/subscr_single.txt18
-rw-r--r--wiki/inc/lang/hr/updateprofile.txt3
-rw-r--r--wiki/inc/lang/hr/uploadmail.txt11
-rw-r--r--wiki/inc/lang/hu-formal/admin.txt3
-rw-r--r--wiki/inc/lang/hu-formal/adminplugins.txt1
-rw-r--r--wiki/inc/lang/hu-formal/backlinks.txt3
-rw-r--r--wiki/inc/lang/hu-formal/conflict.txt5
-rw-r--r--wiki/inc/lang/hu-formal/denied.txt4
-rw-r--r--wiki/inc/lang/hu-formal/diff.txt3
-rw-r--r--wiki/inc/lang/hu-formal/draft.txt5
-rw-r--r--wiki/inc/lang/hu-formal/edit.txt1
-rw-r--r--wiki/inc/lang/hu-formal/editrev.txt2
-rw-r--r--wiki/inc/lang/hu-formal/index.txt3
-rw-r--r--wiki/inc/lang/hu-formal/lang.php29
-rw-r--r--wiki/inc/lang/hu/admin.txt3
-rw-r--r--wiki/inc/lang/hu/adminplugins.txt1
-rw-r--r--wiki/inc/lang/hu/backlinks.txt5
-rw-r--r--wiki/inc/lang/hu/conflict.txt7
-rw-r--r--wiki/inc/lang/hu/denied.txt4
-rw-r--r--wiki/inc/lang/hu/diff.txt4
-rw-r--r--wiki/inc/lang/hu/draft.txt5
-rw-r--r--wiki/inc/lang/hu/edit.txt1
-rw-r--r--wiki/inc/lang/hu/editrev.txt2
-rw-r--r--wiki/inc/lang/hu/index.txt4
-rw-r--r--wiki/inc/lang/hu/install.html26
-rw-r--r--wiki/inc/lang/hu/jquery.ui.datepicker.js36
-rw-r--r--wiki/inc/lang/hu/lang.php350
-rw-r--r--wiki/inc/lang/hu/locked.txt4
-rw-r--r--wiki/inc/lang/hu/login.txt5
-rw-r--r--wiki/inc/lang/hu/mailtext.txt12
-rw-r--r--wiki/inc/lang/hu/mailwrap.html13
-rw-r--r--wiki/inc/lang/hu/newpage.txt3
-rw-r--r--wiki/inc/lang/hu/norev.txt5
-rw-r--r--wiki/inc/lang/hu/password.txt6
-rw-r--r--wiki/inc/lang/hu/preview.txt3
-rw-r--r--wiki/inc/lang/hu/pwconfirm.txt11
-rw-r--r--wiki/inc/lang/hu/read.txt1
-rw-r--r--wiki/inc/lang/hu/recent.txt5
-rw-r--r--wiki/inc/lang/hu/register.txt4
-rw-r--r--wiki/inc/lang/hu/registermail.txt10
-rw-r--r--wiki/inc/lang/hu/resendpwd.txt3
-rw-r--r--wiki/inc/lang/hu/resetpwd.txt3
-rw-r--r--wiki/inc/lang/hu/revisions.txt3
-rw-r--r--wiki/inc/lang/hu/searchpage.txt4
-rw-r--r--wiki/inc/lang/hu/showrev.txt2
-rw-r--r--wiki/inc/lang/hu/stopwords.txt39
-rw-r--r--wiki/inc/lang/hu/subscr_digest.txt13
-rw-r--r--wiki/inc/lang/hu/subscr_form.txt3
-rw-r--r--wiki/inc/lang/hu/subscr_list.txt10
-rw-r--r--wiki/inc/lang/hu/subscr_single.txt16
-rw-r--r--wiki/inc/lang/hu/updateprofile.txt3
-rw-r--r--wiki/inc/lang/hu/uploadmail.txt10
-rw-r--r--wiki/inc/lang/ia/admin.txt3
-rw-r--r--wiki/inc/lang/ia/adminplugins.txt1
-rw-r--r--wiki/inc/lang/ia/backlinks.txt3
-rw-r--r--wiki/inc/lang/ia/conflict.txt5
-rw-r--r--wiki/inc/lang/ia/denied.txt4
-rw-r--r--wiki/inc/lang/ia/diff.txt3
-rw-r--r--wiki/inc/lang/ia/draft.txt5
-rw-r--r--wiki/inc/lang/ia/edit.txt1
-rw-r--r--wiki/inc/lang/ia/editrev.txt2
-rw-r--r--wiki/inc/lang/ia/index.txt3
-rw-r--r--wiki/inc/lang/ia/install.html13
-rw-r--r--wiki/inc/lang/ia/lang.php261
-rw-r--r--wiki/inc/lang/ia/locked.txt3
-rw-r--r--wiki/inc/lang/ia/login.txt3
-rw-r--r--wiki/inc/lang/ia/mailtext.txt12
-rw-r--r--wiki/inc/lang/ia/newpage.txt3
-rw-r--r--wiki/inc/lang/ia/norev.txt3
-rw-r--r--wiki/inc/lang/ia/password.txt6
-rw-r--r--wiki/inc/lang/ia/preview.txt3
-rw-r--r--wiki/inc/lang/ia/pwconfirm.txt10
-rw-r--r--wiki/inc/lang/ia/read.txt1
-rw-r--r--wiki/inc/lang/ia/recent.txt3
-rw-r--r--wiki/inc/lang/ia/register.txt3
-rw-r--r--wiki/inc/lang/ia/registermail.txt10
-rw-r--r--wiki/inc/lang/ia/resendpwd.txt3
-rw-r--r--wiki/inc/lang/ia/revisions.txt3
-rw-r--r--wiki/inc/lang/ia/searchpage.txt4
-rw-r--r--wiki/inc/lang/ia/showrev.txt2
-rw-r--r--wiki/inc/lang/ia/stopwords.txt38
-rw-r--r--wiki/inc/lang/ia/subscr_digest.txt16
-rw-r--r--wiki/inc/lang/ia/subscr_form.txt4
-rw-r--r--wiki/inc/lang/ia/subscr_list.txt13
-rw-r--r--wiki/inc/lang/ia/subscr_single.txt19
-rw-r--r--wiki/inc/lang/ia/updateprofile.txt3
-rw-r--r--wiki/inc/lang/ia/uploadmail.txt10
-rw-r--r--wiki/inc/lang/id-ni/lang.php76
-rw-r--r--wiki/inc/lang/id/admin.txt4
-rw-r--r--wiki/inc/lang/id/adminplugins.txt1
-rw-r--r--wiki/inc/lang/id/backlinks.txt3
-rw-r--r--wiki/inc/lang/id/conflict.txt6
-rw-r--r--wiki/inc/lang/id/denied.txt4
-rw-r--r--wiki/inc/lang/id/diff.txt4
-rw-r--r--wiki/inc/lang/id/draft.txt5
-rw-r--r--wiki/inc/lang/id/edit.txt2
-rw-r--r--wiki/inc/lang/id/editrev.txt2
-rw-r--r--wiki/inc/lang/id/index.txt4
-rw-r--r--wiki/inc/lang/id/install.html25
-rw-r--r--wiki/inc/lang/id/jquery.ui.datepicker.js37
-rw-r--r--wiki/inc/lang/id/lang.php312
-rw-r--r--wiki/inc/lang/id/locked.txt3
-rw-r--r--wiki/inc/lang/id/login.txt4
-rw-r--r--wiki/inc/lang/id/mailtext.txt12
-rw-r--r--wiki/inc/lang/id/newpage.txt3
-rw-r--r--wiki/inc/lang/id/norev.txt4
-rw-r--r--wiki/inc/lang/id/password.txt6
-rw-r--r--wiki/inc/lang/id/preview.txt4
-rw-r--r--wiki/inc/lang/id/pwconfirm.txt9
-rw-r--r--wiki/inc/lang/id/read.txt2
-rw-r--r--wiki/inc/lang/id/recent.txt5
-rw-r--r--wiki/inc/lang/id/register.txt4
-rw-r--r--wiki/inc/lang/id/registermail.txt10
-rw-r--r--wiki/inc/lang/id/resendpwd.txt3
-rw-r--r--wiki/inc/lang/id/resetpwd.txt3
-rw-r--r--wiki/inc/lang/id/revisions.txt4
-rw-r--r--wiki/inc/lang/id/searchpage.txt4
-rw-r--r--wiki/inc/lang/id/showrev.txt2
-rw-r--r--wiki/inc/lang/id/stopwords.txt37
-rw-r--r--wiki/inc/lang/id/subscr_digest.txt14
-rw-r--r--wiki/inc/lang/id/updateprofile.txt3
-rw-r--r--wiki/inc/lang/id/uploadmail.txt10
-rw-r--r--wiki/inc/lang/is/adminplugins.txt1
-rw-r--r--wiki/inc/lang/is/diff.txt3
-rw-r--r--wiki/inc/lang/is/jquery.ui.datepicker.js45
-rw-r--r--wiki/inc/lang/is/lang.php181
-rw-r--r--wiki/inc/lang/is/login.txt3
-rw-r--r--wiki/inc/lang/is/recent.txt3
-rw-r--r--wiki/inc/lang/is/resendpwd.txt3
-rw-r--r--wiki/inc/lang/it/admin.txt4
-rw-r--r--wiki/inc/lang/it/adminplugins.txt1
-rw-r--r--wiki/inc/lang/it/backlinks.txt4
-rw-r--r--wiki/inc/lang/it/conflict.txt6
-rw-r--r--wiki/inc/lang/it/denied.txt4
-rw-r--r--wiki/inc/lang/it/diff.txt4
-rw-r--r--wiki/inc/lang/it/draft.txt6
-rw-r--r--wiki/inc/lang/it/edit.txt2
-rw-r--r--wiki/inc/lang/it/editrev.txt2
-rw-r--r--wiki/inc/lang/it/index.txt4
-rw-r--r--wiki/inc/lang/it/install.html24
-rw-r--r--wiki/inc/lang/it/jquery.ui.datepicker.js37
-rw-r--r--wiki/inc/lang/it/lang.php370
-rw-r--r--wiki/inc/lang/it/locked.txt3
-rw-r--r--wiki/inc/lang/it/login.txt4
-rw-r--r--wiki/inc/lang/it/mailtext.txt12
-rw-r--r--wiki/inc/lang/it/mailwrap.html13
-rw-r--r--wiki/inc/lang/it/newpage.txt3
-rw-r--r--wiki/inc/lang/it/norev.txt3
-rw-r--r--wiki/inc/lang/it/password.txt6
-rw-r--r--wiki/inc/lang/it/preview.txt5
-rw-r--r--wiki/inc/lang/it/pwconfirm.txt11
-rw-r--r--wiki/inc/lang/it/read.txt1
-rw-r--r--wiki/inc/lang/it/recent.txt4
-rw-r--r--wiki/inc/lang/it/register.txt3
-rw-r--r--wiki/inc/lang/it/registermail.txt10
-rw-r--r--wiki/inc/lang/it/resendpwd.txt3
-rw-r--r--wiki/inc/lang/it/resetpwd.txt1
-rw-r--r--wiki/inc/lang/it/revisions.txt3
-rw-r--r--wiki/inc/lang/it/searchpage.txt4
-rw-r--r--wiki/inc/lang/it/showrev.txt2
-rw-r--r--wiki/inc/lang/it/stopwords.txt119
-rw-r--r--wiki/inc/lang/it/subscr_digest.txt16
-rw-r--r--wiki/inc/lang/it/subscr_form.txt3
-rw-r--r--wiki/inc/lang/it/subscr_list.txt14
-rw-r--r--wiki/inc/lang/it/subscr_single.txt20
-rw-r--r--wiki/inc/lang/it/updateprofile.txt3
-rw-r--r--wiki/inc/lang/it/uploadmail.txt10
-rw-r--r--wiki/inc/lang/ja/admin.txt4
-rw-r--r--wiki/inc/lang/ja/adminplugins.txt1
-rw-r--r--wiki/inc/lang/ja/backlinks.txt4
-rw-r--r--wiki/inc/lang/ja/conflict.txt6
-rw-r--r--wiki/inc/lang/ja/denied.txt4
-rw-r--r--wiki/inc/lang/ja/diff.txt4
-rw-r--r--wiki/inc/lang/ja/draft.txt6
-rw-r--r--wiki/inc/lang/ja/edit.txt4
-rw-r--r--wiki/inc/lang/ja/editrev.txt2
-rw-r--r--wiki/inc/lang/ja/index.txt4
-rw-r--r--wiki/inc/lang/ja/install.html14
-rw-r--r--wiki/inc/lang/ja/jquery.ui.datepicker.js37
-rw-r--r--wiki/inc/lang/ja/lang.php348
-rw-r--r--wiki/inc/lang/ja/locked.txt3
-rw-r--r--wiki/inc/lang/ja/login.txt4
-rw-r--r--wiki/inc/lang/ja/mailtext.txt12
-rw-r--r--wiki/inc/lang/ja/mailwrap.html13
-rw-r--r--wiki/inc/lang/ja/newpage.txt4
-rw-r--r--wiki/inc/lang/ja/norev.txt4
-rw-r--r--wiki/inc/lang/ja/password.txt6
-rw-r--r--wiki/inc/lang/ja/preview.txt4
-rw-r--r--wiki/inc/lang/ja/pwconfirm.txt9
-rw-r--r--wiki/inc/lang/ja/read.txt2
-rw-r--r--wiki/inc/lang/ja/recent.txt5
-rw-r--r--wiki/inc/lang/ja/register.txt4
-rw-r--r--wiki/inc/lang/ja/registermail.txt10
-rw-r--r--wiki/inc/lang/ja/resendpwd.txt4
-rw-r--r--wiki/inc/lang/ja/resetpwd.txt3
-rw-r--r--wiki/inc/lang/ja/revisions.txt4
-rw-r--r--wiki/inc/lang/ja/searchpage.txt4
-rw-r--r--wiki/inc/lang/ja/showrev.txt2
-rw-r--r--wiki/inc/lang/ja/stopwords.txt29
-rw-r--r--wiki/inc/lang/ja/subscr_digest.txt17
-rw-r--r--wiki/inc/lang/ja/subscr_form.txt3
-rw-r--r--wiki/inc/lang/ja/subscr_list.txt15
-rw-r--r--wiki/inc/lang/ja/subscr_single.txt20
-rw-r--r--wiki/inc/lang/ja/updateprofile.txt5
-rw-r--r--wiki/inc/lang/ja/uploadmail.txt10
-rw-r--r--wiki/inc/lang/ka/admin.txt4
-rw-r--r--wiki/inc/lang/ka/adminplugins.txt1
-rw-r--r--wiki/inc/lang/ka/backlinks.txt4
-rw-r--r--wiki/inc/lang/ka/conflict.txt5
-rw-r--r--wiki/inc/lang/ka/denied.txt3
-rw-r--r--wiki/inc/lang/ka/diff.txt3
-rw-r--r--wiki/inc/lang/ka/draft.txt3
-rw-r--r--wiki/inc/lang/ka/edit.txt2
-rw-r--r--wiki/inc/lang/ka/editrev.txt2
-rw-r--r--wiki/inc/lang/ka/index.txt1
-rw-r--r--wiki/inc/lang/ka/jquery.ui.datepicker.js48
-rw-r--r--wiki/inc/lang/ka/lang.php279
-rw-r--r--wiki/inc/lang/kk/jquery.ui.datepicker.js37
-rw-r--r--wiki/inc/lang/kk/lang.php129
-rw-r--r--wiki/inc/lang/km/admin.txt3
-rw-r--r--wiki/inc/lang/km/backlinks.txt5
-rw-r--r--wiki/inc/lang/km/conflict.txt3
-rw-r--r--wiki/inc/lang/km/denied.txt4
-rw-r--r--wiki/inc/lang/km/edit.txt3
-rw-r--r--wiki/inc/lang/km/editrev.txt2
-rw-r--r--wiki/inc/lang/km/index.txt2
-rw-r--r--wiki/inc/lang/km/jquery.ui.datepicker.js37
-rw-r--r--wiki/inc/lang/km/lang.php202
-rw-r--r--wiki/inc/lang/km/login.txt5
-rw-r--r--wiki/inc/lang/km/newpage.txt4
-rw-r--r--wiki/inc/lang/km/norev.txt2
-rw-r--r--wiki/inc/lang/km/password.txt6
-rw-r--r--wiki/inc/lang/km/pwconfirm.txt9
-rw-r--r--wiki/inc/lang/km/recent.txt3
-rw-r--r--wiki/inc/lang/km/register.txt7
-rw-r--r--wiki/inc/lang/km/revisions.txt4
-rw-r--r--wiki/inc/lang/kn/admin.txt2
-rw-r--r--wiki/inc/lang/kn/adminplugins.txt1
-rw-r--r--wiki/inc/lang/kn/backlinks.txt2
-rw-r--r--wiki/inc/lang/kn/conflict.txt4
-rw-r--r--wiki/inc/lang/ko/admin.txt3
-rw-r--r--wiki/inc/lang/ko/adminplugins.txt1
-rw-r--r--wiki/inc/lang/ko/backlinks.txt3
-rw-r--r--wiki/inc/lang/ko/conflict.txt5
-rw-r--r--wiki/inc/lang/ko/denied.txt3
-rw-r--r--wiki/inc/lang/ko/diff.txt3
-rw-r--r--wiki/inc/lang/ko/draft.txt5
-rw-r--r--wiki/inc/lang/ko/edit.txt1
-rw-r--r--wiki/inc/lang/ko/editrev.txt2
-rw-r--r--wiki/inc/lang/ko/index.txt3
-rw-r--r--wiki/inc/lang/ko/install.html22
-rw-r--r--wiki/inc/lang/ko/jquery.ui.datepicker.js37
-rw-r--r--wiki/inc/lang/ko/lang.php352
-rw-r--r--wiki/inc/lang/ko/locked.txt3
-rw-r--r--wiki/inc/lang/ko/login.txt3
-rw-r--r--wiki/inc/lang/ko/mailtext.txt12
-rw-r--r--wiki/inc/lang/ko/mailwrap.html13
-rw-r--r--wiki/inc/lang/ko/newpage.txt3
-rw-r--r--wiki/inc/lang/ko/norev.txt3
-rw-r--r--wiki/inc/lang/ko/password.txt6
-rw-r--r--wiki/inc/lang/ko/preview.txt3
-rw-r--r--wiki/inc/lang/ko/pwconfirm.txt10
-rw-r--r--wiki/inc/lang/ko/read.txt1
-rw-r--r--wiki/inc/lang/ko/recent.txt3
-rw-r--r--wiki/inc/lang/ko/register.txt3
-rw-r--r--wiki/inc/lang/ko/registermail.txt10
-rw-r--r--wiki/inc/lang/ko/resendpwd.txt3
-rw-r--r--wiki/inc/lang/ko/resetpwd.txt3
-rw-r--r--wiki/inc/lang/ko/revisions.txt3
-rw-r--r--wiki/inc/lang/ko/searchpage.txt4
-rw-r--r--wiki/inc/lang/ko/showrev.txt2
-rw-r--r--wiki/inc/lang/ko/stopwords.txt39
-rw-r--r--wiki/inc/lang/ko/subscr_digest.txt15
-rw-r--r--wiki/inc/lang/ko/subscr_form.txt3
-rw-r--r--wiki/inc/lang/ko/subscr_list.txt11
-rw-r--r--wiki/inc/lang/ko/subscr_single.txt17
-rw-r--r--wiki/inc/lang/ko/updateprofile.txt3
-rw-r--r--wiki/inc/lang/ko/uploadmail.txt11
-rw-r--r--wiki/inc/lang/ku/backlinks.txt4
-rw-r--r--wiki/inc/lang/ku/conflict.txt6
-rw-r--r--wiki/inc/lang/ku/diff.txt4
-rw-r--r--wiki/inc/lang/ku/edit.txt2
-rw-r--r--wiki/inc/lang/ku/index.txt3
-rw-r--r--wiki/inc/lang/ku/lang.php45
-rw-r--r--wiki/inc/lang/ku/newpage.txt3
-rw-r--r--wiki/inc/lang/ku/preview.txt3
-rw-r--r--wiki/inc/lang/ku/recent.txt3
-rw-r--r--wiki/inc/lang/ku/searchpage.txt4
-rw-r--r--wiki/inc/lang/la/admin.txt3
-rw-r--r--wiki/inc/lang/la/adminplugins.txt1
-rw-r--r--wiki/inc/lang/la/backlinks.txt3
-rw-r--r--wiki/inc/lang/la/conflict.txt5
-rw-r--r--wiki/inc/lang/la/denied.txt4
-rw-r--r--wiki/inc/lang/la/diff.txt3
-rw-r--r--wiki/inc/lang/la/draft.txt5
-rw-r--r--wiki/inc/lang/la/edit.txt1
-rw-r--r--wiki/inc/lang/la/editrev.txt2
-rw-r--r--wiki/inc/lang/la/index.txt3
-rw-r--r--wiki/inc/lang/la/install.html8
-rw-r--r--wiki/inc/lang/la/lang.php261
-rw-r--r--wiki/inc/lang/la/locked.txt3
-rw-r--r--wiki/inc/lang/la/login.txt3
-rw-r--r--wiki/inc/lang/la/mailtext.txt11
-rw-r--r--wiki/inc/lang/la/newpage.txt3
-rw-r--r--wiki/inc/lang/la/norev.txt3
-rw-r--r--wiki/inc/lang/la/password.txt6
-rw-r--r--wiki/inc/lang/la/preview.txt3
-rw-r--r--wiki/inc/lang/la/pwconfirm.txt10
-rw-r--r--wiki/inc/lang/la/read.txt1
-rw-r--r--wiki/inc/lang/la/recent.txt3
-rw-r--r--wiki/inc/lang/la/register.txt3
-rw-r--r--wiki/inc/lang/la/registermail.txt10
-rw-r--r--wiki/inc/lang/la/resendpwd.txt3
-rw-r--r--wiki/inc/lang/la/revisions.txt3
-rw-r--r--wiki/inc/lang/la/searchpage.txt4
-rw-r--r--wiki/inc/lang/la/showrev.txt2
-rw-r--r--wiki/inc/lang/la/stopwords.txt37
-rw-r--r--wiki/inc/lang/la/subscr_digest.txt16
-rw-r--r--wiki/inc/lang/la/subscr_form.txt3
-rw-r--r--wiki/inc/lang/la/subscr_list.txt13
-rw-r--r--wiki/inc/lang/la/subscr_single.txt19
-rw-r--r--wiki/inc/lang/la/updateprofile.txt3
-rw-r--r--wiki/inc/lang/la/uploadmail.txt10
-rw-r--r--wiki/inc/lang/lb/admin.txt3
-rw-r--r--wiki/inc/lang/lb/adminplugins.txt1
-rw-r--r--wiki/inc/lang/lb/backlinks.txt3
-rw-r--r--wiki/inc/lang/lb/conflict.txt5
-rw-r--r--wiki/inc/lang/lb/denied.txt4
-rw-r--r--wiki/inc/lang/lb/diff.txt3
-rw-r--r--wiki/inc/lang/lb/draft.txt5
-rw-r--r--wiki/inc/lang/lb/edit.txt1
-rw-r--r--wiki/inc/lang/lb/editrev.txt2
-rw-r--r--wiki/inc/lang/lb/index.txt3
-rw-r--r--wiki/inc/lang/lb/jquery.ui.datepicker.js45
-rw-r--r--wiki/inc/lang/lb/lang.php195
-rw-r--r--wiki/inc/lang/lb/locked.txt3
-rw-r--r--wiki/inc/lang/lb/login.txt3
-rw-r--r--wiki/inc/lang/lb/mailtext.txt12
-rw-r--r--wiki/inc/lang/lb/newpage.txt4
-rw-r--r--wiki/inc/lang/lb/norev.txt3
-rw-r--r--wiki/inc/lang/lb/password.txt6
-rw-r--r--wiki/inc/lang/lb/preview.txt3
-rw-r--r--wiki/inc/lang/lb/pwconfirm.txt11
-rw-r--r--wiki/inc/lang/lb/read.txt1
-rw-r--r--wiki/inc/lang/lb/recent.txt4
-rw-r--r--wiki/inc/lang/lb/register.txt4
-rw-r--r--wiki/inc/lang/lb/registermail.txt10
-rw-r--r--wiki/inc/lang/lb/resendpwd.txt3
-rw-r--r--wiki/inc/lang/lb/revisions.txt3
-rw-r--r--wiki/inc/lang/lb/searchpage.txt4
-rw-r--r--wiki/inc/lang/lb/showrev.txt2
-rw-r--r--wiki/inc/lang/lb/updateprofile.txt4
-rw-r--r--wiki/inc/lang/lb/uploadmail.txt10
-rw-r--r--wiki/inc/lang/lt/admin.txt4
-rw-r--r--wiki/inc/lang/lt/backlinks.txt4
-rw-r--r--wiki/inc/lang/lt/conflict.txt6
-rw-r--r--wiki/inc/lang/lt/denied.txt4
-rw-r--r--wiki/inc/lang/lt/diff.txt4
-rw-r--r--wiki/inc/lang/lt/edit.txt2
-rw-r--r--wiki/inc/lang/lt/editrev.txt2
-rw-r--r--wiki/inc/lang/lt/index.txt4
-rw-r--r--wiki/inc/lang/lt/jquery.ui.datepicker.js45
-rw-r--r--wiki/inc/lang/lt/lang.php183
-rw-r--r--wiki/inc/lang/lt/locked.txt3
-rw-r--r--wiki/inc/lang/lt/login.txt5
-rw-r--r--wiki/inc/lang/lt/mailtext.txt14
-rw-r--r--wiki/inc/lang/lt/newpage.txt4
-rw-r--r--wiki/inc/lang/lt/norev.txt5
-rw-r--r--wiki/inc/lang/lt/password.txt6
-rw-r--r--wiki/inc/lang/lt/preview.txt5
-rw-r--r--wiki/inc/lang/lt/read.txt3
-rw-r--r--wiki/inc/lang/lt/recent.txt5
-rw-r--r--wiki/inc/lang/lt/register.txt4
-rw-r--r--wiki/inc/lang/lt/resendpwd.txt3
-rw-r--r--wiki/inc/lang/lt/revisions.txt4
-rw-r--r--wiki/inc/lang/lt/searchpage.txt4
-rw-r--r--wiki/inc/lang/lt/showrev.txt2
-rw-r--r--wiki/inc/lang/lt/updateprofile.txt4
-rw-r--r--wiki/inc/lang/lv/admin.txt6
-rw-r--r--wiki/inc/lang/lv/adminplugins.txt1
-rw-r--r--wiki/inc/lang/lv/backlinks.txt5
-rw-r--r--wiki/inc/lang/lv/conflict.txt8
-rw-r--r--wiki/inc/lang/lv/denied.txt4
-rw-r--r--wiki/inc/lang/lv/diff.txt7
-rw-r--r--wiki/inc/lang/lv/draft.txt5
-rw-r--r--wiki/inc/lang/lv/edit.txt2
-rw-r--r--wiki/inc/lang/lv/editrev.txt1
-rw-r--r--wiki/inc/lang/lv/index.txt4
-rw-r--r--wiki/inc/lang/lv/install.html12
-rw-r--r--wiki/inc/lang/lv/jquery.ui.datepicker.js45
-rw-r--r--wiki/inc/lang/lv/lang.php339
-rw-r--r--wiki/inc/lang/lv/locked.txt5
-rw-r--r--wiki/inc/lang/lv/login.txt3
-rw-r--r--wiki/inc/lang/lv/mailtext.txt12
-rw-r--r--wiki/inc/lang/lv/mailwrap.html13
-rw-r--r--wiki/inc/lang/lv/newpage.txt5
-rw-r--r--wiki/inc/lang/lv/norev.txt5
-rw-r--r--wiki/inc/lang/lv/password.txt6
-rw-r--r--wiki/inc/lang/lv/preview.txt5
-rw-r--r--wiki/inc/lang/lv/pwconfirm.txt10
-rw-r--r--wiki/inc/lang/lv/read.txt4
-rw-r--r--wiki/inc/lang/lv/recent.txt8
-rw-r--r--wiki/inc/lang/lv/register.txt4
-rw-r--r--wiki/inc/lang/lv/registermail.txt10
-rw-r--r--wiki/inc/lang/lv/resendpwd.txt3
-rw-r--r--wiki/inc/lang/lv/resetpwd.txt3
-rw-r--r--wiki/inc/lang/lv/revisions.txt5
-rw-r--r--wiki/inc/lang/lv/searchpage.txt4
-rw-r--r--wiki/inc/lang/lv/showrev.txt2
-rw-r--r--wiki/inc/lang/lv/stopwords.txt48
-rw-r--r--wiki/inc/lang/lv/subscr_digest.txt15
-rw-r--r--wiki/inc/lang/lv/subscr_form.txt3
-rw-r--r--wiki/inc/lang/lv/subscr_list.txt12
-rw-r--r--wiki/inc/lang/lv/subscr_single.txt19
-rw-r--r--wiki/inc/lang/lv/updateprofile.txt8
-rw-r--r--wiki/inc/lang/lv/uploadmail.txt10
-rw-r--r--wiki/inc/lang/mg/admin.txt4
-rw-r--r--wiki/inc/lang/mg/backlinks.txt5
-rw-r--r--wiki/inc/lang/mg/conflict.txt6
-rw-r--r--wiki/inc/lang/mg/denied.txt4
-rw-r--r--wiki/inc/lang/mg/diff.txt4
-rw-r--r--wiki/inc/lang/mg/edit.txt2
-rw-r--r--wiki/inc/lang/mg/editrev.txt2
-rw-r--r--wiki/inc/lang/mg/index.txt4
-rw-r--r--wiki/inc/lang/mg/lang.php119
-rw-r--r--wiki/inc/lang/mg/locked.txt4
-rw-r--r--wiki/inc/lang/mg/login.txt4
-rw-r--r--wiki/inc/lang/mg/mailtext.txt12
-rw-r--r--wiki/inc/lang/mg/newpage.txt3
-rw-r--r--wiki/inc/lang/mg/norev.txt4
-rw-r--r--wiki/inc/lang/mg/password.txt6
-rw-r--r--wiki/inc/lang/mg/preview.txt5
-rw-r--r--wiki/inc/lang/mg/read.txt3
-rw-r--r--wiki/inc/lang/mg/recent.txt5
-rw-r--r--wiki/inc/lang/mg/register.txt5
-rw-r--r--wiki/inc/lang/mg/revisions.txt5
-rw-r--r--wiki/inc/lang/mg/searchpage.txt4
-rw-r--r--wiki/inc/lang/mg/showrev.txt2
-rw-r--r--wiki/inc/lang/mk/adminplugins.txt1
-rw-r--r--wiki/inc/lang/mk/jquery.ui.datepicker.js37
-rw-r--r--wiki/inc/lang/mk/lang.php226
-rw-r--r--wiki/inc/lang/mk/read.txt1
-rw-r--r--wiki/inc/lang/mk/recent.txt3
-rw-r--r--wiki/inc/lang/mk/showrev.txt2
-rw-r--r--wiki/inc/lang/ml/admin.txt3
-rw-r--r--wiki/inc/lang/ml/jquery.ui.datepicker.js37
-rw-r--r--wiki/inc/lang/mr/admin.txt3
-rw-r--r--wiki/inc/lang/mr/backlinks.txt3
-rw-r--r--wiki/inc/lang/mr/conflict.txt5
-rw-r--r--wiki/inc/lang/mr/denied.txt4
-rw-r--r--wiki/inc/lang/mr/diff.txt3
-rw-r--r--wiki/inc/lang/mr/draft.txt5
-rw-r--r--wiki/inc/lang/mr/edit.txt1
-rw-r--r--wiki/inc/lang/mr/editrev.txt2
-rw-r--r--wiki/inc/lang/mr/index.txt3
-rw-r--r--wiki/inc/lang/mr/install.html10
-rw-r--r--wiki/inc/lang/mr/lang.php265
-rw-r--r--wiki/inc/lang/mr/locked.txt3
-rw-r--r--wiki/inc/lang/mr/login.txt3
-rw-r--r--wiki/inc/lang/mr/mailtext.txt12
-rw-r--r--wiki/inc/lang/mr/newpage.txt3
-rw-r--r--wiki/inc/lang/mr/norev.txt3
-rw-r--r--wiki/inc/lang/mr/password.txt6
-rw-r--r--wiki/inc/lang/mr/preview.txt3
-rw-r--r--wiki/inc/lang/mr/pwconfirm.txt8
-rw-r--r--wiki/inc/lang/mr/read.txt1
-rw-r--r--wiki/inc/lang/mr/recent.txt3
-rw-r--r--wiki/inc/lang/mr/register.txt3
-rw-r--r--wiki/inc/lang/mr/registermail.txt10
-rw-r--r--wiki/inc/lang/mr/resendpwd.txt3
-rw-r--r--wiki/inc/lang/mr/revisions.txt3
-rw-r--r--wiki/inc/lang/mr/searchpage.txt4
-rw-r--r--wiki/inc/lang/mr/showrev.txt2
-rw-r--r--wiki/inc/lang/mr/stopwords.txt39
-rw-r--r--wiki/inc/lang/mr/updateprofile.txt3
-rw-r--r--wiki/inc/lang/mr/uploadmail.txt10
-rw-r--r--wiki/inc/lang/ms/jquery.ui.datepicker.js37
-rw-r--r--wiki/inc/lang/ms/lang.php95
-rw-r--r--wiki/inc/lang/ne/admin.txt2
-rw-r--r--wiki/inc/lang/ne/adminplugins.txt1
-rw-r--r--wiki/inc/lang/ne/backlinks.txt2
-rw-r--r--wiki/inc/lang/ne/conflict.txt5
-rw-r--r--wiki/inc/lang/ne/denied.txt4
-rw-r--r--wiki/inc/lang/ne/diff.txt3
-rw-r--r--wiki/inc/lang/ne/draft.txt5
-rw-r--r--wiki/inc/lang/ne/edit.txt1
-rw-r--r--wiki/inc/lang/ne/editrev.txt2
-rw-r--r--wiki/inc/lang/ne/index.txt3
-rw-r--r--wiki/inc/lang/ne/lang.php204
-rw-r--r--wiki/inc/lang/ne/locked.txt3
-rw-r--r--wiki/inc/lang/ne/norev.txt2
-rw-r--r--wiki/inc/lang/ne/pwconfirm.txt9
-rw-r--r--wiki/inc/lang/ne/read.txt1
-rw-r--r--wiki/inc/lang/ne/recent.txt2
-rw-r--r--wiki/inc/lang/ne/resendpwd.txt3
-rw-r--r--wiki/inc/lang/ne/searchpage.txt4
-rw-r--r--wiki/inc/lang/ne/showrev.txt2
-rw-r--r--wiki/inc/lang/ne/updateprofile.txt3
-rw-r--r--wiki/inc/lang/ne/uploadmail.txt9
-rw-r--r--wiki/inc/lang/nl/admin.txt3
-rw-r--r--wiki/inc/lang/nl/adminplugins.txt1
-rw-r--r--wiki/inc/lang/nl/backlinks.txt4
-rw-r--r--wiki/inc/lang/nl/conflict.txt5
-rw-r--r--wiki/inc/lang/nl/denied.txt4
-rw-r--r--wiki/inc/lang/nl/diff.txt3
-rw-r--r--wiki/inc/lang/nl/draft.txt5
-rw-r--r--wiki/inc/lang/nl/edit.txt1
-rw-r--r--wiki/inc/lang/nl/editrev.txt2
-rw-r--r--wiki/inc/lang/nl/index.txt4
-rw-r--r--wiki/inc/lang/nl/install.html14
-rw-r--r--wiki/inc/lang/nl/jquery.ui.datepicker.js37
-rw-r--r--wiki/inc/lang/nl/lang.php381
-rw-r--r--wiki/inc/lang/nl/locked.txt3
-rw-r--r--wiki/inc/lang/nl/login.txt3
-rw-r--r--wiki/inc/lang/nl/mailtext.txt12
-rw-r--r--wiki/inc/lang/nl/mailwrap.html13
-rw-r--r--wiki/inc/lang/nl/newpage.txt3
-rw-r--r--wiki/inc/lang/nl/norev.txt4
-rw-r--r--wiki/inc/lang/nl/password.txt6
-rw-r--r--wiki/inc/lang/nl/preview.txt4
-rw-r--r--wiki/inc/lang/nl/pwconfirm.txt9
-rw-r--r--wiki/inc/lang/nl/read.txt2
-rw-r--r--wiki/inc/lang/nl/recent.txt3
-rw-r--r--wiki/inc/lang/nl/register.txt4
-rw-r--r--wiki/inc/lang/nl/registermail.txt10
-rw-r--r--wiki/inc/lang/nl/resendpwd.txt3
-rw-r--r--wiki/inc/lang/nl/resetpwd.txt3
-rw-r--r--wiki/inc/lang/nl/revisions.txt4
-rw-r--r--wiki/inc/lang/nl/searchpage.txt4
-rw-r--r--wiki/inc/lang/nl/showrev.txt2
-rw-r--r--wiki/inc/lang/nl/stopwords.txt37
-rw-r--r--wiki/inc/lang/nl/subscr_digest.txt12
-rw-r--r--wiki/inc/lang/nl/subscr_form.txt3
-rw-r--r--wiki/inc/lang/nl/subscr_list.txt9
-rw-r--r--wiki/inc/lang/nl/subscr_single.txt16
-rw-r--r--wiki/inc/lang/nl/updateprofile.txt3
-rw-r--r--wiki/inc/lang/nl/uploadmail.txt11
-rw-r--r--wiki/inc/lang/no/admin.txt3
-rw-r--r--wiki/inc/lang/no/adminplugins.txt1
-rw-r--r--wiki/inc/lang/no/backlinks.txt3
-rw-r--r--wiki/inc/lang/no/conflict.txt6
-rw-r--r--wiki/inc/lang/no/denied.txt4
-rw-r--r--wiki/inc/lang/no/diff.txt4
-rw-r--r--wiki/inc/lang/no/draft.txt6
-rw-r--r--wiki/inc/lang/no/edit.txt2
-rw-r--r--wiki/inc/lang/no/editrev.txt2
-rw-r--r--wiki/inc/lang/no/index.txt4
-rw-r--r--wiki/inc/lang/no/install.html24
-rw-r--r--wiki/inc/lang/no/jquery.ui.datepicker.js50
-rw-r--r--wiki/inc/lang/no/lang.php366
-rw-r--r--wiki/inc/lang/no/locked.txt3
-rw-r--r--wiki/inc/lang/no/login.txt4
-rw-r--r--wiki/inc/lang/no/mailtext.txt12
-rw-r--r--wiki/inc/lang/no/newpage.txt3
-rw-r--r--wiki/inc/lang/no/norev.txt4
-rw-r--r--wiki/inc/lang/no/password.txt6
-rw-r--r--wiki/inc/lang/no/preview.txt4
-rw-r--r--wiki/inc/lang/no/pwconfirm.txt11
-rw-r--r--wiki/inc/lang/no/read.txt2
-rw-r--r--wiki/inc/lang/no/recent.txt5
-rw-r--r--wiki/inc/lang/no/register.txt4
-rw-r--r--wiki/inc/lang/no/registermail.txt10
-rw-r--r--wiki/inc/lang/no/resendpwd.txt4
-rw-r--r--wiki/inc/lang/no/resetpwd.txt3
-rw-r--r--wiki/inc/lang/no/revisions.txt4
-rw-r--r--wiki/inc/lang/no/searchpage.txt4
-rw-r--r--wiki/inc/lang/no/showrev.txt2
-rw-r--r--wiki/inc/lang/no/stopwords.txt68
-rw-r--r--wiki/inc/lang/no/subscr_digest.txt16
-rw-r--r--wiki/inc/lang/no/subscr_form.txt3
-rw-r--r--wiki/inc/lang/no/subscr_list.txt13
-rw-r--r--wiki/inc/lang/no/subscr_single.txt19
-rw-r--r--wiki/inc/lang/no/updateprofile.txt5
-rw-r--r--wiki/inc/lang/no/uploadmail.txt11
-rw-r--r--wiki/inc/lang/pl/admin.txt4
-rw-r--r--wiki/inc/lang/pl/adminplugins.txt1
-rw-r--r--wiki/inc/lang/pl/backlinks.txt4
-rw-r--r--wiki/inc/lang/pl/conflict.txt6
-rw-r--r--wiki/inc/lang/pl/denied.txt4
-rw-r--r--wiki/inc/lang/pl/diff.txt4
-rw-r--r--wiki/inc/lang/pl/draft.txt6
-rw-r--r--wiki/inc/lang/pl/edit.txt4
-rw-r--r--wiki/inc/lang/pl/editrev.txt2
-rw-r--r--wiki/inc/lang/pl/index.txt4
-rw-r--r--wiki/inc/lang/pl/install.html23
-rw-r--r--wiki/inc/lang/pl/jquery.ui.datepicker.js37
-rw-r--r--wiki/inc/lang/pl/lang.php358
-rw-r--r--wiki/inc/lang/pl/locked.txt3
-rw-r--r--wiki/inc/lang/pl/login.txt4
-rw-r--r--wiki/inc/lang/pl/mailtext.txt13
-rw-r--r--wiki/inc/lang/pl/mailwrap.html13
-rw-r--r--wiki/inc/lang/pl/newpage.txt4
-rw-r--r--wiki/inc/lang/pl/norev.txt4
-rw-r--r--wiki/inc/lang/pl/password.txt6
-rw-r--r--wiki/inc/lang/pl/preview.txt4
-rw-r--r--wiki/inc/lang/pl/pwconfirm.txt9
-rw-r--r--wiki/inc/lang/pl/read.txt2
-rw-r--r--wiki/inc/lang/pl/recent.txt5
-rw-r--r--wiki/inc/lang/pl/register.txt4
-rw-r--r--wiki/inc/lang/pl/registermail.txt11
-rw-r--r--wiki/inc/lang/pl/resendpwd.txt4
-rw-r--r--wiki/inc/lang/pl/resetpwd.txt3
-rw-r--r--wiki/inc/lang/pl/revisions.txt4
-rw-r--r--wiki/inc/lang/pl/searchpage.txt4
-rw-r--r--wiki/inc/lang/pl/showrev.txt2
-rw-r--r--wiki/inc/lang/pl/stopwords.txt89
-rw-r--r--wiki/inc/lang/pl/subscr_digest.txt17
-rw-r--r--wiki/inc/lang/pl/subscr_form.txt3
-rw-r--r--wiki/inc/lang/pl/subscr_list.txt14
-rw-r--r--wiki/inc/lang/pl/subscr_single.txt20
-rw-r--r--wiki/inc/lang/pl/updateprofile.txt5
-rw-r--r--wiki/inc/lang/pl/uploadmail.txt12
-rw-r--r--wiki/inc/lang/pt-br/admin.txt4
-rw-r--r--wiki/inc/lang/pt-br/adminplugins.txt1
-rw-r--r--wiki/inc/lang/pt-br/backlinks.txt4
-rw-r--r--wiki/inc/lang/pt-br/conflict.txt5
-rw-r--r--wiki/inc/lang/pt-br/denied.txt4
-rw-r--r--wiki/inc/lang/pt-br/diff.txt3
-rw-r--r--wiki/inc/lang/pt-br/draft.txt5
-rw-r--r--wiki/inc/lang/pt-br/edit.txt2
-rw-r--r--wiki/inc/lang/pt-br/editrev.txt4
-rw-r--r--wiki/inc/lang/pt-br/index.txt3
-rw-r--r--wiki/inc/lang/pt-br/install.html7
-rw-r--r--wiki/inc/lang/pt-br/jquery.ui.datepicker.js45
-rw-r--r--wiki/inc/lang/pt-br/lang.php361
-rw-r--r--wiki/inc/lang/pt-br/locked.txt3
-rw-r--r--wiki/inc/lang/pt-br/login.txt3
-rw-r--r--wiki/inc/lang/pt-br/mailtext.txt12
-rw-r--r--wiki/inc/lang/pt-br/mailwrap.html13
-rw-r--r--wiki/inc/lang/pt-br/newpage.txt3
-rw-r--r--wiki/inc/lang/pt-br/norev.txt3
-rw-r--r--wiki/inc/lang/pt-br/password.txt6
-rw-r--r--wiki/inc/lang/pt-br/preview.txt3
-rw-r--r--wiki/inc/lang/pt-br/pwconfirm.txt9
-rw-r--r--wiki/inc/lang/pt-br/read.txt1
-rw-r--r--wiki/inc/lang/pt-br/recent.txt4
-rw-r--r--wiki/inc/lang/pt-br/register.txt4
-rw-r--r--wiki/inc/lang/pt-br/registermail.txt10
-rw-r--r--wiki/inc/lang/pt-br/resendpwd.txt3
-rw-r--r--wiki/inc/lang/pt-br/resetpwd.txt3
-rw-r--r--wiki/inc/lang/pt-br/revisions.txt4
-rw-r--r--wiki/inc/lang/pt-br/searchpage.txt4
-rw-r--r--wiki/inc/lang/pt-br/showrev.txt2
-rw-r--r--wiki/inc/lang/pt-br/stopwords.txt55
-rw-r--r--wiki/inc/lang/pt-br/subscr_digest.txt16
-rw-r--r--wiki/inc/lang/pt-br/subscr_form.txt3
-rw-r--r--wiki/inc/lang/pt-br/subscr_list.txt26
-rw-r--r--wiki/inc/lang/pt-br/subscr_single.txt19
-rw-r--r--wiki/inc/lang/pt-br/updateprofile.txt5
-rw-r--r--wiki/inc/lang/pt-br/uploadmail.txt10
-rw-r--r--wiki/inc/lang/pt/admin.txt3
-rw-r--r--wiki/inc/lang/pt/adminplugins.txt1
-rw-r--r--wiki/inc/lang/pt/backlinks.txt4
-rw-r--r--wiki/inc/lang/pt/conflict.txt5
-rw-r--r--wiki/inc/lang/pt/denied.txt4
-rw-r--r--wiki/inc/lang/pt/diff.txt3
-rw-r--r--wiki/inc/lang/pt/draft.txt7
-rw-r--r--wiki/inc/lang/pt/edit.txt4
-rw-r--r--wiki/inc/lang/pt/editrev.txt1
-rw-r--r--wiki/inc/lang/pt/index.txt3
-rw-r--r--wiki/inc/lang/pt/install.html8
-rw-r--r--wiki/inc/lang/pt/jquery.ui.datepicker.js44
-rw-r--r--wiki/inc/lang/pt/lang.php350
-rw-r--r--wiki/inc/lang/pt/locked.txt3
-rw-r--r--wiki/inc/lang/pt/login.txt3
-rw-r--r--wiki/inc/lang/pt/mailtext.txt14
-rw-r--r--wiki/inc/lang/pt/newpage.txt3
-rw-r--r--wiki/inc/lang/pt/norev.txt7
-rw-r--r--wiki/inc/lang/pt/password.txt6
-rw-r--r--wiki/inc/lang/pt/preview.txt3
-rw-r--r--wiki/inc/lang/pt/pwconfirm.txt9
-rw-r--r--wiki/inc/lang/pt/read.txt1
-rw-r--r--wiki/inc/lang/pt/recent.txt3
-rw-r--r--wiki/inc/lang/pt/register.txt3
-rw-r--r--wiki/inc/lang/pt/registermail.txt10
-rw-r--r--wiki/inc/lang/pt/resendpwd.txt3
-rw-r--r--wiki/inc/lang/pt/resetpwd.txt3
-rw-r--r--wiki/inc/lang/pt/revisions.txt3
-rw-r--r--wiki/inc/lang/pt/searchpage.txt4
-rw-r--r--wiki/inc/lang/pt/showrev.txt1
-rw-r--r--wiki/inc/lang/pt/stopwords.txt141
-rw-r--r--wiki/inc/lang/pt/subscr_digest.txt16
-rw-r--r--wiki/inc/lang/pt/subscr_form.txt3
-rw-r--r--wiki/inc/lang/pt/subscr_list.txt13
-rw-r--r--wiki/inc/lang/pt/subscr_single.txt19
-rw-r--r--wiki/inc/lang/pt/updateprofile.txt3
-rw-r--r--wiki/inc/lang/pt/uploadmail.txt11
-rw-r--r--wiki/inc/lang/ro/admin.txt3
-rw-r--r--wiki/inc/lang/ro/adminplugins.txt1
-rw-r--r--wiki/inc/lang/ro/backlinks.txt3
-rw-r--r--wiki/inc/lang/ro/conflict.txt7
-rw-r--r--wiki/inc/lang/ro/denied.txt4
-rw-r--r--wiki/inc/lang/ro/diff.txt3
-rw-r--r--wiki/inc/lang/ro/draft.txt8
-rw-r--r--wiki/inc/lang/ro/edit.txt1
-rw-r--r--wiki/inc/lang/ro/editrev.txt3
-rw-r--r--wiki/inc/lang/ro/index.txt4
-rw-r--r--wiki/inc/lang/ro/install.html10
-rw-r--r--wiki/inc/lang/ro/jquery.ui.datepicker.js40
-rw-r--r--wiki/inc/lang/ro/lang.php338
-rw-r--r--wiki/inc/lang/ro/locked.txt4
-rw-r--r--wiki/inc/lang/ro/login.txt4
-rw-r--r--wiki/inc/lang/ro/mailtext.txt13
-rw-r--r--wiki/inc/lang/ro/newpage.txt3
-rw-r--r--wiki/inc/lang/ro/norev.txt4
-rw-r--r--wiki/inc/lang/ro/password.txt6
-rw-r--r--wiki/inc/lang/ro/preview.txt3
-rw-r--r--wiki/inc/lang/ro/pwconfirm.txt10
-rw-r--r--wiki/inc/lang/ro/read.txt2
-rw-r--r--wiki/inc/lang/ro/recent.txt3
-rw-r--r--wiki/inc/lang/ro/register.txt4
-rw-r--r--wiki/inc/lang/ro/registermail.txt11
-rw-r--r--wiki/inc/lang/ro/resendpwd.txt5
-rw-r--r--wiki/inc/lang/ro/resetpwd.txt3
-rw-r--r--wiki/inc/lang/ro/revisions.txt5
-rw-r--r--wiki/inc/lang/ro/searchpage.txt4
-rw-r--r--wiki/inc/lang/ro/showrev.txt2
-rw-r--r--wiki/inc/lang/ro/stopwords.txt31
-rw-r--r--wiki/inc/lang/ro/subscr_digest.txt16
-rw-r--r--wiki/inc/lang/ro/subscr_form.txt4
-rw-r--r--wiki/inc/lang/ro/subscr_list.txt13
-rw-r--r--wiki/inc/lang/ro/subscr_single.txt19
-rw-r--r--wiki/inc/lang/ro/updateprofile.txt4
-rw-r--r--wiki/inc/lang/ro/uploadmail.txt12
-rw-r--r--wiki/inc/lang/ru/admin.txt4
-rw-r--r--wiki/inc/lang/ru/adminplugins.txt1
-rw-r--r--wiki/inc/lang/ru/backlinks.txt4
-rw-r--r--wiki/inc/lang/ru/conflict.txt5
-rw-r--r--wiki/inc/lang/ru/denied.txt4
-rw-r--r--wiki/inc/lang/ru/diff.txt3
-rw-r--r--wiki/inc/lang/ru/draft.txt5
-rw-r--r--wiki/inc/lang/ru/edit.txt1
-rw-r--r--wiki/inc/lang/ru/editrev.txt2
-rw-r--r--wiki/inc/lang/ru/index.txt4
-rw-r--r--wiki/inc/lang/ru/install.html7
-rw-r--r--wiki/inc/lang/ru/jquery.ui.datepicker.js37
-rw-r--r--wiki/inc/lang/ru/lang.php391
-rw-r--r--wiki/inc/lang/ru/locked.txt3
-rw-r--r--wiki/inc/lang/ru/login.txt4
-rw-r--r--wiki/inc/lang/ru/mailtext.txt12
-rw-r--r--wiki/inc/lang/ru/newpage.txt3
-rw-r--r--wiki/inc/lang/ru/norev.txt3
-rw-r--r--wiki/inc/lang/ru/password.txt6
-rw-r--r--wiki/inc/lang/ru/preview.txt4
-rw-r--r--wiki/inc/lang/ru/pwconfirm.txt9
-rw-r--r--wiki/inc/lang/ru/read.txt2
-rw-r--r--wiki/inc/lang/ru/recent.txt5
-rw-r--r--wiki/inc/lang/ru/register.txt3
-rw-r--r--wiki/inc/lang/ru/registermail.txt10
-rw-r--r--wiki/inc/lang/ru/resendpwd.txt3
-rw-r--r--wiki/inc/lang/ru/resetpwd.txt3
-rw-r--r--wiki/inc/lang/ru/revisions.txt3
-rw-r--r--wiki/inc/lang/ru/searchpage.txt4
-rw-r--r--wiki/inc/lang/ru/showrev.txt2
-rw-r--r--wiki/inc/lang/ru/stopwords.txt93
-rw-r--r--wiki/inc/lang/ru/subscr_digest.txt15
-rw-r--r--wiki/inc/lang/ru/subscr_form.txt3
-rw-r--r--wiki/inc/lang/ru/subscr_list.txt13
-rw-r--r--wiki/inc/lang/ru/subscr_single.txt19
-rw-r--r--wiki/inc/lang/ru/updateprofile.txt5
-rw-r--r--wiki/inc/lang/ru/uploadmail.txt11
-rw-r--r--wiki/inc/lang/ru/wordblock.txt3
-rw-r--r--wiki/inc/lang/sk/admin.txt5
-rw-r--r--wiki/inc/lang/sk/adminplugins.txt1
-rw-r--r--wiki/inc/lang/sk/backlinks.txt3
-rw-r--r--wiki/inc/lang/sk/conflict.txt5
-rw-r--r--wiki/inc/lang/sk/denied.txt4
-rw-r--r--wiki/inc/lang/sk/diff.txt4
-rw-r--r--wiki/inc/lang/sk/draft.txt6
-rw-r--r--wiki/inc/lang/sk/edit.txt1
-rw-r--r--wiki/inc/lang/sk/editrev.txt1
-rw-r--r--wiki/inc/lang/sk/index.txt3
-rw-r--r--wiki/inc/lang/sk/install.html23
-rw-r--r--wiki/inc/lang/sk/jquery.ui.datepicker.js37
-rw-r--r--wiki/inc/lang/sk/lang.php340
-rw-r--r--wiki/inc/lang/sk/locked.txt3
-rw-r--r--wiki/inc/lang/sk/login.txt3
-rw-r--r--wiki/inc/lang/sk/mailtext.txt12
-rw-r--r--wiki/inc/lang/sk/mailwrap.html13
-rw-r--r--wiki/inc/lang/sk/newpage.txt3
-rw-r--r--wiki/inc/lang/sk/norev.txt3
-rw-r--r--wiki/inc/lang/sk/password.txt7
-rw-r--r--wiki/inc/lang/sk/preview.txt3
-rw-r--r--wiki/inc/lang/sk/pwconfirm.txt11
-rw-r--r--wiki/inc/lang/sk/read.txt2
-rw-r--r--wiki/inc/lang/sk/recent.txt3
-rw-r--r--wiki/inc/lang/sk/register.txt3
-rw-r--r--wiki/inc/lang/sk/registermail.txt10
-rw-r--r--wiki/inc/lang/sk/resendpwd.txt3
-rw-r--r--wiki/inc/lang/sk/resetpwd.txt3
-rw-r--r--wiki/inc/lang/sk/revisions.txt3
-rw-r--r--wiki/inc/lang/sk/searchpage.txt4
-rw-r--r--wiki/inc/lang/sk/showrev.txt2
-rw-r--r--wiki/inc/lang/sk/stopwords.txt28
-rw-r--r--wiki/inc/lang/sk/subscr_digest.txt16
-rw-r--r--wiki/inc/lang/sk/subscr_form.txt3
-rw-r--r--wiki/inc/lang/sk/subscr_list.txt13
-rw-r--r--wiki/inc/lang/sk/subscr_single.txt19
-rw-r--r--wiki/inc/lang/sk/updateprofile.txt6
-rw-r--r--wiki/inc/lang/sk/uploadmail.txt10
-rw-r--r--wiki/inc/lang/sl/admin.txt3
-rw-r--r--wiki/inc/lang/sl/adminplugins.txt1
-rw-r--r--wiki/inc/lang/sl/backlinks.txt3
-rw-r--r--wiki/inc/lang/sl/conflict.txt5
-rw-r--r--wiki/inc/lang/sl/denied.txt4
-rw-r--r--wiki/inc/lang/sl/diff.txt3
-rw-r--r--wiki/inc/lang/sl/draft.txt5
-rw-r--r--wiki/inc/lang/sl/edit.txt1
-rw-r--r--wiki/inc/lang/sl/editrev.txt2
-rw-r--r--wiki/inc/lang/sl/index.txt4
-rw-r--r--wiki/inc/lang/sl/install.html20
-rw-r--r--wiki/inc/lang/sl/jquery.ui.datepicker.js38
-rw-r--r--wiki/inc/lang/sl/lang.php334
-rw-r--r--wiki/inc/lang/sl/locked.txt3
-rw-r--r--wiki/inc/lang/sl/login.txt3
-rw-r--r--wiki/inc/lang/sl/mailtext.txt12
-rw-r--r--wiki/inc/lang/sl/newpage.txt3
-rw-r--r--wiki/inc/lang/sl/norev.txt3
-rw-r--r--wiki/inc/lang/sl/password.txt6
-rw-r--r--wiki/inc/lang/sl/preview.txt3
-rw-r--r--wiki/inc/lang/sl/pwconfirm.txt8
-rw-r--r--wiki/inc/lang/sl/read.txt2
-rw-r--r--wiki/inc/lang/sl/recent.txt3
-rw-r--r--wiki/inc/lang/sl/register.txt3
-rw-r--r--wiki/inc/lang/sl/registermail.txt11
-rw-r--r--wiki/inc/lang/sl/resendpwd.txt3
-rw-r--r--wiki/inc/lang/sl/resetpwd.txt1
-rw-r--r--wiki/inc/lang/sl/revisions.txt3
-rw-r--r--wiki/inc/lang/sl/searchpage.txt4
-rw-r--r--wiki/inc/lang/sl/showrev.txt2
-rw-r--r--wiki/inc/lang/sl/stopwords.txt18
-rw-r--r--wiki/inc/lang/sl/subscr_digest.txt16
-rw-r--r--wiki/inc/lang/sl/subscr_form.txt3
-rw-r--r--wiki/inc/lang/sl/subscr_list.txt13
-rw-r--r--wiki/inc/lang/sl/subscr_single.txt19
-rw-r--r--wiki/inc/lang/sl/updateprofile.txt3
-rw-r--r--wiki/inc/lang/sl/uploadmail.txt11
-rw-r--r--wiki/inc/lang/sq/admin.txt3
-rw-r--r--wiki/inc/lang/sq/adminplugins.txt1
-rw-r--r--wiki/inc/lang/sq/backlinks.txt3
-rw-r--r--wiki/inc/lang/sq/conflict.txt5
-rw-r--r--wiki/inc/lang/sq/denied.txt4
-rw-r--r--wiki/inc/lang/sq/diff.txt3
-rw-r--r--wiki/inc/lang/sq/draft.txt5
-rw-r--r--wiki/inc/lang/sq/edit.txt1
-rw-r--r--wiki/inc/lang/sq/editrev.txt2
-rw-r--r--wiki/inc/lang/sq/index.txt3
-rw-r--r--wiki/inc/lang/sq/install.html8
-rw-r--r--wiki/inc/lang/sq/jquery.ui.datepicker.js37
-rw-r--r--wiki/inc/lang/sq/lang.php236
-rw-r--r--wiki/inc/lang/sq/locked.txt3
-rw-r--r--wiki/inc/lang/sq/login.txt3
-rw-r--r--wiki/inc/lang/sq/mailtext.txt16
-rw-r--r--wiki/inc/lang/sq/newpage.txt3
-rw-r--r--wiki/inc/lang/sq/norev.txt3
-rw-r--r--wiki/inc/lang/sq/password.txt10
-rw-r--r--wiki/inc/lang/sq/preview.txt3
-rw-r--r--wiki/inc/lang/sq/pwconfirm.txt9
-rw-r--r--wiki/inc/lang/sq/read.txt1
-rw-r--r--wiki/inc/lang/sq/recent.txt3
-rw-r--r--wiki/inc/lang/sq/register.txt3
-rw-r--r--wiki/inc/lang/sq/registermail.txt10
-rw-r--r--wiki/inc/lang/sq/resendpwd.txt3
-rw-r--r--wiki/inc/lang/sq/revisions.txt3
-rw-r--r--wiki/inc/lang/sq/searchpage.txt4
-rw-r--r--wiki/inc/lang/sq/showrev.txt2
-rw-r--r--wiki/inc/lang/sq/stopwords.txt39
-rw-r--r--wiki/inc/lang/sq/subscr_digest.txt16
-rw-r--r--wiki/inc/lang/sq/subscr_form.txt3
-rw-r--r--wiki/inc/lang/sq/subscr_list.txt9
-rw-r--r--wiki/inc/lang/sq/subscr_single.txt19
-rw-r--r--wiki/inc/lang/sq/updateprofile.txt3
-rw-r--r--wiki/inc/lang/sq/uploadmail.txt10
-rw-r--r--wiki/inc/lang/sr/admin.txt4
-rw-r--r--wiki/inc/lang/sr/adminplugins.txt1
-rw-r--r--wiki/inc/lang/sr/backlinks.txt4
-rw-r--r--wiki/inc/lang/sr/conflict.txt6
-rw-r--r--wiki/inc/lang/sr/denied.txt4
-rw-r--r--wiki/inc/lang/sr/diff.txt4
-rw-r--r--wiki/inc/lang/sr/draft.txt5
-rw-r--r--wiki/inc/lang/sr/edit.txt2
-rw-r--r--wiki/inc/lang/sr/editrev.txt2
-rw-r--r--wiki/inc/lang/sr/index.txt4
-rw-r--r--wiki/inc/lang/sr/install.html12
-rw-r--r--wiki/inc/lang/sr/jquery.ui.datepicker.js37
-rw-r--r--wiki/inc/lang/sr/lang.php342
-rw-r--r--wiki/inc/lang/sr/locked.txt3
-rw-r--r--wiki/inc/lang/sr/login.txt4
-rw-r--r--wiki/inc/lang/sr/mailtext.txt12
-rw-r--r--wiki/inc/lang/sr/newpage.txt3
-rw-r--r--wiki/inc/lang/sr/norev.txt4
-rw-r--r--wiki/inc/lang/sr/password.txt6
-rw-r--r--wiki/inc/lang/sr/preview.txt4
-rw-r--r--wiki/inc/lang/sr/pwconfirm.txt9
-rw-r--r--wiki/inc/lang/sr/read.txt2
-rw-r--r--wiki/inc/lang/sr/recent.txt5
-rw-r--r--wiki/inc/lang/sr/register.txt4
-rw-r--r--wiki/inc/lang/sr/registermail.txt10
-rw-r--r--wiki/inc/lang/sr/resendpwd.txt3
-rw-r--r--wiki/inc/lang/sr/resetpwd.txt3
-rw-r--r--wiki/inc/lang/sr/revisions.txt4
-rw-r--r--wiki/inc/lang/sr/searchpage.txt4
-rw-r--r--wiki/inc/lang/sr/showrev.txt2
-rw-r--r--wiki/inc/lang/sr/stopwords.txt12
-rw-r--r--wiki/inc/lang/sr/subscr_digest.txt16
-rw-r--r--wiki/inc/lang/sr/subscr_form.txt3
-rw-r--r--wiki/inc/lang/sr/subscr_list.txt13
-rw-r--r--wiki/inc/lang/sr/subscr_single.txt19
-rw-r--r--wiki/inc/lang/sr/updateprofile.txt3
-rw-r--r--wiki/inc/lang/sr/uploadmail.txt10
-rw-r--r--wiki/inc/lang/sv/admin.txt4
-rw-r--r--wiki/inc/lang/sv/adminplugins.txt1
-rw-r--r--wiki/inc/lang/sv/backlinks.txt3
-rw-r--r--wiki/inc/lang/sv/conflict.txt6
-rw-r--r--wiki/inc/lang/sv/denied.txt4
-rw-r--r--wiki/inc/lang/sv/diff.txt4
-rw-r--r--wiki/inc/lang/sv/draft.txt6
-rw-r--r--wiki/inc/lang/sv/edit.txt2
-rw-r--r--wiki/inc/lang/sv/editrev.txt2
-rw-r--r--wiki/inc/lang/sv/index.txt4
-rw-r--r--wiki/inc/lang/sv/install.html25
-rw-r--r--wiki/inc/lang/sv/jquery.ui.datepicker.js37
-rw-r--r--wiki/inc/lang/sv/lang.php351
-rw-r--r--wiki/inc/lang/sv/locked.txt3
-rw-r--r--wiki/inc/lang/sv/login.txt4
-rw-r--r--wiki/inc/lang/sv/mailtext.txt12
-rw-r--r--wiki/inc/lang/sv/mailwrap.html13
-rw-r--r--wiki/inc/lang/sv/newpage.txt3
-rw-r--r--wiki/inc/lang/sv/norev.txt4
-rw-r--r--wiki/inc/lang/sv/password.txt6
-rw-r--r--wiki/inc/lang/sv/preview.txt4
-rw-r--r--wiki/inc/lang/sv/pwconfirm.txt12
-rw-r--r--wiki/inc/lang/sv/read.txt2
-rw-r--r--wiki/inc/lang/sv/recent.txt5
-rw-r--r--wiki/inc/lang/sv/register.txt4
-rw-r--r--wiki/inc/lang/sv/registermail.txt10
-rw-r--r--wiki/inc/lang/sv/resendpwd.txt4
-rw-r--r--wiki/inc/lang/sv/resetpwd.txt3
-rw-r--r--wiki/inc/lang/sv/revisions.txt4
-rw-r--r--wiki/inc/lang/sv/searchpage.txt4
-rw-r--r--wiki/inc/lang/sv/showrev.txt2
-rw-r--r--wiki/inc/lang/sv/stopwords.txt129
-rw-r--r--wiki/inc/lang/sv/subscr_digest.txt15
-rw-r--r--wiki/inc/lang/sv/subscr_form.txt3
-rw-r--r--wiki/inc/lang/sv/subscr_list.txt9
-rw-r--r--wiki/inc/lang/sv/subscr_single.txt19
-rw-r--r--wiki/inc/lang/sv/updateprofile.txt5
-rw-r--r--wiki/inc/lang/sv/uploadmail.txt10
-rw-r--r--wiki/inc/lang/ta/admin.txt3
-rw-r--r--wiki/inc/lang/ta/adminplugins.txt1
-rw-r--r--wiki/inc/lang/ta/backlinks.txt3
-rw-r--r--wiki/inc/lang/ta/conflict.txt3
-rw-r--r--wiki/inc/lang/ta/denied.txt1
-rw-r--r--wiki/inc/lang/ta/diff.txt3
-rw-r--r--wiki/inc/lang/ta/draft.txt1
-rw-r--r--wiki/inc/lang/ta/edit.txt1
-rw-r--r--wiki/inc/lang/ta/jquery.ui.datepicker.js53
-rw-r--r--wiki/inc/lang/ta/lang.php55
-rw-r--r--wiki/inc/lang/th/admin.txt3
-rw-r--r--wiki/inc/lang/th/adminplugins.txt1
-rw-r--r--wiki/inc/lang/th/backlinks.txt3
-rw-r--r--wiki/inc/lang/th/conflict.txt5
-rw-r--r--wiki/inc/lang/th/denied.txt4
-rw-r--r--wiki/inc/lang/th/diff.txt3
-rw-r--r--wiki/inc/lang/th/draft.txt5
-rw-r--r--wiki/inc/lang/th/edit.txt1
-rw-r--r--wiki/inc/lang/th/editrev.txt2
-rw-r--r--wiki/inc/lang/th/index.txt2
-rw-r--r--wiki/inc/lang/th/jquery.ui.datepicker.js37
-rw-r--r--wiki/inc/lang/th/lang.php245
-rw-r--r--wiki/inc/lang/th/locked.txt3
-rw-r--r--wiki/inc/lang/th/login.txt4
-rw-r--r--wiki/inc/lang/th/mailtext.txt12
-rw-r--r--wiki/inc/lang/th/newpage.txt3
-rw-r--r--wiki/inc/lang/th/norev.txt3
-rw-r--r--wiki/inc/lang/th/password.txt6
-rw-r--r--wiki/inc/lang/th/preview.txt3
-rw-r--r--wiki/inc/lang/th/pwconfirm.txt10
-rw-r--r--wiki/inc/lang/th/read.txt1
-rw-r--r--wiki/inc/lang/th/recent.txt3
-rw-r--r--wiki/inc/lang/th/register.txt3
-rw-r--r--wiki/inc/lang/th/registermail.txt10
-rw-r--r--wiki/inc/lang/th/resendpwd.txt3
-rw-r--r--wiki/inc/lang/th/revisions.txt3
-rw-r--r--wiki/inc/lang/th/searchpage.txt4
-rw-r--r--wiki/inc/lang/th/showrev.txt2
-rw-r--r--wiki/inc/lang/th/updateprofile.txt3
-rw-r--r--wiki/inc/lang/th/uploadmail.txt10
-rw-r--r--wiki/inc/lang/tr/admin.txt3
-rw-r--r--wiki/inc/lang/tr/adminplugins.txt1
-rw-r--r--wiki/inc/lang/tr/backlinks.txt4
-rw-r--r--wiki/inc/lang/tr/conflict.txt6
-rw-r--r--wiki/inc/lang/tr/denied.txt4
-rw-r--r--wiki/inc/lang/tr/diff.txt4
-rw-r--r--wiki/inc/lang/tr/draft.txt5
-rw-r--r--wiki/inc/lang/tr/edit.txt2
-rw-r--r--wiki/inc/lang/tr/editrev.txt2
-rw-r--r--wiki/inc/lang/tr/index.txt4
-rw-r--r--wiki/inc/lang/tr/install.html8
-rw-r--r--wiki/inc/lang/tr/jquery.ui.datepicker.js37
-rw-r--r--wiki/inc/lang/tr/lang.php342
-rw-r--r--wiki/inc/lang/tr/locked.txt4
-rw-r--r--wiki/inc/lang/tr/login.txt4
-rw-r--r--wiki/inc/lang/tr/mailtext.txt12
-rw-r--r--wiki/inc/lang/tr/newpage.txt4
-rw-r--r--wiki/inc/lang/tr/norev.txt4
-rw-r--r--wiki/inc/lang/tr/password.txt7
-rw-r--r--wiki/inc/lang/tr/preview.txt4
-rw-r--r--wiki/inc/lang/tr/pwconfirm.txt9
-rw-r--r--wiki/inc/lang/tr/read.txt2
-rw-r--r--wiki/inc/lang/tr/recent.txt5
-rw-r--r--wiki/inc/lang/tr/register.txt4
-rw-r--r--wiki/inc/lang/tr/registermail.txt10
-rw-r--r--wiki/inc/lang/tr/resendpwd.txt3
-rw-r--r--wiki/inc/lang/tr/resetpwd.txt3
-rw-r--r--wiki/inc/lang/tr/revisions.txt4
-rw-r--r--wiki/inc/lang/tr/searchpage.txt4
-rw-r--r--wiki/inc/lang/tr/showrev.txt2
-rw-r--r--wiki/inc/lang/tr/stopwords.txt29
-rw-r--r--wiki/inc/lang/tr/subscr_form.txt3
-rw-r--r--wiki/inc/lang/tr/updateprofile.txt3
-rw-r--r--wiki/inc/lang/tr/uploadmail.txt10
-rw-r--r--wiki/inc/lang/uk/admin.txt4
-rw-r--r--wiki/inc/lang/uk/adminplugins.txt1
-rw-r--r--wiki/inc/lang/uk/backlinks.txt3
-rw-r--r--wiki/inc/lang/uk/conflict.txt8
-rw-r--r--wiki/inc/lang/uk/denied.txt4
-rw-r--r--wiki/inc/lang/uk/diff.txt4
-rw-r--r--wiki/inc/lang/uk/draft.txt6
-rw-r--r--wiki/inc/lang/uk/edit.txt1
-rw-r--r--wiki/inc/lang/uk/editrev.txt2
-rw-r--r--wiki/inc/lang/uk/index.txt4
-rw-r--r--wiki/inc/lang/uk/install.html21
-rw-r--r--wiki/inc/lang/uk/jquery.ui.datepicker.js38
-rw-r--r--wiki/inc/lang/uk/lang.php354
-rw-r--r--wiki/inc/lang/uk/locked.txt3
-rw-r--r--wiki/inc/lang/uk/login.txt4
-rw-r--r--wiki/inc/lang/uk/mailtext.txt12
-rw-r--r--wiki/inc/lang/uk/newpage.txt4
-rw-r--r--wiki/inc/lang/uk/norev.txt4
-rw-r--r--wiki/inc/lang/uk/password.txt6
-rw-r--r--wiki/inc/lang/uk/preview.txt4
-rw-r--r--wiki/inc/lang/uk/pwconfirm.txt10
-rw-r--r--wiki/inc/lang/uk/read.txt2
-rw-r--r--wiki/inc/lang/uk/recent.txt4
-rw-r--r--wiki/inc/lang/uk/register.txt4
-rw-r--r--wiki/inc/lang/uk/registermail.txt10
-rw-r--r--wiki/inc/lang/uk/resendpwd.txt3
-rw-r--r--wiki/inc/lang/uk/resetpwd.txt3
-rw-r--r--wiki/inc/lang/uk/revisions.txt4
-rw-r--r--wiki/inc/lang/uk/searchpage.txt4
-rw-r--r--wiki/inc/lang/uk/showrev.txt2
-rw-r--r--wiki/inc/lang/uk/stopwords.txt3
-rw-r--r--wiki/inc/lang/uk/subscr_digest.txt14
-rw-r--r--wiki/inc/lang/uk/subscr_form.txt3
-rw-r--r--wiki/inc/lang/uk/subscr_list.txt11
-rw-r--r--wiki/inc/lang/uk/subscr_single.txt17
-rw-r--r--wiki/inc/lang/uk/updateprofile.txt5
-rw-r--r--wiki/inc/lang/uk/uploadmail.txt10
-rw-r--r--wiki/inc/lang/vi/admin.txt3
-rw-r--r--wiki/inc/lang/vi/backlinks.txt3
-rw-r--r--wiki/inc/lang/vi/conflict.txt5
-rw-r--r--wiki/inc/lang/vi/denied.txt4
-rw-r--r--wiki/inc/lang/vi/diff.txt4
-rw-r--r--wiki/inc/lang/vi/edit.txt1
-rw-r--r--wiki/inc/lang/vi/editrev.txt2
-rw-r--r--wiki/inc/lang/vi/index.txt3
-rw-r--r--wiki/inc/lang/vi/jquery.ui.datepicker.js37
-rw-r--r--wiki/inc/lang/vi/lang.php242
-rw-r--r--wiki/inc/lang/vi/locked.txt3
-rw-r--r--wiki/inc/lang/vi/login.txt3
-rw-r--r--wiki/inc/lang/vi/mailtext.txt12
-rw-r--r--wiki/inc/lang/vi/newpage.txt3
-rw-r--r--wiki/inc/lang/vi/norev.txt3
-rw-r--r--wiki/inc/lang/vi/password.txt6
-rw-r--r--wiki/inc/lang/vi/preview.txt3
-rw-r--r--wiki/inc/lang/vi/read.txt1
-rw-r--r--wiki/inc/lang/vi/recent.txt3
-rw-r--r--wiki/inc/lang/vi/register.txt3
-rw-r--r--wiki/inc/lang/vi/revisions.txt3
-rw-r--r--wiki/inc/lang/vi/searchpage.txt4
-rw-r--r--wiki/inc/lang/vi/showrev.txt2
-rw-r--r--wiki/inc/lang/zh-tw/admin.txt3
-rw-r--r--wiki/inc/lang/zh-tw/adminplugins.txt1
-rw-r--r--wiki/inc/lang/zh-tw/backlinks.txt4
-rw-r--r--wiki/inc/lang/zh-tw/conflict.txt5
-rw-r--r--wiki/inc/lang/zh-tw/denied.txt4
-rw-r--r--wiki/inc/lang/zh-tw/diff.txt3
-rw-r--r--wiki/inc/lang/zh-tw/draft.txt5
-rw-r--r--wiki/inc/lang/zh-tw/edit.txt1
-rw-r--r--wiki/inc/lang/zh-tw/editrev.txt2
-rw-r--r--wiki/inc/lang/zh-tw/index.txt3
-rw-r--r--wiki/inc/lang/zh-tw/install.html8
-rw-r--r--wiki/inc/lang/zh-tw/jquery.ui.datepicker.js37
-rw-r--r--wiki/inc/lang/zh-tw/lang.php348
-rw-r--r--wiki/inc/lang/zh-tw/locked.txt3
-rw-r--r--wiki/inc/lang/zh-tw/login.txt4
-rw-r--r--wiki/inc/lang/zh-tw/mailtext.txt12
-rw-r--r--wiki/inc/lang/zh-tw/mailwrap.html13
-rw-r--r--wiki/inc/lang/zh-tw/newpage.txt3
-rw-r--r--wiki/inc/lang/zh-tw/norev.txt3
-rw-r--r--wiki/inc/lang/zh-tw/password.txt6
-rw-r--r--wiki/inc/lang/zh-tw/preview.txt4
-rw-r--r--wiki/inc/lang/zh-tw/pwconfirm.txt9
-rw-r--r--wiki/inc/lang/zh-tw/read.txt1
-rw-r--r--wiki/inc/lang/zh-tw/recent.txt5
-rw-r--r--wiki/inc/lang/zh-tw/register.txt3
-rw-r--r--wiki/inc/lang/zh-tw/registermail.txt10
-rw-r--r--wiki/inc/lang/zh-tw/resendpwd.txt3
-rw-r--r--wiki/inc/lang/zh-tw/resetpwd.txt3
-rw-r--r--wiki/inc/lang/zh-tw/revisions.txt3
-rw-r--r--wiki/inc/lang/zh-tw/searchpage.txt4
-rw-r--r--wiki/inc/lang/zh-tw/showrev.txt2
-rw-r--r--wiki/inc/lang/zh-tw/stopwords.txt31
-rw-r--r--wiki/inc/lang/zh-tw/subscr_digest.txt15
-rw-r--r--wiki/inc/lang/zh-tw/subscr_form.txt3
-rw-r--r--wiki/inc/lang/zh-tw/subscr_list.txt12
-rw-r--r--wiki/inc/lang/zh-tw/subscr_single.txt18
-rw-r--r--wiki/inc/lang/zh-tw/updateprofile.txt3
-rw-r--r--wiki/inc/lang/zh-tw/uploadmail.txt10
-rw-r--r--wiki/inc/lang/zh/admin.txt3
-rw-r--r--wiki/inc/lang/zh/adminplugins.txt1
-rw-r--r--wiki/inc/lang/zh/backlinks.txt3
-rw-r--r--wiki/inc/lang/zh/conflict.txt5
-rw-r--r--wiki/inc/lang/zh/denied.txt4
-rw-r--r--wiki/inc/lang/zh/diff.txt3
-rw-r--r--wiki/inc/lang/zh/draft.txt7
-rw-r--r--wiki/inc/lang/zh/edit.txt1
-rw-r--r--wiki/inc/lang/zh/editrev.txt2
-rw-r--r--wiki/inc/lang/zh/index.txt3
-rw-r--r--wiki/inc/lang/zh/install.html8
-rw-r--r--wiki/inc/lang/zh/jquery.ui.datepicker.js37
-rw-r--r--wiki/inc/lang/zh/lang.php370
-rw-r--r--wiki/inc/lang/zh/locked.txt3
-rw-r--r--wiki/inc/lang/zh/login.txt3
-rw-r--r--wiki/inc/lang/zh/mailtext.txt12
-rw-r--r--wiki/inc/lang/zh/mailwrap.html13
-rw-r--r--wiki/inc/lang/zh/newpage.txt3
-rw-r--r--wiki/inc/lang/zh/norev.txt3
-rw-r--r--wiki/inc/lang/zh/password.txt5
-rw-r--r--wiki/inc/lang/zh/preview.txt3
-rw-r--r--wiki/inc/lang/zh/pwconfirm.txt9
-rw-r--r--wiki/inc/lang/zh/read.txt2
-rw-r--r--wiki/inc/lang/zh/recent.txt5
-rw-r--r--wiki/inc/lang/zh/register.txt3
-rw-r--r--wiki/inc/lang/zh/registermail.txt10
-rw-r--r--wiki/inc/lang/zh/resendpwd.txt5
-rw-r--r--wiki/inc/lang/zh/resetpwd.txt3
-rw-r--r--wiki/inc/lang/zh/revisions.txt3
-rw-r--r--wiki/inc/lang/zh/searchpage.txt4
-rw-r--r--wiki/inc/lang/zh/showrev.txt2
-rw-r--r--wiki/inc/lang/zh/stopwords.txt29
-rw-r--r--wiki/inc/lang/zh/subscr_digest.txt15
-rw-r--r--wiki/inc/lang/zh/subscr_form.txt3
-rw-r--r--wiki/inc/lang/zh/subscr_list.txt12
-rw-r--r--wiki/inc/lang/zh/subscr_single.txt18
-rw-r--r--wiki/inc/lang/zh/updateprofile.txt5
-rw-r--r--wiki/inc/lang/zh/uploadmail.txt12
-rw-r--r--wiki/inc/load.php159
-rw-r--r--wiki/inc/mail.php348
-rw-r--r--wiki/inc/media.php2498
-rw-r--r--wiki/inc/pageutils.php775
-rw-r--r--wiki/inc/parser/code.php73
-rw-r--r--wiki/inc/parser/handler.php1811
-rw-r--r--wiki/inc/parser/lexer.php614
-rw-r--r--wiki/inc/parser/metadata.php694
-rw-r--r--wiki/inc/parser/parser.php1034
-rw-r--r--wiki/inc/parser/renderer.php883
-rw-r--r--wiki/inc/parser/xhtml.php1970
-rw-r--r--wiki/inc/parser/xhtmlsummary.php89
-rw-r--r--wiki/inc/parserutils.php790
-rw-r--r--wiki/inc/plugincontroller.class.php347
-rw-r--r--wiki/inc/pluginutils.php136
-rw-r--r--wiki/inc/preload.php.dist17
-rw-r--r--wiki/inc/remote.php357
-rw-r--r--wiki/inc/search.php518
-rw-r--r--wiki/inc/subscription.php693
-rw-r--r--wiki/inc/template.php1873
-rw-r--r--wiki/inc/toolbar.php257
-rw-r--r--wiki/inc/utf8.php1771
2169 files changed, 86680 insertions, 0 deletions
diff --git a/wiki/inc/.htaccess b/wiki/inc/.htaccess
new file mode 100644
index 0000000..2b34c72
--- /dev/null
+++ b/wiki/inc/.htaccess
@@ -0,0 +1,8 @@
+## no access to the inc directory
+<IfModule mod_authz_host>
+    Require all denied
+</IfModule>
+<IfModule !mod_authz_host>
+    Order allow,deny
+    Deny from all
+</IfModule>
diff --git a/wiki/inc/Action/AbstractAclAction.php b/wiki/inc/Action/AbstractAclAction.php
new file mode 100644
index 0000000..871edb0
--- /dev/null
+++ b/wiki/inc/Action/AbstractAclAction.php
@@ -0,0 +1,25 @@
+<?php
+
+namespace dokuwiki\Action;
+
+use dokuwiki\Action\Exception\ActionAclRequiredException;
+
+/**
+ * Class AbstractAclAction
+ *
+ * An action that requires the ACL subsystem to be enabled (eg. useacl=1)
+ *
+ * @package dokuwiki\Action
+ */
+abstract class AbstractAclAction extends AbstractAction {
+
+    /** @inheritdoc */
+    public function checkPreconditions() {
+        parent::checkPreconditions();
+        global $conf;
+        global $auth;
+        if(!$conf['useacl']) throw new ActionAclRequiredException();
+        if(!$auth) throw new ActionAclRequiredException();
+    }
+
+}
diff --git a/wiki/inc/Action/AbstractAction.php b/wiki/inc/Action/AbstractAction.php
new file mode 100644
index 0000000..ea86238
--- /dev/null
+++ b/wiki/inc/Action/AbstractAction.php
@@ -0,0 +1,88 @@
+<?php
+
+namespace dokuwiki\Action;
+
+use dokuwiki\Action\Exception\ActionDisabledException;
+use dokuwiki\Action\Exception\ActionException;
+use dokuwiki\Action\Exception\FatalException;
+
+/**
+ * Class AbstractAction
+ *
+ * Base class for all actions
+ *
+ * @package dokuwiki\Action
+ */
+abstract class AbstractAction {
+
+    /** @var string holds the name of the action (lowercase class name, no namespace) */
+    protected $actionname;
+
+    /**
+     * AbstractAction constructor.
+     *
+     * @param string $actionname the name of this action (see getActionName() for caveats)
+     */
+    public function __construct($actionname = '') {
+        if($actionname !== '') {
+            $this->actionname = $actionname;
+        } else {
+            // http://stackoverflow.com/a/27457689/172068
+            $this->actionname = strtolower(substr(strrchr(get_class($this), '\\'), 1));
+        }
+    }
+
+    /**
+     * Return the minimum permission needed
+     *
+     * This needs to return one of the AUTH_* constants. It will be checked against
+     * the current user and page after checkPermissions() ran through. If it fails,
+     * the user will be shown the Denied action.
+     *
+     * @return int
+     */
+    abstract public function minimumPermission();
+
+    /**
+     * Check conditions are met to run this action
+     *
+     * @throws ActionException
+     * @return void
+     */
+    public function checkPreconditions() {
+    }
+
+    /**
+     * Process data
+     *
+     * This runs before any output is sent to the browser.
+     *
+     * Throw an Exception if a different action should be run after this step.
+     *
+     * @throws ActionException
+     * @return void
+     */
+    public function preProcess() {
+    }
+
+    /**
+     * Output whatever content is wanted within tpl_content();
+     *
+     * @fixme we may want to return a Ui class here
+     */
+    public function tplContent() {
+        throw new FatalException('No content for Action ' . $this->actionname);
+    }
+
+    /**
+     * Returns the name of this action
+     *
+     * This is usually the lowercased class name, but may differ for some actions.
+     * eg. the export_ modes or for the Plugin action.
+     *
+     * @return string
+     */
+    public function getActionName() {
+        return $this->actionname;
+    }
+}
diff --git a/wiki/inc/Action/AbstractAliasAction.php b/wiki/inc/Action/AbstractAliasAction.php
new file mode 100644
index 0000000..7240f5e
--- /dev/null
+++ b/wiki/inc/Action/AbstractAliasAction.php
@@ -0,0 +1,28 @@
+<?php
+
+namespace dokuwiki\Action;
+
+use dokuwiki\Action\Exception\FatalException;
+
+/**
+ * Class AbstractAliasAction
+ *
+ * An action that is an alias for another action. Skips the minimumPermission check
+ *
+ * Be sure to implement preProcess() and throw an ActionAbort exception
+ * with the proper action.
+ *
+ * @package dokuwiki\Action
+ */
+abstract class AbstractAliasAction extends AbstractAction {
+
+    /** @inheritdoc */
+    public function minimumPermission() {
+        return AUTH_NONE;
+    }
+
+    public function preProcess() {
+        throw new FatalException('Alias Actions need to implement preProcess to load the aliased action');
+    }
+
+}
diff --git a/wiki/inc/Action/AbstractUserAction.php b/wiki/inc/Action/AbstractUserAction.php
new file mode 100644
index 0000000..b4e3f1a
--- /dev/null
+++ b/wiki/inc/Action/AbstractUserAction.php
@@ -0,0 +1,25 @@
+<?php
+
+namespace dokuwiki\Action;
+
+use dokuwiki\Action\Exception\ActionUserRequiredException;
+
+/**
+ * Class AbstractUserAction
+ *
+ * An action that requires a logged in user
+ *
+ * @package dokuwiki\Action
+ */
+abstract class AbstractUserAction extends AbstractAclAction {
+
+    /** @inheritdoc */
+    public function checkPreconditions() {
+        parent::checkPreconditions();
+        global $INPUT;
+        if(!$INPUT->server->str('REMOTE_USER')) {
+            throw new ActionUserRequiredException();
+        }
+    }
+
+}
diff --git a/wiki/inc/Action/Admin.php b/wiki/inc/Action/Admin.php
new file mode 100644
index 0000000..8d43057
--- /dev/null
+++ b/wiki/inc/Action/Admin.php
@@ -0,0 +1,56 @@
+<?php
+
+namespace dokuwiki\Action;
+
+use dokuwiki\Action\Exception\ActionException;
+
+/**
+ * Class Admin
+ *
+ * Action to show the admin interface or admin plugins
+ *
+ * @package dokuwiki\Action
+ */
+class Admin extends AbstractUserAction {
+
+    /** @inheritdoc */
+    public function minimumPermission() {
+        global $INFO;
+
+        if($INFO['ismanager']) {
+            return AUTH_READ; // let in check later
+        } else {
+            return AUTH_ADMIN;
+        }
+    }
+
+    public function checkPreconditions() {
+        parent::checkPreconditions();
+
+        global $INFO;
+        if(!$INFO['ismanager']) {
+            throw new ActionException('denied');
+        }
+    }
+
+    public function preProcess() {
+        global $INPUT;
+        global $INFO;
+
+        // retrieve admin plugin name from $_REQUEST['page']
+        if(($page = $INPUT->str('page', '', true)) != '') {
+            /** @var $plugin \DokuWiki_Admin_Plugin */
+            if($plugin = plugin_getRequestAdminPlugin()) { // FIXME this method does also permission checking
+                if($plugin->forAdminOnly() && !$INFO['isadmin']) {
+                    throw new ActionException('denied');
+                }
+                $plugin->handle();
+            }
+        }
+    }
+
+    public function tplContent() {
+        tpl_admin();
+    }
+
+}
diff --git a/wiki/inc/Action/Backlink.php b/wiki/inc/Action/Backlink.php
new file mode 100644
index 0000000..0337917
--- /dev/null
+++ b/wiki/inc/Action/Backlink.php
@@ -0,0 +1,24 @@
+<?php
+
+namespace dokuwiki\Action;
+
+/**
+ * Class Backlink
+ *
+ * Shows which pages link to the current page
+ *
+ * @package dokuwiki\Action
+ */
+class Backlink extends AbstractAction {
+
+    /** @inheritdoc */
+    public function minimumPermission() {
+        return AUTH_NONE;
+    }
+
+    /** @inheritdoc */
+    public function tplContent() {
+        html_backlinks();
+    }
+
+}
diff --git a/wiki/inc/Action/Cancel.php b/wiki/inc/Action/Cancel.php
new file mode 100644
index 0000000..d4d8277
--- /dev/null
+++ b/wiki/inc/Action/Cancel.php
@@ -0,0 +1,25 @@
+<?php
+
+namespace dokuwiki\Action;
+
+use dokuwiki\Action\Exception\ActionAbort;
+
+/**
+ * Class Cancel
+ *
+ * Alias for show. Aborts editing
+ *
+ * @package dokuwiki\Action
+ */
+class Cancel extends AbstractAliasAction {
+
+    /** @inheritdoc */
+    public function preProcess() {
+        global $ID;
+        unlock($ID);
+
+        // continue with draftdel -> redirect -> show
+        throw new ActionAbort('draftdel');
+    }
+
+}
diff --git a/wiki/inc/Action/Check.php b/wiki/inc/Action/Check.php
new file mode 100644
index 0000000..36ae8e8
--- /dev/null
+++ b/wiki/inc/Action/Check.php
@@ -0,0 +1,26 @@
+<?php
+
+namespace dokuwiki\Action;
+
+use dokuwiki\Action\Exception\ActionAbort;
+
+/**
+ * Class Check
+ *
+ * Adds some debugging info before aborting to show
+ *
+ * @package dokuwiki\Action
+ */
+class Check extends AbstractAction {
+
+    /** @inheritdoc */
+    public function minimumPermission() {
+        return AUTH_READ;
+    }
+
+    public function preProcess() {
+        check();
+        throw new ActionAbort();
+    }
+
+}
diff --git a/wiki/inc/Action/Conflict.php b/wiki/inc/Action/Conflict.php
new file mode 100644
index 0000000..d880b5b
--- /dev/null
+++ b/wiki/inc/Action/Conflict.php
@@ -0,0 +1,34 @@
+<?php
+
+namespace dokuwiki\Action;
+
+/**
+ * Class Conflict
+ *
+ * Show the conflict resolution screen
+ *
+ * @package dokuwiki\Action
+ */
+class Conflict extends AbstractAction {
+
+    /** @inheritdoc */
+    public function minimumPermission() {
+        global $INFO;
+        if($INFO['exists']) {
+            return AUTH_EDIT;
+        } else {
+            return AUTH_CREATE;
+        }
+    }
+
+    public function tplContent() {
+        global $PRE;
+        global $TEXT;
+        global $SUF;
+        global $SUM;
+
+        html_conflict(con($PRE, $TEXT, $SUF), $SUM);
+        html_diff(con($PRE, $TEXT, $SUF), false);
+    }
+
+}
diff --git a/wiki/inc/Action/Denied.php b/wiki/inc/Action/Denied.php
new file mode 100644
index 0000000..c8e0192
--- /dev/null
+++ b/wiki/inc/Action/Denied.php
@@ -0,0 +1,23 @@
+<?php
+
+namespace dokuwiki\Action;
+
+/**
+ * Class Denied
+ *
+ * Show the access denied screen
+ *
+ * @package dokuwiki\Action
+ */
+class Denied extends AbstractAclAction {
+
+    /** @inheritdoc */
+    public function minimumPermission() {
+        return AUTH_NONE;
+    }
+
+    public function tplContent() {
+        html_denied();
+    }
+
+}
diff --git a/wiki/inc/Action/Diff.php b/wiki/inc/Action/Diff.php
new file mode 100644
index 0000000..b14b1d0
--- /dev/null
+++ b/wiki/inc/Action/Diff.php
@@ -0,0 +1,35 @@
+<?php
+
+namespace dokuwiki\Action;
+
+/**
+ * Class Diff
+ *
+ * Show the differences between two revisions
+ *
+ * @package dokuwiki\Action
+ */
+class Diff extends AbstractAction {
+
+    /** @inheritdoc */
+    public function minimumPermission() {
+        return AUTH_READ;
+    }
+
+    /** @inheritdoc */
+    public function preProcess() {
+        global $INPUT;
+
+        // store the selected diff type in cookie
+        $difftype = $INPUT->str('difftype');
+        if(!empty($difftype)) {
+            set_doku_pref('difftype', $difftype);
+        }
+    }
+
+    /** @inheritdoc */
+    public function tplContent() {
+        html_diff();
+    }
+
+}
diff --git a/wiki/inc/Action/Draft.php b/wiki/inc/Action/Draft.php
new file mode 100644
index 0000000..caf0870
--- /dev/null
+++ b/wiki/inc/Action/Draft.php
@@ -0,0 +1,39 @@
+<?php
+
+namespace dokuwiki\Action;
+
+use dokuwiki\Action\Exception\ActionException;
+
+/**
+ * Class Draft
+ *
+ * Screen to see and recover a draft
+ *
+ * @package dokuwiki\Action
+ * @fixme combine with Recover?
+ */
+class Draft extends AbstractAction {
+
+    /** @inheritdoc */
+    public function minimumPermission() {
+        global $INFO;
+        if($INFO['exists']) {
+            return AUTH_EDIT;
+        } else {
+            return AUTH_CREATE;
+        }
+    }
+
+    /** @inheritdoc */
+    public function checkPreconditions() {
+        parent::checkPreconditions();
+        global $INFO;
+        if(!file_exists($INFO['draft'])) throw new ActionException('edit');
+    }
+
+    /** @inheritdoc */
+    public function tplContent() {
+        html_draft();
+    }
+
+}
diff --git a/wiki/inc/Action/Draftdel.php b/wiki/inc/Action/Draftdel.php
new file mode 100644
index 0000000..77378f7
--- /dev/null
+++ b/wiki/inc/Action/Draftdel.php
@@ -0,0 +1,36 @@
+<?php
+
+namespace dokuwiki\Action;
+
+use dokuwiki\Action\Exception\ActionAbort;
+
+/**
+ * Class Draftdel
+ *
+ * Delete a draft
+ *
+ * @package dokuwiki\Action
+ */
+class Draftdel extends AbstractAction {
+
+    /** @inheritdoc */
+    public function minimumPermission() {
+        return AUTH_EDIT;
+    }
+
+    /**
+     * Delete an existing draft if any
+     *
+     * Reads draft information from $INFO. Redirects to show, afterwards.
+     *
+     * @throws ActionAbort
+     */
+    public function preProcess() {
+        global $INFO;
+        @unlink($INFO['draft']);
+        $INFO['draft'] = null;
+
+        throw new ActionAbort('redirect');
+    }
+
+}
diff --git a/wiki/inc/Action/Edit.php b/wiki/inc/Action/Edit.php
new file mode 100644
index 0000000..061c9e2
--- /dev/null
+++ b/wiki/inc/Action/Edit.php
@@ -0,0 +1,91 @@
+<?php
+
+namespace dokuwiki\Action;
+
+use dokuwiki\Action\Exception\ActionAbort;
+
+/**
+ * Class Edit
+ *
+ * Handle editing
+ *
+ * @package dokuwiki\Action
+ */
+class Edit extends AbstractAction {
+
+    /** @inheritdoc */
+    public function minimumPermission() {
+        global $INFO;
+        if($INFO['exists']) {
+            return AUTH_READ; // we check again below
+        } else {
+            return AUTH_CREATE;
+        }
+    }
+
+    /**
+     * @inheritdoc falls back to 'source' if page not writable
+     */
+    public function checkPreconditions() {
+        parent::checkPreconditions();
+        global $INFO;
+
+        // no edit permission? view source
+        if($INFO['exists'] && !$INFO['writable']) {
+            throw new ActionAbort('source');
+        }
+    }
+
+    /** @inheritdoc */
+    public function preProcess() {
+        global $ID;
+        global $INFO;
+
+        global $TEXT;
+        global $RANGE;
+        global $PRE;
+        global $SUF;
+        global $REV;
+        global $SUM;
+        global $lang;
+        global $DATE;
+
+        if(!isset($TEXT)) {
+            if($INFO['exists']) {
+                if($RANGE) {
+                    list($PRE, $TEXT, $SUF) = rawWikiSlices($RANGE, $ID, $REV);
+                } else {
+                    $TEXT = rawWiki($ID, $REV);
+                }
+            } else {
+                $TEXT = pageTemplate($ID);
+            }
+        }
+
+        //set summary default
+        if(!$SUM) {
+            if($REV) {
+                $SUM = sprintf($lang['restored'], dformat($REV));
+            } elseif(!$INFO['exists']) {
+                $SUM = $lang['created'];
+            }
+        }
+
+        // Use the date of the newest revision, not of the revision we edit
+        // This is used for conflict detection
+        if(!$DATE) $DATE = @filemtime(wikiFN($ID));
+
+        //check if locked by anyone - if not lock for my self
+        $lockedby = checklock($ID);
+        if($lockedby) {
+            throw new ActionAbort('locked');
+        };
+        lock($ID);
+    }
+
+    /** @inheritdoc */
+    public function tplContent() {
+        html_edit();
+    }
+
+}
diff --git a/wiki/inc/Action/Exception/ActionAbort.php b/wiki/inc/Action/Exception/ActionAbort.php
new file mode 100644
index 0000000..9c188bb
--- /dev/null
+++ b/wiki/inc/Action/Exception/ActionAbort.php
@@ -0,0 +1,20 @@
+<?php
+
+namespace dokuwiki\Action\Exception;
+
+/**
+ * Class ActionAbort
+ *
+ * Strictly speaking not an Exception but an expected execution path. Used to
+ * signal when one action is done and another should take over.
+ *
+ * If you want to signal the same but under some error condition use ActionException
+ * or one of it's decendants.
+ *
+ * The message will NOT be shown to the enduser
+ *
+ * @package dokuwiki\Action\Exception
+ */
+class ActionAbort extends ActionException {
+
+}
diff --git a/wiki/inc/Action/Exception/ActionAclRequiredException.php b/wiki/inc/Action/Exception/ActionAclRequiredException.php
new file mode 100644
index 0000000..64a2c61
--- /dev/null
+++ b/wiki/inc/Action/Exception/ActionAclRequiredException.php
@@ -0,0 +1,17 @@
+<?php
+
+namespace dokuwiki\Action\Exception;
+
+/**
+ * Class ActionAclRequiredException
+ *
+ * Thrown by AbstractACLAction when an action requires that the ACL subsystem is
+ * enabled but it isn't. You should not use it
+ *
+ * The message will NOT be shown to the enduser
+ *
+ * @package dokuwiki\Action\Exception
+ */
+class ActionAclRequiredException extends ActionException {
+
+}
diff --git a/wiki/inc/Action/Exception/ActionDisabledException.php b/wiki/inc/Action/Exception/ActionDisabledException.php
new file mode 100644
index 0000000..40a0c7d
--- /dev/null
+++ b/wiki/inc/Action/Exception/ActionDisabledException.php
@@ -0,0 +1,17 @@
+<?php
+
+namespace dokuwiki\Action\Exception;
+
+/**
+ * Class ActionDisabledException
+ *
+ * Thrown when the requested action has been disabled. Eg. through the 'disableactions'
+ * config setting. You should probably not use it.
+ *
+ * The message will NOT be shown to the enduser, but a generic information will be shown.
+ *
+ * @package dokuwiki\Action\Exception
+ */
+class ActionDisabledException extends ActionException {
+
+}
diff --git a/wiki/inc/Action/Exception/ActionException.php b/wiki/inc/Action/Exception/ActionException.php
new file mode 100644
index 0000000..381584c
--- /dev/null
+++ b/wiki/inc/Action/Exception/ActionException.php
@@ -0,0 +1,66 @@
+<?php
+
+namespace dokuwiki\Action\Exception;
+
+/**
+ * Class ActionException
+ *
+ * This exception and its subclasses signal that the current action should be
+ * aborted and a different action should be used instead. The new action can
+ * be given as parameter in the constructor. Defaults to 'show'
+ *
+ * The message will NOT be shown to the enduser
+ *
+ * @package dokuwiki\Action\Exception
+ */
+class ActionException extends \Exception {
+
+    /** @var string the new action */
+    protected $newaction;
+
+    /** @var bool should the exception's message be shown to the user? */
+    protected $displayToUser = false;
+
+    /**
+     * ActionException constructor.
+     *
+     * When no new action is given 'show' is assumed. For requests that originated in a POST,
+     * a 'redirect' is used which will cause a redirect to the 'show' action.
+     *
+     * @param string|null $newaction the action that should be used next
+     * @param string $message optional message, will not be shown except for some dub classes
+     */
+    public function __construct($newaction = null, $message = '') {
+        global $INPUT;
+        parent::__construct($message);
+        if(is_null($newaction)) {
+            if(strtolower($INPUT->server->str('REQUEST_METHOD')) == 'post') {
+                $newaction = 'redirect';
+            } else {
+                $newaction = 'show';
+            }
+        }
+
+        $this->newaction = $newaction;
+    }
+
+    /**
+     * Returns the action to use next
+     *
+     * @return string
+     */
+    public function getNewAction() {
+        return $this->newaction;
+    }
+
+    /**
+     * Should this Exception's message be shown to the user?
+     *
+     * @param null|bool $set when null is given, the current setting is not changed
+     * @return bool
+     */
+    public function displayToUser($set = null) {
+        if(!is_null($set)) $this->displayToUser = $set;
+        return $set;
+    }
+}
diff --git a/wiki/inc/Action/Exception/ActionUserRequiredException.php b/wiki/inc/Action/Exception/ActionUserRequiredException.php
new file mode 100644
index 0000000..aab06cc
--- /dev/null
+++ b/wiki/inc/Action/Exception/ActionUserRequiredException.php
@@ -0,0 +1,17 @@
+<?php
+
+namespace dokuwiki\Action\Exception;
+
+/**
+ * Class ActionUserRequiredException
+ *
+ * Thrown by AbstractUserAction when an action requires that a user is logged
+ * in but it isn't. You should not use it.
+ *
+ * The message will NOT be shown to the enduser
+ *
+ * @package dokuwiki\Action\Exception
+ */
+class ActionUserRequiredException extends ActionException {
+
+}
diff --git a/wiki/inc/Action/Exception/FatalException.php b/wiki/inc/Action/Exception/FatalException.php
new file mode 100644
index 0000000..5f2516f
--- /dev/null
+++ b/wiki/inc/Action/Exception/FatalException.php
@@ -0,0 +1,29 @@
+<?php
+
+namespace dokuwiki\Action\Exception;
+
+/**
+ * Class FatalException
+ *
+ * A fatal exception during handling the action
+ *
+ * Will abort all handling and display some info to the user. The HTTP status code
+ * can be defined.
+ *
+ * @package dokuwiki\Action\Exception
+ */
+class FatalException extends \Exception {
+
+    protected $status;
+
+    /**
+     * FatalException constructor.
+     *
+     * @param string $message the message to send
+     * @param int $status the HTTP status to send
+     * @param null|\Exception $previous previous exception
+     */
+    public function __construct($message = 'A fatal error occured', $status = 500, $previous = null) {
+        parent::__construct($message, $status, $previous);
+    }
+}
diff --git a/wiki/inc/Action/Exception/NoActionException.php b/wiki/inc/Action/Exception/NoActionException.php
new file mode 100644
index 0000000..1c4e4d0
--- /dev/null
+++ b/wiki/inc/Action/Exception/NoActionException.php
@@ -0,0 +1,15 @@
+<?php
+
+namespace dokuwiki\Action\Exception;
+
+/**
+ * Class NoActionException
+ *
+ * Thrown in the ActionRouter when a wanted action can not be found. Triggers
+ * the unknown action event
+ *
+ * @package dokuwiki\Action\Exception
+ */
+class NoActionException extends \Exception {
+
+}
diff --git a/wiki/inc/Action/Export.php b/wiki/inc/Action/Export.php
new file mode 100644
index 0000000..1eec27e
--- /dev/null
+++ b/wiki/inc/Action/Export.php
@@ -0,0 +1,112 @@
+<?php
+
+namespace dokuwiki\Action;
+
+use dokuwiki\Action\Exception\ActionAbort;
+
+/**
+ * Class Export
+ *
+ * Handle exporting by calling the appropriate renderer
+ *
+ * @package dokuwiki\Action
+ */
+class Export extends AbstractAction {
+
+    /** @inheritdoc */
+    public function minimumPermission() {
+        return AUTH_READ;
+    }
+
+    /**
+     * Export a wiki page for various formats
+     *
+     * Triggers ACTION_EXPORT_POSTPROCESS
+     *
+     *  Event data:
+     *    data['id']      -- page id
+     *    data['mode']    -- requested export mode
+     *    data['headers'] -- export headers
+     *    data['output']  -- export output
+     *
+     * @author Andreas Gohr <andi@splitbrain.org>
+     * @author Michael Klier <chi@chimeric.de>
+     * @inheritdoc
+     */
+    public function preProcess() {
+        global $ID;
+        global $REV;
+        global $conf;
+        global $lang;
+
+        $pre = '';
+        $post = '';
+        $headers = array();
+
+        // search engines: never cache exported docs! (Google only currently)
+        $headers['X-Robots-Tag'] = 'noindex';
+
+        $mode = substr($this->actionname, 7);
+        switch($mode) {
+            case 'raw':
+                $headers['Content-Type'] = 'text/plain; charset=utf-8';
+                $headers['Content-Disposition'] = 'attachment; filename=' . noNS($ID) . '.txt';
+                $output = rawWiki($ID, $REV);
+                break;
+            case 'xhtml':
+                $pre .= '<!DOCTYPE html>' . DOKU_LF;
+                $pre .= '<html lang="' . $conf['lang'] . '" dir="' . $lang['direction'] . '">' . DOKU_LF;
+                $pre .= '<head>' . DOKU_LF;
+                $pre .= '  <meta charset="utf-8" />' . DOKU_LF; // FIXME improve wrapper
+                $pre .= '  <title>' . $ID . '</title>' . DOKU_LF;
+
+                // get metaheaders
+                ob_start();
+                tpl_metaheaders();
+                $pre .= ob_get_clean();
+
+                $pre .= '</head>' . DOKU_LF;
+                $pre .= '<body>' . DOKU_LF;
+                $pre .= '<div class="dokuwiki export">' . DOKU_LF;
+
+                // get toc
+                $pre .= tpl_toc(true);
+
+                $headers['Content-Type'] = 'text/html; charset=utf-8';
+                $output = p_wiki_xhtml($ID, $REV, false);
+
+                $post .= '</div>' . DOKU_LF;
+                $post .= '</body>' . DOKU_LF;
+                $post .= '</html>' . DOKU_LF;
+                break;
+            case 'xhtmlbody':
+                $headers['Content-Type'] = 'text/html; charset=utf-8';
+                $output = p_wiki_xhtml($ID, $REV, false);
+                break;
+            default:
+                $output = p_cached_output(wikiFN($ID, $REV), $mode, $ID);
+                $headers = p_get_metadata($ID, "format $mode");
+                break;
+        }
+
+        // prepare event data
+        $data = array();
+        $data['id'] = $ID;
+        $data['mode'] = $mode;
+        $data['headers'] = $headers;
+        $data['output'] =& $output;
+
+        trigger_event('ACTION_EXPORT_POSTPROCESS', $data);
+
+        if(!empty($data['output'])) {
+            if(is_array($data['headers'])) foreach($data['headers'] as $key => $val) {
+                header("$key: $val");
+            }
+            print $pre . $data['output'] . $post;
+            exit;
+        }
+
+        throw new ActionAbort();
+    }
+
+}
diff --git a/wiki/inc/Action/Index.php b/wiki/inc/Action/Index.php
new file mode 100644
index 0000000..c87a3f8
--- /dev/null
+++ b/wiki/inc/Action/Index.php
@@ -0,0 +1,25 @@
+<?php
+
+namespace dokuwiki\Action;
+
+/**
+ * Class Index
+ *
+ * Show the human readable sitemap. Do not confuse with Sitemap
+ *
+ * @package dokuwiki\Action
+ */
+class Index extends AbstractAction {
+
+    /** @inheritdoc */
+    public function minimumPermission() {
+        return AUTH_NONE;
+    }
+
+    /** @inheritdoc */
+    public function tplContent() {
+        global $IDX;
+        html_index($IDX);
+    }
+
+}
diff --git a/wiki/inc/Action/Locked.php b/wiki/inc/Action/Locked.php
new file mode 100644
index 0000000..3ff2c5b
--- /dev/null
+++ b/wiki/inc/Action/Locked.php
@@ -0,0 +1,24 @@
+<?php
+
+namespace dokuwiki\Action;
+
+/**
+ * Class Locked
+ *
+ * Show a locked screen when a page is locked
+ *
+ * @package dokuwiki\Action
+ */
+class Locked extends AbstractAction {
+
+    /** @inheritdoc */
+    public function minimumPermission() {
+        return AUTH_READ;
+    }
+
+    /** @inheritdoc */
+    public function tplContent() {
+        html_locked();
+    }
+
+}
diff --git a/wiki/inc/Action/Login.php b/wiki/inc/Action/Login.php
new file mode 100644
index 0000000..7f903ff
--- /dev/null
+++ b/wiki/inc/Action/Login.php
@@ -0,0 +1,36 @@
+<?php
+
+namespace dokuwiki\Action;
+
+use dokuwiki\Action\Exception\ActionException;
+
+/**
+ * Class Login
+ *
+ * The login form. Actual logins are handled in inc/auth.php
+ *
+ * @package dokuwiki\Action
+ */
+class Login extends AbstractAclAction {
+
+    /** @inheritdoc */
+    public function minimumPermission() {
+        return AUTH_NONE;
+    }
+
+    /** @inheritdoc */
+    public function checkPreconditions() {
+        global $INPUT;
+        parent::checkPreconditions();
+        if($INPUT->server->has('REMOTE_USER')) {
+            // nothing to do
+            throw new ActionException();
+        }
+    }
+
+    /** @inheritdoc */
+    public function tplContent() {
+        html_login();
+    }
+
+}
diff --git a/wiki/inc/Action/Logout.php b/wiki/inc/Action/Logout.php
new file mode 100644
index 0000000..1590904
--- /dev/null
+++ b/wiki/inc/Action/Logout.php
@@ -0,0 +1,50 @@
+<?php
+
+namespace dokuwiki\Action;
+
+use dokuwiki\Action\Exception\ActionDisabledException;
+use dokuwiki\Action\Exception\ActionException;
+
+/**
+ * Class Logout
+ *
+ * Log out a user
+ *
+ * @package dokuwiki\Action
+ */
+class Logout extends AbstractUserAction {
+
+    /** @inheritdoc */
+    public function minimumPermission() {
+        return AUTH_NONE;
+    }
+
+    /** @inheritdoc */
+    public function checkPreconditions() {
+        parent::checkPreconditions();
+
+        /** @var \DokuWiki_Auth_Plugin $auth */
+        global $auth;
+        if(!$auth->canDo('logout')) throw new ActionDisabledException();
+    }
+
+    /** @inheritdoc */
+    public function preProcess() {
+        global $ID;
+        global $INPUT;
+
+        // when logging out during an edit session, unlock the page
+        $lockedby = checklock($ID);
+        if($lockedby == $INPUT->server->str('REMOTE_USER')) {
+            unlock($ID);
+        }
+
+        // do the logout stuff and redirect to login
+        auth_logoff();
+        send_redirect(wl($ID, array('do' => 'login')));
+
+        // should never be reached
+        throw new ActionException('login');
+    }
+
+}
diff --git a/wiki/inc/Action/Media.php b/wiki/inc/Action/Media.php
new file mode 100644
index 0000000..77a2a6f
--- /dev/null
+++ b/wiki/inc/Action/Media.php
@@ -0,0 +1,24 @@
+<?php
+
+namespace dokuwiki\Action;
+
+/**
+ * Class Media
+ *
+ * The full screen media manager
+ *
+ * @package dokuwiki\Action
+ */
+class Media extends AbstractAction {
+
+    /** @inheritdoc */
+    public function minimumPermission() {
+        return AUTH_READ;
+    }
+
+    /** @inheritdoc */
+    public function tplContent() {
+        tpl_media();
+    }
+
+}
diff --git a/wiki/inc/Action/Plugin.php b/wiki/inc/Action/Plugin.php
new file mode 100644
index 0000000..c3e16bf
--- /dev/null
+++ b/wiki/inc/Action/Plugin.php
@@ -0,0 +1,32 @@
+<?php
+
+namespace dokuwiki\Action;
+
+/**
+ * Class Plugin
+ *
+ * Used to run action plugins
+ *
+ * @package dokuwiki\Action
+ */
+class Plugin extends AbstractAction {
+
+    /** @inheritdoc */
+    public function minimumPermission() {
+        return AUTH_NONE;
+    }
+
+    /**
+     * Outputs nothing but a warning unless an action plugin overwrites it
+     *
+     * @inheritdoc
+     * @triggers TPL_ACT_UNKNOWN
+     */
+    public function tplContent() {
+        $evt = new \Doku_Event('TPL_ACT_UNKNOWN', $this->actionname);
+        if($evt->advise_before()) {
+            msg('Failed to handle action: ' . hsc($this->actionname), -1);
+        }
+        $evt->advise_after();
+    }
+}
diff --git a/wiki/inc/Action/Preview.php b/wiki/inc/Action/Preview.php
new file mode 100644
index 0000000..850b204
--- /dev/null
+++ b/wiki/inc/Action/Preview.php
@@ -0,0 +1,58 @@
+<?php
+
+namespace dokuwiki\Action;
+
+/**
+ * Class Preview
+ *
+ * preview during editing
+ *
+ * @package dokuwiki\Action
+ */
+class Preview extends Edit {
+
+    /** @inheritdoc */
+    public function preProcess() {
+        header('X-XSS-Protection: 0');
+        $this->savedraft();
+        parent::preProcess();
+    }
+
+    /** @inheritdoc */
+    public function tplContent() {
+        global $TEXT;
+        html_edit();
+        html_show($TEXT);
+    }
+
+    /**
+     * Saves a draft on preview
+     */
+    protected function savedraft() {
+        global $INFO;
+        global $ID;
+        global $INPUT;
+        global $conf;
+
+        if(!$conf['usedraft']) return;
+        if(!$INPUT->post->has('wikitext')) return;
+
+        // ensure environment (safeguard when used via AJAX)
+        assert(isset($INFO['client']), 'INFO.client should have been set');
+        assert(isset($ID), 'ID should have been set');
+
+        $draft = array(
+            'id' => $ID,
+            'prefix' => substr($INPUT->post->str('prefix'), 0, -1),
+            'text' => $INPUT->post->str('wikitext'),
+            'suffix' => $INPUT->post->str('suffix'),
+            'date' => $INPUT->post->int('date'),
+            'client' => $INFO['client'],
+        );
+        $cname = getCacheName($draft['client'] . $ID, '.draft');
+        if(io_saveFile($cname, serialize($draft))) {
+            $INFO['draft'] = $cname;
+        }
+    }
+
+}
diff --git a/wiki/inc/Action/Profile.php b/wiki/inc/Action/Profile.php
new file mode 100644
index 0000000..53d8d2f
--- /dev/null
+++ b/wiki/inc/Action/Profile.php
@@ -0,0 +1,45 @@
+<?php
+
+namespace dokuwiki\Action;
+
+use dokuwiki\Action\Exception\ActionAbort;
+use dokuwiki\Action\Exception\ActionDisabledException;
+
+/**
+ * Class Profile
+ *
+ * Handle the profile form
+ *
+ * @package dokuwiki\Action
+ */
+class Profile extends AbstractUserAction {
+
+    /** @inheritdoc */
+    public function minimumPermission() {
+        return AUTH_NONE;
+    }
+
+    /** @inheritdoc */
+    public function checkPreconditions() {
+        parent::checkPreconditions();
+
+        /** @var \DokuWiki_Auth_Plugin $auth */
+        global $auth;
+        if(!$auth->canDo('Profile')) throw new ActionDisabledException();
+    }
+
+    /** @inheritdoc */
+    public function preProcess() {
+        global $lang;
+        if(updateprofile()) {
+            msg($lang['profchanged'], 1);
+            throw new ActionAbort('show');
+        }
+    }
+
+    /** @inheritdoc */
+    public function tplContent() {
+        html_updateprofile();
+    }
+
+}
diff --git a/wiki/inc/Action/ProfileDelete.php b/wiki/inc/Action/ProfileDelete.php
new file mode 100644
index 0000000..995f813
--- /dev/null
+++ b/wiki/inc/Action/ProfileDelete.php
@@ -0,0 +1,42 @@
+<?php
+
+namespace dokuwiki\Action;
+
+use dokuwiki\Action\Exception\ActionAbort;
+use dokuwiki\Action\Exception\ActionDisabledException;
+
+/**
+ * Class ProfileDelete
+ *
+ * Delete a user account
+ *
+ * @package dokuwiki\Action
+ */
+class ProfileDelete extends AbstractUserAction {
+
+    /** @inheritdoc */
+    public function minimumPermission() {
+        return AUTH_NONE;
+    }
+
+    /** @inheritdoc */
+    public function checkPreconditions() {
+        parent::checkPreconditions();
+
+        /** @var \DokuWiki_Auth_Plugin $auth */
+        global $auth;
+        if(!$auth->canDo('delUser')) throw new ActionDisabledException();
+    }
+
+    /** @inheritdoc */
+    public function preProcess() {
+        global $lang;
+        if(auth_deleteprofile()) {
+            msg($lang['profdeleted'], 1);
+            throw new ActionAbort('show');
+        } else {
+            throw new ActionAbort('profile');
+        }
+    }
+
+}
diff --git a/wiki/inc/Action/Recent.php b/wiki/inc/Action/Recent.php
new file mode 100644
index 0000000..9273d52
--- /dev/null
+++ b/wiki/inc/Action/Recent.php
@@ -0,0 +1,40 @@
+<?php
+
+namespace dokuwiki\Action;
+
+/**
+ * Class Recent
+ *
+ * The recent changes view
+ *
+ * @package dokuwiki\Action
+ */
+class Recent extends AbstractAction {
+
+    /** @var string what type of changes to show */
+    protected $showType = 'both';
+
+    /** @inheritdoc */
+    public function minimumPermission() {
+        return AUTH_NONE;
+    }
+
+    /** @inheritdoc */
+    public function preProcess() {
+        global $INPUT;
+        $show_changes = $INPUT->str('show_changes');
+        if(!empty($show_changes)) {
+            set_doku_pref('show_changes', $show_changes);
+            $this->showType = $show_changes;
+        } else {
+            $this->showType = get_doku_pref('show_changes', 'both');
+        }
+    }
+
+    /** @inheritdoc */
+    public function tplContent() {
+        global $INPUT;
+        html_recent((int) $INPUT->extract('first')->int('first'), $this->showType);
+    }
+
+}
diff --git a/wiki/inc/Action/Recover.php b/wiki/inc/Action/Recover.php
new file mode 100644
index 0000000..7966396
--- /dev/null
+++ b/wiki/inc/Action/Recover.php
@@ -0,0 +1,21 @@
+<?php
+
+namespace dokuwiki\Action;
+
+use dokuwiki\Action\Exception\ActionAbort;
+
+/**
+ * Class Recover
+ *
+ * Recover a draft
+ *
+ * @package dokuwiki\Action
+ */
+class Recover extends AbstractAliasAction {
+
+    /** @inheritdoc */
+    public function preProcess() {
+        throw new ActionAbort('edit');
+    }
+
+}
diff --git a/wiki/inc/Action/Redirect.php b/wiki/inc/Action/Redirect.php
new file mode 100644
index 0000000..2e28f45
--- /dev/null
+++ b/wiki/inc/Action/Redirect.php
@@ -0,0 +1,64 @@
+<?php
+
+namespace dokuwiki\Action;
+
+use dokuwiki\Action\Exception\ActionAbort;
+
+/**
+ * Class Redirect
+ *
+ * Used to redirect to the current page with the last edited section as a target if found
+ *
+ * @package dokuwiki\Action
+ */
+class Redirect extends AbstractAliasAction {
+
+    /**
+     * Redirect to the show action, trying to jump to the previously edited section
+     *
+     * @triggers ACTION_SHOW_REDIRECT
+     * @throws ActionAbort
+     */
+    public function preProcess() {
+        global $PRE;
+        global $TEXT;
+        global $INPUT;
+        global $ID;
+        global $ACT;
+
+        $opts = array(
+            'id' => $ID,
+            'preact' => $ACT
+        );
+        //get section name when coming from section edit
+        if($INPUT->has('hid')) {
+            // Use explicitly transmitted header id
+            $opts['fragment'] = $INPUT->str('hid');
+        } else if($PRE && preg_match('/^\s*==+([^=\n]+)/', $TEXT, $match)) {
+            // Fallback to old mechanism
+            $check = false; //Byref
+            $opts['fragment'] = sectionID($match[0], $check);
+        }
+
+        // execute the redirect
+        trigger_event('ACTION_SHOW_REDIRECT', $opts, array($this, 'redirect'));
+
+        // should never be reached
+        throw new ActionAbort('show');
+    }
+
+    /**
+     * Execute the redirect
+     *
+     * Default action for ACTION_SHOW_REDIRECT
+     *
+     * @param array $opts id and fragment for the redirect and the preact
+     */
+    public function redirect($opts) {
+        $go = wl($opts['id'], '', true);
+        if(isset($opts['fragment'])) $go .= '#' . $opts['fragment'];
+
+        //show it
+        send_redirect($go);
+    }
+}
diff --git a/wiki/inc/Action/Register.php b/wiki/inc/Action/Register.php
new file mode 100644
index 0000000..0d54158
--- /dev/null
+++ b/wiki/inc/Action/Register.php
@@ -0,0 +1,45 @@
+<?php
+
+namespace dokuwiki\Action;
+
+use dokuwiki\Action\Exception\ActionAbort;
+use dokuwiki\Action\Exception\ActionDisabledException;
+
+/**
+ * Class Register
+ *
+ * Self registering a new user
+ *
+ * @package dokuwiki\Action
+ */
+class Register extends AbstractAclAction {
+
+    /** @inheritdoc */
+    public function minimumPermission() {
+        return AUTH_NONE;
+    }
+
+    /** @inheritdoc */
+    public function checkPreconditions() {
+        parent::checkPreconditions();
+
+        /** @var \DokuWiki_Auth_Plugin $auth */
+        global $auth;
+        global $conf;
+        if(isset($conf['openregister']) && !$conf['openregister']) throw new ActionDisabledException();
+        if(!$auth->canDo('addUser')) throw new ActionDisabledException();
+    }
+
+    /** @inheritdoc */
+    public function preProcess() {
+        if(register()) { // FIXME could be moved from auth to here
+            throw new ActionAbort('login');
+        }
+    }
+
+    /** @inheritdoc */
+    public function tplContent() {
+        html_register();
+    }
+
+}
diff --git a/wiki/inc/Action/Resendpwd.php b/wiki/inc/Action/Resendpwd.php
new file mode 100644
index 0000000..5b5e381
--- /dev/null
+++ b/wiki/inc/Action/Resendpwd.php
@@ -0,0 +1,177 @@
+<?php
+
+namespace dokuwiki\Action;
+
+use dokuwiki\Action\Exception\ActionAbort;
+use dokuwiki\Action\Exception\ActionDisabledException;
+
+/**
+ * Class Resendpwd
+ *
+ * Handle password recovery
+ *
+ * @package dokuwiki\Action
+ */
+class Resendpwd extends AbstractAclAction {
+
+    /** @inheritdoc */
+    public function minimumPermission() {
+        return AUTH_NONE;
+    }
+
+    /** @inheritdoc */
+    public function checkPreconditions() {
+        parent::checkPreconditions();
+
+        /** @var \DokuWiki_Auth_Plugin $auth */
+        global $auth;
+        global $conf;
+        if(isset($conf['resendpasswd']) && !$conf['resendpasswd']) throw new ActionDisabledException(); //legacy option
+        if(!$auth->canDo('modPass')) throw new ActionDisabledException();
+    }
+
+    /** @inheritdoc */
+    public function preProcess() {
+        if($this->resendpwd()) {
+            throw new ActionAbort('login');
+        }
+    }
+
+    /** @inheritdoc */
+    public function tplContent() {
+        html_resendpwd();
+    }
+
+    /**
+     * Send a  new password
+     *
+     * This function handles both phases of the password reset:
+     *
+     *   - handling the first request of password reset
+     *   - validating the password reset auth token
+     *
+     * @author Benoit Chesneau <benoit@bchesneau.info>
+     * @author Chris Smith <chris@jalakai.co.uk>
+     * @author Andreas Gohr <andi@splitbrain.org>
+     * @fixme this should be split up into multiple methods
+     * @return bool true on success, false on any error
+     */
+    protected function resendpwd() {
+        global $lang;
+        global $conf;
+        /* @var \DokuWiki_Auth_Plugin $auth */
+        global $auth;
+        global $INPUT;
+
+        if(!actionOK('resendpwd')) {
+            msg($lang['resendna'], -1);
+            return false;
+        }
+
+        $token = preg_replace('/[^a-f0-9]+/', '', $INPUT->str('pwauth'));
+
+        if($token) {
+            // we're in token phase - get user info from token
+
+            $tfile = $conf['cachedir'] . '/' . $token{0} . '/' . $token . '.pwauth';
+            if(!file_exists($tfile)) {
+                msg($lang['resendpwdbadauth'], -1);
+                $INPUT->remove('pwauth');
+                return false;
+            }
+            // token is only valid for 3 days
+            if((time() - filemtime($tfile)) > (3 * 60 * 60 * 24)) {
+                msg($lang['resendpwdbadauth'], -1);
+                $INPUT->remove('pwauth');
+                @unlink($tfile);
+                return false;
+            }
+
+            $user = io_readfile($tfile);
+            $userinfo = $auth->getUserData($user, $requireGroups = false);
+            if(!$userinfo['mail']) {
+                msg($lang['resendpwdnouser'], -1);
+                return false;
+            }
+
+            if(!$conf['autopasswd']) { // we let the user choose a password
+                $pass = $INPUT->str('pass');
+
+                // password given correctly?
+                if(!$pass) return false;
+                if($pass != $INPUT->str('passchk')) {
+                    msg($lang['regbadpass'], -1);
+                    return false;
+                }
+
+                // change it
+                if(!$auth->triggerUserMod('modify', array($user, array('pass' => $pass)))) {
+                    msg($lang['proffail'], -1);
+                    return false;
+                }
+
+            } else { // autogenerate the password and send by mail
+
+                $pass = auth_pwgen($user);
+                if(!$auth->triggerUserMod('modify', array($user, array('pass' => $pass)))) {
+                    msg($lang['proffail'], -1);
+                    return false;
+                }
+
+                if(auth_sendPassword($user, $pass)) {
+                    msg($lang['resendpwdsuccess'], 1);
+                } else {
+                    msg($lang['regmailfail'], -1);
+                }
+            }
+
+            @unlink($tfile);
+            return true;
+
+        } else {
+            // we're in request phase
+
+            if(!$INPUT->post->bool('save')) return false;
+
+            if(!$INPUT->post->str('login')) {
+                msg($lang['resendpwdmissing'], -1);
+                return false;
+            } else {
+                $user = trim($auth->cleanUser($INPUT->post->str('login')));
+            }
+
+            $userinfo = $auth->getUserData($user, $requireGroups = false);
+            if(!$userinfo['mail']) {
+                msg($lang['resendpwdnouser'], -1);
+                return false;
+            }
+
+            // generate auth token
+            $token = md5(auth_randombytes(16)); // random secret
+            $tfile = $conf['cachedir'] . '/' . $token{0} . '/' . $token . '.pwauth';
+            $url = wl('', array('do' => 'resendpwd', 'pwauth' => $token), true, '&');
+
+            io_saveFile($tfile, $user);
+
+            $text = rawLocale('pwconfirm');
+            $trep = array(
+                'FULLNAME' => $userinfo['name'],
+                'LOGIN' => $user,
+                'CONFIRM' => $url
+            );
+
+            $mail = new \Mailer();
+            $mail->to($userinfo['name'] . ' <' . $userinfo['mail'] . '>');
+            $mail->subject($lang['regpwmail']);
+            $mail->setBody($text, $trep);
+            if($mail->send()) {
+                msg($lang['resendpwdconfirm'], 1);
+            } else {
+                msg($lang['regmailfail'], -1);
+            }
+            return true;
+        }
+        // never reached
+    }
+
+}
diff --git a/wiki/inc/Action/Revert.php b/wiki/inc/Action/Revert.php
new file mode 100644
index 0000000..ca35374
--- /dev/null
+++ b/wiki/inc/Action/Revert.php
@@ -0,0 +1,65 @@
+<?php
+
+namespace dokuwiki\Action;
+
+use dokuwiki\Action\Exception\ActionAbort;
+use dokuwiki\Action\Exception\ActionException;
+
+/**
+ * Class Revert
+ *
+ * Quick revert to an old revision
+ *
+ * @package dokuwiki\Action
+ */
+class Revert extends AbstractAction {
+
+    /** @inheritdoc */
+    public function minimumPermission() {
+        global $INFO;
+        if($INFO['ismanager']) {
+            return AUTH_EDIT;
+        } else {
+            return AUTH_ADMIN;
+        }
+    }
+
+    /**
+     *
+     * @inheritdoc
+     * @throws ActionAbort
+     * @throws ActionException
+     * @todo check for writability of the current page ($INFO might do it wrong and check the attic version)
+     */
+    public function preProcess() {
+        if(!checkSecurityToken()) throw new ActionException();
+
+        global $ID;
+        global $REV;
+        global $lang;
+
+        // when no revision is given, delete current one
+        // FIXME this feature is not exposed in the GUI currently
+        $text = '';
+        $sum = $lang['deleted'];
+        if($REV) {
+            $text = rawWiki($ID, $REV);
+            if(!$text) throw new ActionException(); //something went wrong
+            $sum = sprintf($lang['restored'], dformat($REV));
+        }
+
+        // spam check
+        if(checkwordblock($text)) {
+            msg($lang['wordblock'], -1);
+            throw new ActionException('edit');
+        }
+
+        saveWikiText($ID, $text, $sum, false);
+        msg($sum, 1);
+        $REV = '';
+
+        // continue with draftdel -> redirect -> show
+        throw new ActionAbort('draftdel');
+    }
+
+}
diff --git a/wiki/inc/Action/Revisions.php b/wiki/inc/Action/Revisions.php
new file mode 100644
index 0000000..b8db531
--- /dev/null
+++ b/wiki/inc/Action/Revisions.php
@@ -0,0 +1,24 @@
+<?php
+
+namespace dokuwiki\Action;
+
+/**
+ * Class Revisions
+ *
+ * Show the list of old revisions of the current page
+ *
+ * @package dokuwiki\Action
+ */
+class Revisions extends AbstractAction {
+
+    /** @inheritdoc */
+    public function minimumPermission() {
+        return AUTH_READ;
+    }
+
+    /** @inheritdoc */
+    public function tplContent() {
+        global $INPUT;
+        html_revisions($INPUT->int('first'));
+    }
+}
diff --git a/wiki/inc/Action/Save.php b/wiki/inc/Action/Save.php
new file mode 100644
index 0000000..0b24729
--- /dev/null
+++ b/wiki/inc/Action/Save.php
@@ -0,0 +1,60 @@
+<?php
+
+namespace dokuwiki\Action;
+
+use dokuwiki\Action\Exception\ActionAbort;
+use dokuwiki\Action\Exception\ActionException;
+
+/**
+ * Class Save
+ *
+ * Save at the end of an edit session
+ *
+ * @package dokuwiki\Action
+ */
+class Save extends AbstractAction {
+
+    /** @inheritdoc */
+    public function minimumPermission() {
+        global $INFO;
+        if($INFO['exists']) {
+            return AUTH_EDIT;
+        } else {
+            return AUTH_CREATE;
+        }
+    }
+
+    /** @inheritdoc */
+    public function preProcess() {
+        if(!checkSecurityToken()) throw new ActionException('preview');
+
+        global $ID;
+        global $DATE;
+        global $PRE;
+        global $TEXT;
+        global $SUF;
+        global $SUM;
+        global $lang;
+        global $INFO;
+        global $INPUT;
+
+        //spam check
+        if(checkwordblock()) {
+            msg($lang['wordblock'], -1);
+            throw new ActionException('edit');
+        }
+        //conflict check
+        if($DATE != 0 && $INFO['meta']['date']['modified'] > $DATE) {
+            throw new ActionException('conflict');
+        }
+
+        //save it
+        saveWikiText($ID, con($PRE, $TEXT, $SUF, true), $SUM, $INPUT->bool('minor')); //use pretty mode for con
+        //unlock it
+        unlock($ID);
+
+        // continue with draftdel -> redirect -> show
+        throw new ActionAbort('draftdel');
+    }
+
+}
diff --git a/wiki/inc/Action/Search.php b/wiki/inc/Action/Search.php
new file mode 100644
index 0000000..382fc47
--- /dev/null
+++ b/wiki/inc/Action/Search.php
@@ -0,0 +1,135 @@
+<?php
+
+namespace dokuwiki\Action;
+
+use dokuwiki\Action\Exception\ActionAbort;
+
+/**
+ * Class Search
+ *
+ * Search for pages and content
+ *
+ * @package dokuwiki\Action
+ */
+class Search extends AbstractAction {
+
+    protected $pageLookupResults = array();
+    protected $fullTextResults = array();
+    protected $highlight = array();
+
+    /** @inheritdoc */
+    public function minimumPermission() {
+        return AUTH_NONE;
+    }
+
+    /**
+     * we only search if a search word was given
+     *
+     * @inheritdoc
+     */
+    public function checkPreconditions() {
+        parent::checkPreconditions();
+    }
+
+    public function preProcess()
+    {
+        global $QUERY, $ID, $conf, $INPUT;
+        $s = cleanID($QUERY);
+
+        if ($ID !== $conf['start'] && !$INPUT->has('q')) {
+            parse_str($INPUT->server->str('QUERY_STRING'), $urlParts);
+            $urlParts['q'] = $urlParts['id'];
+            $urlParts['id'] = $conf['start'];
+            $url = DOKU_URL . DOKU_SCRIPT . '?' . http_build_query($urlParts, null, '&');
+            send_redirect($url);
+        }
+
+        if ($s === '') throw new ActionAbort();
+        $this->adjustGlobalQuery();
+    }
+
+    /** @inheritdoc */
+    public function tplContent()
+    {
+        $this->execute();
+
+        $search = new \dokuwiki\Ui\Search($this->pageLookupResults, $this->fullTextResults, $this->highlight);
+        $search->show();
+    }
+
+
+    /**
+     * run the search
+     */
+    protected function execute()
+    {
+        global $INPUT, $QUERY;
+        $after = $INPUT->str('min');
+        $before = $INPUT->str('max');
+        $this->pageLookupResults = ft_pageLookup($QUERY, true, useHeading('navigation'), $after, $before);
+        $this->fullTextResults = ft_pageSearch($QUERY, $highlight, $INPUT->str('srt'), $after, $before);
+        $this->highlight = $highlight;
+    }
+
+    /**
+     * Adjust the global query accordingly to the config search_nslimit and search_fragment
+     *
+     * This will only do something if the search didn't originate from the form on the searchpage itself
+     */
+    protected function adjustGlobalQuery()
+    {
+        global $conf, $INPUT, $QUERY, $ID;
+
+        if ($INPUT->bool('sf')) {
+            return;
+        }
+
+        $Indexer = idx_get_indexer();
+        $parsedQuery = ft_queryParser($Indexer, $QUERY);
+
+        if (empty($parsedQuery['ns']) && empty($parsedQuery['notns'])) {
+            if ($conf['search_nslimit'] > 0) {
+                if (getNS($ID) !== false) {
+                    $nsParts = explode(':', getNS($ID));
+                    $ns = implode(':', array_slice($nsParts, 0, $conf['search_nslimit']));
+                    $QUERY .= " @$ns";
+                }
+            }
+        }
+
+        if ($conf['search_fragment'] !== 'exact') {
+            if (empty(array_diff($parsedQuery['words'], $parsedQuery['and']))) {
+                if (strpos($QUERY, '*') === false) {
+                    $queryParts = explode(' ', $QUERY);
+                    $queryParts = array_map(function ($part) {
+                        if (strpos($part, '@') === 0) {
+                            return $part;
+                        }
+                        if (strpos($part, 'ns:') === 0) {
+                            return $part;
+                        }
+                        if (strpos($part, '^') === 0) {
+                            return $part;
+                        }
+                        if (strpos($part, '-ns:') === 0) {
+                            return $part;
+                        }
+
+                        global $conf;
+
+                        if ($conf['search_fragment'] === 'starts_with') {
+                            return $part . '*';
+                        }
+                        if ($conf['search_fragment'] === 'ends_with') {
+                            return '*' . $part;
+                        }
+
+                        return '*' . $part . '*';
+
+                    }, $queryParts);
+                    $QUERY = implode(' ', $queryParts);
+                }
+            }
+        }
+    }
+}
diff --git a/wiki/inc/Action/Show.php b/wiki/inc/Action/Show.php
new file mode 100644
index 0000000..a5cb534
--- /dev/null
+++ b/wiki/inc/Action/Show.php
@@ -0,0 +1,36 @@
+<?php
+/**
+ * Created by IntelliJ IDEA.
+ * User: andi
+ * Date: 2/10/17
+ * Time: 4:32 PM
+ */
+
+namespace dokuwiki\Action;
+
+/**
+ * Class Show
+ *
+ * The default action of showing a page
+ *
+ * @package dokuwiki\Action
+ */
+class Show extends AbstractAction {
+
+    /** @inheritdoc */
+    public function minimumPermission() {
+        return AUTH_READ;
+    }
+
+    /** @inheritdoc */
+    public function preProcess() {
+        global $ID;
+        unlock($ID);
+    }
+
+    /** @inheritdoc */
+    public function tplContent() {
+        html_show();
+    }
+
+}
diff --git a/wiki/inc/Action/Sitemap.php b/wiki/inc/Action/Sitemap.php
new file mode 100644
index 0000000..025c515
--- /dev/null
+++ b/wiki/inc/Action/Sitemap.php
@@ -0,0 +1,65 @@
+<?php
+
+namespace dokuwiki\Action;
+
+use dokuwiki\Action\Exception\FatalException;
+
+/**
+ * Class Sitemap
+ *
+ * Generate an XML sitemap for search engines. Do not confuse with Index
+ *
+ * @package dokuwiki\Action
+ */
+class Sitemap extends AbstractAction {
+
+    /** @inheritdoc */
+    public function minimumPermission() {
+        return AUTH_NONE;
+    }
+
+    /**
+     * Handle sitemap delivery
+     *
+     * @author Michael Hamann <michael@content-space.de>
+     * @throws FatalException
+     * @inheritdoc
+     */
+    public function preProcess() {
+        global $conf;
+
+        if($conf['sitemap'] < 1 || !is_numeric($conf['sitemap'])) {
+            throw new FatalException(404, 'Sitemap generation is disabled');
+        }
+
+        $sitemap = \Sitemapper::getFilePath();
+        if(\Sitemapper::sitemapIsCompressed()) {
+            $mime = 'application/x-gzip';
+        } else {
+            $mime = 'application/xml; charset=utf-8';
+        }
+
+        // Check if sitemap file exists, otherwise create it
+        if(!is_readable($sitemap)) {
+            \Sitemapper::generate();
+        }
+
+        if(is_readable($sitemap)) {
+            // Send headers
+            header('Content-Type: ' . $mime);
+            header('Content-Disposition: attachment; filename=' . utf8_basename($sitemap));
+
+            http_conditionalRequest(filemtime($sitemap));
+
+            // Send file
+            //use x-sendfile header to pass the delivery to compatible webservers
+            http_sendfile($sitemap);
+
+            readfile($sitemap);
+            exit;
+        }
+
+        throw new FatalException(500, 'Could not read the sitemap file - bad permissions?');
+    }
+
+}
diff --git a/wiki/inc/Action/Source.php b/wiki/inc/Action/Source.php
new file mode 100644
index 0000000..9b03fe9
--- /dev/null
+++ b/wiki/inc/Action/Source.php
@@ -0,0 +1,36 @@
+<?php
+
+namespace dokuwiki\Action;
+
+/**
+ * Class Source
+ *
+ * Show the source of a page
+ *
+ * @package dokuwiki\Action
+ */
+class Source extends AbstractAction {
+
+    /** @inheritdoc */
+    public function minimumPermission() {
+        return AUTH_READ;
+    }
+
+    /** @inheritdoc */
+    public function preProcess() {
+        global $TEXT;
+        global $INFO;
+        global $ID;
+        global $REV;
+
+        if($INFO['exists']) {
+            $TEXT = rawWiki($ID, $REV);
+        }
+    }
+
+    /** @inheritdoc */
+    public function tplContent() {
+        html_edit();
+    }
+
+}
diff --git a/wiki/inc/Action/Subscribe.php b/wiki/inc/Action/Subscribe.php
new file mode 100644
index 0000000..c165710
--- /dev/null
+++ b/wiki/inc/Action/Subscribe.php
@@ -0,0 +1,166 @@
+<?php
+
+namespace dokuwiki\Action;
+
+use dokuwiki\Action\Exception\ActionAbort;
+use dokuwiki\Action\Exception\ActionDisabledException;
+
+/**
+ * Class Subscribe
+ *
+ * E-Mail subscription handling
+ *
+ * @package dokuwiki\Action
+ */
+class Subscribe extends AbstractUserAction {
+
+    /** @inheritdoc */
+    public function minimumPermission() {
+        return AUTH_READ;
+    }
+
+    /** @inheritdoc */
+    public function checkPreconditions() {
+        parent::checkPreconditions();
+
+        global $conf;
+        if(isset($conf['subscribers']) && !$conf['subscribers']) throw new ActionDisabledException();
+    }
+
+    /** @inheritdoc */
+    public function preProcess() {
+        try {
+            $this->handleSubscribeData();
+        } catch(ActionAbort $e) {
+            throw $e;
+        } catch(\Exception $e) {
+            msg($e->getMessage(), -1);
+        }
+    }
+
+    /** @inheritdoc */
+    public function tplContent() {
+        tpl_subscribe();
+    }
+
+    /**
+     * Handle page 'subscribe'
+     *
+     * @author Adrian Lang <lang@cosmocode.de>
+     * @throws \Exception if (un)subscribing fails
+     * @throws ActionAbort when (un)subscribing worked
+     */
+    protected function handleSubscribeData() {
+        global $lang;
+        global $INFO;
+        global $INPUT;
+
+        // get and preprocess data.
+        $params = array();
+        foreach(array('target', 'style', 'action') as $param) {
+            if($INPUT->has("sub_$param")) {
+                $params[$param] = $INPUT->str("sub_$param");
+            }
+        }
+
+        // any action given? if not just return and show the subscription page
+        if(empty($params['action']) || !checkSecurityToken()) return;
+
+        // Handle POST data, may throw exception.
+        trigger_event('ACTION_HANDLE_SUBSCRIBE', $params, array($this, 'handlePostData'));
+
+        $target = $params['target'];
+        $style = $params['style'];
+        $action = $params['action'];
+
+        // Perform action.
+        $sub = new \Subscription();
+        if($action == 'unsubscribe') {
+            $ok = $sub->remove($target, $INPUT->server->str('REMOTE_USER'), $style);
+        } else {
+            $ok = $sub->add($target, $INPUT->server->str('REMOTE_USER'), $style);
+        }
+
+        if($ok) {
+            msg(
+                sprintf(
+                    $lang["subscr_{$action}_success"], hsc($INFO['userinfo']['name']),
+                    prettyprint_id($target)
+                ), 1
+            );
+            throw new ActionAbort('redirect');
+        } else {
+            throw new \Exception(
+                sprintf(
+                    $lang["subscr_{$action}_error"],
+                    hsc($INFO['userinfo']['name']),
+                    prettyprint_id($target)
+                )
+            );
+        }
+    }
+
+    /**
+     * Validate POST data
+     *
+     * Validates POST data for a subscribe or unsubscribe request. This is the
+     * default action for the event ACTION_HANDLE_SUBSCRIBE.
+     *
+     * @author Adrian Lang <lang@cosmocode.de>
+     *
+     * @param array &$params the parameters: target, style and action
+     * @throws \Exception
+     */
+    public function handlePostData(&$params) {
+        global $INFO;
+        global $lang;
+        global $INPUT;
+
+        // Get and validate parameters.
+        if(!isset($params['target'])) {
+            throw new \Exception('no subscription target given');
+        }
+        $target = $params['target'];
+        $valid_styles = array('every', 'digest');
+        if(substr($target, -1, 1) === ':') {
+            // Allow “list” subscribe style since the target is a namespace.
+            $valid_styles[] = 'list';
+        }
+        $style = valid_input_set(
+            'style', $valid_styles, $params,
+            'invalid subscription style given'
+        );
+        $action = valid_input_set(
+            'action', array('subscribe', 'unsubscribe'),
+            $params, 'invalid subscription action given'
+        );
+
+        // Check other conditions.
+        if($action === 'subscribe') {
+            if($INFO['userinfo']['mail'] === '') {
+                throw new \Exception($lang['subscr_subscribe_noaddress']);
+            }
+        } elseif($action === 'unsubscribe') {
+            $is = false;
+            foreach($INFO['subscribed'] as $subscr) {
+                if($subscr['target'] === $target) {
+                    $is = true;
+                }
+            }
+            if($is === false) {
+                throw new \Exception(
+                    sprintf(
+                        $lang['subscr_not_subscribed'],
+                        $INPUT->server->str('REMOTE_USER'),
+                        prettyprint_id($target)
+                    )
+                );
+            }
+            // subscription_set deletes a subscription if style = null.
+            $style = null;
+        }
+
+        $params = compact('target', 'style', 'action');
+    }
+
+}
diff --git a/wiki/inc/ActionRouter.php b/wiki/inc/ActionRouter.php
new file mode 100644
index 0000000..edc45cf
--- /dev/null
+++ b/wiki/inc/ActionRouter.php
@@ -0,0 +1,228 @@
+<?php
+
+namespace dokuwiki;
+
+use dokuwiki\Action\AbstractAction;
+use dokuwiki\Action\Exception\ActionDisabledException;
+use dokuwiki\Action\Exception\ActionException;
+use dokuwiki\Action\Exception\FatalException;
+use dokuwiki\Action\Exception\NoActionException;
+use dokuwiki\Action\Plugin;
+
+/**
+ * Class ActionRouter
+ * @package dokuwiki
+ */
+class ActionRouter {
+
+    /** @var  AbstractAction */
+    protected $action;
+
+    /** @var  ActionRouter */
+    protected static $instance = null;
+
+    /** @var int transition counter */
+    protected $transitions = 0;
+
+    /** maximum loop */
+    const MAX_TRANSITIONS = 5;
+
+    /** @var string[] the actions disabled in the configuration */
+    protected $disabled;
+
+    /**
+     * ActionRouter constructor. Singleton, thus protected!
+     *
+     * Sets up the correct action based on the $ACT global. Writes back
+     * the selected action to $ACT
+     */
+    protected function __construct() {
+        global $ACT;
+        global $conf;
+
+        $this->disabled = explode(',', $conf['disableactions']);
+        $this->disabled = array_map('trim', $this->disabled);
+        $this->transitions = 0;
+
+        $ACT = act_clean($ACT);
+        $this->setupAction($ACT);
+        $ACT = $this->action->getActionName();
+    }
+
+    /**
+     * Get the singleton instance
+     *
+     * @param bool $reinit
+     * @return ActionRouter
+     */
+    public static function getInstance($reinit = false) {
+        if((self::$instance === null) || $reinit) {
+            self::$instance = new ActionRouter();
+        }
+        return self::$instance;
+    }
+
+    /**
+     * Setup the given action
+     *
+     * Instantiates the right class, runs permission checks and pre-processing and
+     * sets $action
+     *
+     * @param string $actionname this is passed as a reference to $ACT, for plugin backward compatibility
+     * @triggers ACTION_ACT_PREPROCESS
+     */
+    protected function setupAction(&$actionname) {
+        $presetup = $actionname;
+
+        try {
+            // give plugins an opportunity to process the actionname
+            $evt = new \Doku_Event('ACTION_ACT_PREPROCESS', $actionname);
+            if ($evt->advise_before()) {
+                $this->action = $this->loadAction($actionname);
+                $this->checkAction($this->action);
+                $this->action->preProcess();
+            } else {
+                // event said the action should be kept, assume action plugin will handle it later
+                $this->action = new Plugin($actionname);
+            }
+            $evt->advise_after();
+
+        } catch(ActionException $e) {
+            // we should have gotten a new action
+            $actionname = $e->getNewAction();
+
+            // this one should trigger a user message
+            if(is_a($e, ActionDisabledException::class)) {
+                msg('Action disabled: ' . hsc($presetup), -1);
+            }
+
+            // some actions may request the display of a message
+            if($e->displayToUser()) {
+                msg(hsc($e->getMessage()), -1);
+            }
+
+            // do setup for new action
+            $this->transitionAction($presetup, $actionname);
+
+        } catch(NoActionException $e) {
+            msg('Action unknown: ' . hsc($actionname), -1);
+            $actionname = 'show';
+            $this->transitionAction($presetup, $actionname);
+        } catch(\Exception $e) {
+            $this->handleFatalException($e);
+        }
+    }
+
+    /**
+     * Transitions from one action to another
+     *
+     * Basically just calls setupAction() again but does some checks before.
+     *
+     * @param string $from current action name
+     * @param string $to new action name
+     * @param null|ActionException $e any previous exception that caused the transition
+     */
+    protected function transitionAction($from, $to, $e = null) {
+        $this->transitions++;
+
+        // no infinite recursion
+        if($from == $to) {
+            $this->handleFatalException(new FatalException('Infinite loop in actions', 500, $e));
+        }
+
+        // larger loops will be caught here
+        if($this->transitions >= self::MAX_TRANSITIONS) {
+            $this->handleFatalException(new FatalException('Maximum action transitions reached', 500, $e));
+        }
+
+        // do the recursion
+        $this->setupAction($to);
+    }
+
+    /**
+     * Aborts all processing with a message
+     *
+     * When a FataException instanc is passed, the code is treated as Status code
+     *
+     * @param \Exception|FatalException $e
+     * @throws FatalException during unit testing
+     */
+    protected function handleFatalException(\Exception $e) {
+        if(is_a($e, FatalException::class)) {
+            http_status($e->getCode());
+        } else {
+            http_status(500);
+        }
+        if(defined('DOKU_UNITTEST')) {
+            throw $e;
+        }
+        $msg = 'Something unforseen has happened: ' . $e->getMessage();
+        nice_die(hsc($msg));
+    }
+
+    /**
+     * Load the given action
+     *
+     * This translates the given name to a class name by uppercasing the first letter.
+     * Underscores translate to camelcase names. For actions with underscores, the different
+     * parts are removed beginning from the end until a matching class is found. The instatiated
+     * Action will always have the full original action set as Name
+     *
+     * Example: 'export_raw' -> ExportRaw then 'export' -> 'Export'
+     *
+     * @param $actionname
+     * @return AbstractAction
+     * @throws NoActionException
+     */
+    public function loadAction($actionname) {
+        $actionname = strtolower($actionname); // FIXME is this needed here? should we run a cleanup somewhere else?
+        $parts = explode('_', $actionname);
+        while(!empty($parts)) {
+            $load = join('_', $parts);
+            $class = 'dokuwiki\\Action\\' . str_replace('_', '', ucwords($load, '_'));
+            if(class_exists($class)) {
+                return new $class($actionname);
+            }
+            array_pop($parts);
+        }
+
+        throw new NoActionException();
+    }
+
+    /**
+     * Execute all the checks to see if this action can be executed
+     *
+     * @param AbstractAction $action
+     * @throws ActionDisabledException
+     * @throws ActionException
+     */
+    public function checkAction(AbstractAction $action) {
+        global $INFO;
+        global $ID;
+
+        if(in_array($action->getActionName(), $this->disabled)) {
+            throw new ActionDisabledException();
+        }
+
+        $action->checkPreconditions();
+
+        if(isset($INFO)) {
+            $perm = $INFO['perm'];
+        } else {
+            $perm = auth_quickaclcheck($ID);
+        }
+
+        if($perm < $action->minimumPermission()) {
+            throw new ActionException('denied');
+        }
+    }
+
+    /**
+     * Returns the action handling the current request
+     *
+     * @return AbstractAction
+     */
+    public function getAction() {
+        return $this->action;
+    }
+}
diff --git a/wiki/inc/Ajax.php b/wiki/inc/Ajax.php
new file mode 100644
index 0000000..191d8f8
--- /dev/null
+++ b/wiki/inc/Ajax.php
@@ -0,0 +1,446 @@
+<?php
+
+namespace dokuwiki;
+
+/**
+ * Manage all builtin AJAX calls
+ *
+ * @todo The calls should be refactored out to their own proper classes
+ * @package dokuwiki
+ */
+class Ajax {
+
+    /**
+     * Execute the given call
+     *
+     * @param string $call name of the ajax call
+     */
+    public function __construct($call) {
+        $callfn = 'call_' . $call;
+        if(method_exists($this, $callfn)) {
+            $this->$callfn();
+        } else {
+            $evt = new \Doku_Event('AJAX_CALL_UNKNOWN', $call);
+            if($evt->advise_before()) {
+                print "AJAX call '" . hsc($call) . "' unknown!\n";
+            } else {
+                $evt->advise_after();
+                unset($evt);
+            }
+        }
+    }
+
+    /**
+     * Searches for matching pagenames
+     *
+     * @author Andreas Gohr <andi@splitbrain.org>
+     */
+    protected function call_qsearch() {
+        global $lang;
+        global $INPUT;
+
+        $maxnumbersuggestions = 50;
+
+        $query = $INPUT->post->str('q');
+        if(empty($query)) $query = $INPUT->get->str('q');
+        if(empty($query)) return;
+
+        $query = urldecode($query);
+
+        $data = ft_pageLookup($query, true, useHeading('navigation'));
+
+        if(!count($data)) return;
+
+        print '<strong>' . $lang['quickhits'] . '</strong>';
+        print '<ul>';
+        $counter = 0;
+        foreach($data as $id => $title) {
+            if(useHeading('navigation')) {
+                $name = $title;
+            } else {
+                $ns = getNS($id);
+                if($ns) {
+                    $name = noNS($id) . ' (' . $ns . ')';
+                } else {
+                    $name = $id;
+                }
+            }
+            echo '<li>' . html_wikilink(':' . $id, $name) . '</li>';
+
+            $counter++;
+            if($counter > $maxnumbersuggestions) {
+                echo '<li>...</li>';
+                break;
+            }
+        }
+        print '</ul>';
+    }
+
+    /**
+     * Support OpenSearch suggestions
+     *
+     * @link   http://www.opensearch.org/Specifications/OpenSearch/Extensions/Suggestions/1.0
+     * @author Mike Frysinger <vapier@gentoo.org>
+     */
+    protected function call_suggestions() {
+        global $INPUT;
+
+        $query = cleanID($INPUT->post->str('q'));
+        if(empty($query)) $query = cleanID($INPUT->get->str('q'));
+        if(empty($query)) return;
+
+        $data = ft_pageLookup($query);
+        if(!count($data)) return;
+        $data = array_keys($data);
+
+        // limit results to 15 hits
+        $data = array_slice($data, 0, 15);
+        $data = array_map('trim', $data);
+        $data = array_map('noNS', $data);
+        $data = array_unique($data);
+        sort($data);
+
+        /* now construct a json */
+        $suggestions = array(
+            $query,  // the original query
+            $data,   // some suggestions
+            array(), // no description
+            array()  // no urls
+        );
+        $json = new \JSON();
+
+        header('Content-Type: application/x-suggestions+json');
+        print $json->encode($suggestions);
+    }
+
+    /**
+     * Refresh a page lock and save draft
+     *
+     * Andreas Gohr <andi@splitbrain.org>
+     */
+    protected function call_lock() {
+        global $conf;
+        global $lang;
+        global $ID;
+        global $INFO;
+        global $INPUT;
+
+        $ID = cleanID($INPUT->post->str('id'));
+        if(empty($ID)) return;
+
+        $INFO = pageinfo();
+
+        if(!$INFO['writable']) {
+            echo 'Permission denied';
+            return;
+        }
+
+        if(!checklock($ID)) {
+            lock($ID);
+            echo 1;
+        }
+
+        if($conf['usedraft'] && $INPUT->post->str('wikitext')) {
+            $client = $_SERVER['REMOTE_USER'];
+            if(!$client) $client = clientIP(true);
+
+            $draft = array(
+                'id' => $ID,
+                'prefix' => substr($INPUT->post->str('prefix'), 0, -1),
+                'text' => $INPUT->post->str('wikitext'),
+                'suffix' => $INPUT->post->str('suffix'),
+                'date' => $INPUT->post->int('date'),
+                'client' => $client,
+            );
+            $cname = getCacheName($draft['client'] . $ID, '.draft');
+            if(io_saveFile($cname, serialize($draft))) {
+                echo $lang['draftdate'] . ' ' . dformat();
+            }
+        }
+
+    }
+
+    /**
+     * Delete a draft
+     *
+     * @author Andreas Gohr <andi@splitbrain.org>
+     */
+    protected function call_draftdel() {
+        global $INPUT;
+        $id = cleanID($INPUT->str('id'));
+        if(empty($id)) return;
+
+        $client = $_SERVER['REMOTE_USER'];
+        if(!$client) $client = clientIP(true);
+
+        $cname = getCacheName($client . $id, '.draft');
+        @unlink($cname);
+    }
+
+    /**
+     * Return subnamespaces for the Mediamanager
+     *
+     * @author Andreas Gohr <andi@splitbrain.org>
+     */
+    protected function call_medians() {
+        global $conf;
+        global $INPUT;
+
+        // wanted namespace
+        $ns = cleanID($INPUT->post->str('ns'));
+        $dir = utf8_encodeFN(str_replace(':', '/', $ns));
+
+        $lvl = count(explode(':', $ns));
+
+        $data = array();
+        search($data, $conf['mediadir'], 'search_index', array('nofiles' => true), $dir);
+        foreach(array_keys($data) as $item) {
+            $data[$item]['level'] = $lvl + 1;
+        }
+        echo html_buildlist($data, 'idx', 'media_nstree_item', 'media_nstree_li');
+    }
+
+    /**
+     * Return list of files for the Mediamanager
+     *
+     * @author Andreas Gohr <andi@splitbrain.org>
+     */
+    protected function call_medialist() {
+        global $NS;
+        global $INPUT;
+
+        $NS = cleanID($INPUT->post->str('ns'));
+        $sort = $INPUT->post->bool('recent') ? 'date' : 'natural';
+        if($INPUT->post->str('do') == 'media') {
+            tpl_mediaFileList();
+        } else {
+            tpl_mediaContent(true, $sort);
+        }
+    }
+
+    /**
+     * Return the content of the right column
+     * (image details) for the Mediamanager
+     *
+     * @author Kate Arzamastseva <pshns@ukr.net>
+     */
+    protected function call_mediadetails() {
+        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();
+        tpl_mediaFileDetails($image, $rev);
+    }
+
+    /**
+     * Returns image diff representation for mediamanager
+     *
+     * @author Kate Arzamastseva <pshns@ukr.net>
+     */
+    protected function call_mediadiff() {
+        global $NS;
+        global $INPUT;
+
+        $image = '';
+        if($INPUT->has('image')) $image = cleanID($INPUT->str('image'));
+        $NS = getNS($image);
+        $auth = auth_quickaclcheck("$NS:*");
+        media_diff($image, $NS, $auth, true);
+    }
+
+    /**
+     * Manages file uploads
+     *
+     * @author Kate Arzamastseva <pshns@ukr.net>
+     */
+    protected function call_mediaupload() {
+        global $NS, $MSG, $INPUT;
+
+        $id = '';
+        if($_FILES['qqfile']['tmp_name']) {
+            $id = $INPUT->post->str('mediaid', $_FILES['qqfile']['name']);
+        } elseif($INPUT->get->has('qqfile')) {
+            $id = $INPUT->get->str('qqfile');
+        }
+
+        $id = cleanID($id);
+
+        $NS = $INPUT->str('ns');
+        $ns = $NS . ':' . getNS($id);
+
+        $AUTH = auth_quickaclcheck("$ns:*");
+        if($AUTH >= AUTH_UPLOAD) {
+            io_createNamespace("$ns:xxx", 'media');
+        }
+
+        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
+            );
+        } else {
+            $error = '';
+            if(isset($MSG)) {
+                foreach($MSG as $msg) {
+                    $error .= $msg['msg'];
+                }
+            }
+            $result = array(
+                'error' => $error,
+                'ns' => $NS
+            );
+        }
+        $json = new \JSON;
+        header('Content-Type: application/json');
+        echo $json->encode($result);
+    }
+
+    /**
+     * Return sub index for index view
+     *
+     * @author Andreas Gohr <andi@splitbrain.org>
+     */
+    protected function call_index() {
+        global $conf;
+        global $INPUT;
+
+        // wanted namespace
+        $ns = cleanID($INPUT->post->str('idx'));
+        $dir = utf8_encodeFN(str_replace(':', '/', $ns));
+
+        $lvl = count(explode(':', $ns));
+
+        $data = array();
+        search($data, $conf['datadir'], 'search_index', array('ns' => $ns), $dir);
+        foreach(array_keys($data) as $item) {
+            $data[$item]['level'] = $lvl + 1;
+        }
+        echo html_buildlist($data, 'idx', 'html_list_index', 'html_li_index');
+    }
+
+    /**
+     * List matching namespaces and pages for the link wizard
+     *
+     * @author Andreas Gohr <gohr@cosmocode.de>
+     */
+    protected function call_linkwiz() {
+        global $conf;
+        global $lang;
+        global $INPUT;
+
+        $q = ltrim(trim($INPUT->post->str('q')), ':');
+        $id = noNS($q);
+        $ns = getNS($q);
+
+        $ns = cleanID($ns);
+        $id = cleanID($id);
+
+        $nsd = utf8_encodeFN(str_replace(':', '/', $ns));
+
+        $data = array();
+        if($q && !$ns) {
+
+            // use index to lookup matching pages
+            $pages = ft_pageLookup($id, true);
+
+            // result contains matches in pages and namespaces
+            // we now extract the matching namespaces to show
+            // them seperately
+            $dirs = array();
+
+            foreach($pages as $pid => $title) {
+                if(strpos(noNS($pid), $id) === false) {
+                    // match was in the namespace
+                    $dirs[getNS($pid)] = 1; // assoc array avoids dupes
+                } else {
+                    // it is a matching page, add it to the result
+                    $data[] = array(
+                        'id' => $pid,
+                        'title' => $title,
+                        'type' => 'f',
+                    );
+                }
+                unset($pages[$pid]);
+            }
+            foreach($dirs as $dir => $junk) {
+                $data[] = array(
+                    'id' => $dir,
+                    'type' => 'd',
+                );
+            }
+
+        } else {
+
+            $opts = array(
+                'depth' => 1,
+                'listfiles' => true,
+                'listdirs' => true,
+                'pagesonly' => true,
+                'firsthead' => true,
+                'sneakyacl' => $conf['sneaky_index'],
+            );
+            if($id) $opts['filematch'] = '^.*\/' . $id;
+            if($id) $opts['dirmatch'] = '^.*\/' . $id;
+            search($data, $conf['datadir'], 'search_universal', $opts, $nsd);
+
+            // add back to upper
+            if($ns) {
+                array_unshift(
+                    $data, array(
+                             'id' => getNS($ns),
+                             'type' => 'u',
+                         )
+                );
+            }
+        }
+
+        // fixme sort results in a useful way ?
+
+        if(!count($data)) {
+            echo $lang['nothingfound'];
+            exit;
+        }
+
+        // output the found data
+        $even = 1;
+        foreach($data as $item) {
+            $even *= -1; //zebra
+
+            if(($item['type'] == 'd' || $item['type'] == 'u') && $item['id']) $item['id'] .= ':';
+            $link = wl($item['id']);
+
+            echo '<div class="' . (($even > 0) ? 'even' : 'odd') . ' type_' . $item['type'] . '">';
+
+            if($item['type'] == 'u') {
+                $name = $lang['upperns'];
+            } else {
+                $name = hsc($item['id']);
+            }
+
+            echo '<a href="' . $link . '" title="' . hsc($item['id']) . '" class="wikilink1">' . $name . '</a>';
+
+            if(!blank($item['title'])) {
+                echo '<span>' . hsc($item['title']) . '</span>';
+            }
+            echo '</div>';
+        }
+
+    }
+
+}
diff --git a/wiki/inc/DifferenceEngine.php b/wiki/inc/DifferenceEngine.php
new file mode 100644
index 0000000..70877a4
--- /dev/null
+++ b/wiki/inc/DifferenceEngine.php
@@ -0,0 +1,1544 @@
+<?php
+/**
+ * A PHP diff engine for phpwiki. (Taken from phpwiki-1.3.3)
+ *
+ * Additions by Axel Boldt for MediaWiki
+ *
+ * @copyright (C) 2000, 2001 Geoffrey T. Dairiki <dairiki@dairiki.org>
+ * @license  You may copy this code freely under the conditions of the GPL.
+ */
+define('USE_ASSERTS', function_exists('assert'));
+
+class _DiffOp {
+    var $type;
+    var $orig;
+    var $closing;
+
+    /**
+     * @return _DiffOp
+     */
+    function reverse() {
+        trigger_error("pure virtual", E_USER_ERROR);
+    }
+
+    function norig() {
+        return $this->orig ? count($this->orig) : 0;
+    }
+
+    function nclosing() {
+        return $this->closing ? count($this->closing) : 0;
+    }
+}
+
+class _DiffOp_Copy extends _DiffOp {
+    var $type = 'copy';
+
+    function __construct($orig, $closing = false) {
+        if (!is_array($closing))
+            $closing = $orig;
+        $this->orig = $orig;
+        $this->closing = $closing;
+    }
+
+    function reverse() {
+        return new _DiffOp_Copy($this->closing, $this->orig);
+    }
+}
+
+class _DiffOp_Delete extends _DiffOp {
+    var $type = 'delete';
+
+    function __construct($lines) {
+        $this->orig = $lines;
+        $this->closing = false;
+    }
+
+    function reverse() {
+        return new _DiffOp_Add($this->orig);
+    }
+}
+
+class _DiffOp_Add extends _DiffOp {
+    var $type = 'add';
+
+    function __construct($lines) {
+        $this->closing = $lines;
+        $this->orig = false;
+    }
+
+    function reverse() {
+        return new _DiffOp_Delete($this->closing);
+    }
+}
+
+class _DiffOp_Change extends _DiffOp {
+    var $type = 'change';
+
+    function __construct($orig, $closing) {
+        $this->orig = $orig;
+        $this->closing = $closing;
+    }
+
+    function reverse() {
+        return new _DiffOp_Change($this->closing, $this->orig);
+    }
+}
+
+
+/**
+ * Class used internally by Diff to actually compute the diffs.
+ *
+ * The algorithm used here is mostly lifted from the perl module
+ * Algorithm::Diff (version 1.06) by Ned Konz, which is available at:
+ *   http://www.perl.com/CPAN/authors/id/N/NE/NEDKONZ/Algorithm-Diff-1.06.zip
+ *
+ * More ideas are taken from:
+ *   http://www.ics.uci.edu/~eppstein/161/960229.html
+ *
+ * Some ideas are (and a bit of code) are from from analyze.c, from GNU
+ * diffutils-2.7, which can be found at:
+ *   ftp://gnudist.gnu.org/pub/gnu/diffutils/diffutils-2.7.tar.gz
+ *
+ * closingly, some ideas (subdivision by NCHUNKS > 2, and some optimizations)
+ * are my own.
+ *
+ * @author Geoffrey T. Dairiki
+ * @access private
+ */
+class _DiffEngine {
+
+    var $xchanged = array();
+    var $ychanged = array();
+    var $xv = array();
+    var $yv = array();
+    var $xind = array();
+    var $yind = array();
+    var $seq;
+    var $in_seq;
+    var $lcs;
+
+    /**
+     * @param array $from_lines
+     * @param array $to_lines
+     * @return _DiffOp[]
+     */
+    function diff($from_lines, $to_lines) {
+        $n_from = count($from_lines);
+        $n_to = count($to_lines);
+
+        $this->xchanged = $this->ychanged = array();
+        $this->xv = $this->yv = array();
+        $this->xind = $this->yind = array();
+        unset($this->seq);
+        unset($this->in_seq);
+        unset($this->lcs);
+
+        // Skip leading common lines.
+        for ($skip = 0; $skip < $n_from && $skip < $n_to; $skip++) {
+            if ($from_lines[$skip] != $to_lines[$skip])
+                break;
+            $this->xchanged[$skip] = $this->ychanged[$skip] = false;
+        }
+        // Skip trailing common lines.
+        $xi = $n_from;
+        $yi = $n_to;
+        for ($endskip = 0; --$xi > $skip && --$yi > $skip; $endskip++) {
+            if ($from_lines[$xi] != $to_lines[$yi])
+                break;
+            $this->xchanged[$xi] = $this->ychanged[$yi] = false;
+        }
+
+        // Ignore lines which do not exist in both files.
+        for ($xi = $skip; $xi < $n_from - $endskip; $xi++)
+            $xhash[$from_lines[$xi]] = 1;
+        for ($yi = $skip; $yi < $n_to - $endskip; $yi++) {
+            $line = $to_lines[$yi];
+            if (($this->ychanged[$yi] = empty($xhash[$line])))
+                continue;
+            $yhash[$line] = 1;
+            $this->yv[] = $line;
+            $this->yind[] = $yi;
+        }
+        for ($xi = $skip; $xi < $n_from - $endskip; $xi++) {
+            $line = $from_lines[$xi];
+            if (($this->xchanged[$xi] = empty($yhash[$line])))
+                continue;
+            $this->xv[] = $line;
+            $this->xind[] = $xi;
+        }
+
+        // Find the LCS.
+        $this->_compareseq(0, count($this->xv), 0, count($this->yv));
+
+        // Merge edits when possible
+        $this->_shift_boundaries($from_lines, $this->xchanged, $this->ychanged);
+        $this->_shift_boundaries($to_lines, $this->ychanged, $this->xchanged);
+
+        // Compute the edit operations.
+        $edits = array();
+        $xi = $yi = 0;
+        while ($xi < $n_from || $yi < $n_to) {
+            USE_ASSERTS && assert($yi < $n_to || $this->xchanged[$xi]);
+            USE_ASSERTS && assert($xi < $n_from || $this->ychanged[$yi]);
+
+            // Skip matching "snake".
+            $copy = array();
+            while ($xi < $n_from && $yi < $n_to && !$this->xchanged[$xi] && !$this->ychanged[$yi]) {
+                $copy[] = $from_lines[$xi++];
+                ++$yi;
+            }
+            if ($copy)
+                $edits[] = new _DiffOp_Copy($copy);
+
+            // Find deletes & adds.
+            $delete = array();
+            while ($xi < $n_from && $this->xchanged[$xi])
+                $delete[] = $from_lines[$xi++];
+
+            $add = array();
+            while ($yi < $n_to && $this->ychanged[$yi])
+                $add[] = $to_lines[$yi++];
+
+            if ($delete && $add)
+                $edits[] = new _DiffOp_Change($delete, $add);
+            elseif ($delete)
+                $edits[] = new _DiffOp_Delete($delete);
+            elseif ($add)
+                $edits[] = new _DiffOp_Add($add);
+        }
+        return $edits;
+    }
+
+
+    /**
+     * Divide the Largest Common Subsequence (LCS) of the sequences
+     * [XOFF, XLIM) and [YOFF, YLIM) into NCHUNKS approximately equally
+     * sized segments.
+     *
+     * Returns (LCS, PTS).  LCS is the length of the LCS. PTS is an
+     * array of NCHUNKS+1 (X, Y) indexes giving the diving points between
+     * sub sequences.  The first sub-sequence is contained in [X0, X1),
+     * [Y0, Y1), the second in [X1, X2), [Y1, Y2) and so on.  Note
+     * that (X0, Y0) == (XOFF, YOFF) and
+     * (X[NCHUNKS], Y[NCHUNKS]) == (XLIM, YLIM).
+     *
+     * This function assumes that the first lines of the specified portions
+     * of the two files do not match, and likewise that the last lines do not
+     * match.  The caller must trim matching lines from the beginning and end
+     * of the portions it is going to specify.
+     *
+     * @param integer $xoff
+     * @param integer $xlim
+     * @param integer $yoff
+     * @param integer $ylim
+     * @param integer $nchunks
+     *
+     * @return array
+     */
+    function _diag($xoff, $xlim, $yoff, $ylim, $nchunks) {
+        $flip = false;
+
+        if ($xlim - $xoff > $ylim - $yoff) {
+            // Things seems faster (I'm not sure I understand why)
+            // when the shortest sequence in X.
+            $flip = true;
+            list ($xoff, $xlim, $yoff, $ylim) = array($yoff, $ylim, $xoff, $xlim);
+        }
+
+        if ($flip)
+            for ($i = $ylim - 1; $i >= $yoff; $i--)
+                $ymatches[$this->xv[$i]][] = $i;
+        else
+            for ($i = $ylim - 1; $i >= $yoff; $i--)
+                $ymatches[$this->yv[$i]][] = $i;
+
+        $this->lcs = 0;
+        $this->seq[0]= $yoff - 1;
+        $this->in_seq = array();
+        $ymids[0] = array();
+
+        $numer = $xlim - $xoff + $nchunks - 1;
+        $x = $xoff;
+        for ($chunk = 0; $chunk < $nchunks; $chunk++) {
+            if ($chunk > 0)
+                for ($i = 0; $i <= $this->lcs; $i++)
+                    $ymids[$i][$chunk-1] = $this->seq[$i];
+
+            $x1 = $xoff + (int)(($numer + ($xlim-$xoff)*$chunk) / $nchunks);
+            for ( ; $x < $x1; $x++) {
+                $line = $flip ? $this->yv[$x] : $this->xv[$x];
+                if (empty($ymatches[$line]))
+                    continue;
+                $matches = $ymatches[$line];
+                $switch = false;
+                foreach ($matches as $y) {
+                    if ($switch && $y > $this->seq[$k-1]) {
+                        USE_ASSERTS && assert($y < $this->seq[$k]);
+                        // Optimization: this is a common case:
+                        //  next match is just replacing previous match.
+                        $this->in_seq[$this->seq[$k]] = false;
+                        $this->seq[$k] = $y;
+                        $this->in_seq[$y] = 1;
+                    }
+                    else if (empty($this->in_seq[$y])) {
+                        $k = $this->_lcs_pos($y);
+                        USE_ASSERTS && assert($k > 0);
+                        $ymids[$k] = $ymids[$k-1];
+                        $switch = true;
+                    }
+                }
+            }
+        }
+
+        $seps[] = $flip ? array($yoff, $xoff) : array($xoff, $yoff);
+        $ymid = $ymids[$this->lcs];
+        for ($n = 0; $n < $nchunks - 1; $n++) {
+            $x1 = $xoff + (int)(($numer + ($xlim - $xoff) * $n) / $nchunks);
+            $y1 = $ymid[$n] + 1;
+            $seps[] = $flip ? array($y1, $x1) : array($x1, $y1);
+        }
+        $seps[] = $flip ? array($ylim, $xlim) : array($xlim, $ylim);
+
+        return array($this->lcs, $seps);
+    }
+
+    function _lcs_pos($ypos) {
+        $end = $this->lcs;
+        if ($end == 0 || $ypos > $this->seq[$end]) {
+            $this->seq[++$this->lcs] = $ypos;
+            $this->in_seq[$ypos] = 1;
+            return $this->lcs;
+        }
+
+        $beg = 1;
+        while ($beg < $end) {
+            $mid = (int)(($beg + $end) / 2);
+            if ($ypos > $this->seq[$mid])
+                $beg = $mid + 1;
+            else
+                $end = $mid;
+        }
+
+        USE_ASSERTS && assert($ypos != $this->seq[$end]);
+
+        $this->in_seq[$this->seq[$end]] = false;
+        $this->seq[$end] = $ypos;
+        $this->in_seq[$ypos] = 1;
+        return $end;
+    }
+
+    /**
+     * Find LCS of two sequences.
+     *
+     * The results are recorded in the vectors $this->{x,y}changed[], by
+     * storing a 1 in the element for each line that is an insertion
+     * or deletion (ie. is not in the LCS).
+     *
+     * The subsequence of file 0 is [XOFF, XLIM) and likewise for file 1.
+     *
+     * Note that XLIM, YLIM are exclusive bounds.
+     * All line numbers are origin-0 and discarded lines are not counted.
+     *
+     * @param integer $xoff
+     * @param integer $xlim
+     * @param integer $yoff
+     * @param integer $ylim
+     */
+    function _compareseq($xoff, $xlim, $yoff, $ylim) {
+        // Slide down the bottom initial diagonal.
+        while ($xoff < $xlim && $yoff < $ylim && $this->xv[$xoff] == $this->yv[$yoff]) {
+            ++$xoff;
+            ++$yoff;
+        }
+
+        // Slide up the top initial diagonal.
+        while ($xlim > $xoff && $ylim > $yoff && $this->xv[$xlim - 1] == $this->yv[$ylim - 1]) {
+            --$xlim;
+            --$ylim;
+        }
+
+        if ($xoff == $xlim || $yoff == $ylim)
+            $lcs = 0;
+        else {
+            // This is ad hoc but seems to work well.
+            //$nchunks = sqrt(min($xlim - $xoff, $ylim - $yoff) / 2.5);
+            //$nchunks = max(2,min(8,(int)$nchunks));
+            $nchunks = min(7, $xlim - $xoff, $ylim - $yoff) + 1;
+            list ($lcs, $seps)
+                = $this->_diag($xoff,$xlim,$yoff, $ylim,$nchunks);
+        }
+
+        if ($lcs == 0) {
+            // X and Y sequences have no common subsequence:
+            // mark all changed.
+            while ($yoff < $ylim)
+                $this->ychanged[$this->yind[$yoff++]] = 1;
+            while ($xoff < $xlim)
+                $this->xchanged[$this->xind[$xoff++]] = 1;
+        }
+        else {
+            // Use the partitions to split this problem into subproblems.
+            reset($seps);
+            $pt1 = $seps[0];
+            while ($pt2 = next($seps)) {
+                $this->_compareseq ($pt1[0], $pt2[0], $pt1[1], $pt2[1]);
+                $pt1 = $pt2;
+            }
+        }
+    }
+
+    /**
+     * Adjust inserts/deletes of identical lines to join changes
+     * as much as possible.
+     *
+     * We do something when a run of changed lines include a
+     * line at one end and has an excluded, identical line at the other.
+     * We are free to choose which identical line is included.
+     * `compareseq' usually chooses the one at the beginning,
+     * but usually it is cleaner to consider the following identical line
+     * to be the "change".
+     *
+     * This is extracted verbatim from analyze.c (GNU diffutils-2.7).
+     *
+     * @param array $lines
+     * @param array $changed
+     * @param array $other_changed
+     */
+    function _shift_boundaries($lines, &$changed, $other_changed) {
+        $i = 0;
+        $j = 0;
+
+        USE_ASSERTS && assert(count($lines) == count($changed));
+        $len = count($lines);
+        $other_len = count($other_changed);
+
+        while (1) {
+            /*
+             * Scan forwards to find beginning of another run of changes.
+             * Also keep track of the corresponding point in the other file.
+             *
+             * Throughout this code, $i and $j are adjusted together so that
+             * the first $i elements of $changed and the first $j elements
+             * of $other_changed both contain the same number of zeros
+             * (unchanged lines).
+             * Furthermore, $j is always kept so that $j == $other_len or
+             * $other_changed[$j] == false.
+             */
+            while ($j < $other_len && $other_changed[$j])
+                $j++;
+
+            while ($i < $len && ! $changed[$i]) {
+                USE_ASSERTS && assert($j < $other_len && ! $other_changed[$j]);
+                $i++;
+                $j++;
+                while ($j < $other_len && $other_changed[$j])
+                    $j++;
+            }
+
+            if ($i == $len)
+                break;
+
+            $start = $i;
+
+            // Find the end of this run of changes.
+            while (++$i < $len && $changed[$i])
+                continue;
+
+            do {
+                /*
+                 * Record the length of this run of changes, so that
+                 * we can later determine whether the run has grown.
+                 */
+                $runlength = $i - $start;
+
+                /*
+                 * Move the changed region back, so long as the
+                 * previous unchanged line matches the last changed one.
+                 * This merges with previous changed regions.
+                 */
+                while ($start > 0 && $lines[$start - 1] == $lines[$i - 1]) {
+                    $changed[--$start] = 1;
+                    $changed[--$i] = false;
+                    while ($start > 0 && $changed[$start - 1])
+                        $start--;
+                    USE_ASSERTS && assert($j > 0);
+                    while ($other_changed[--$j])
+                        continue;
+                    USE_ASSERTS && assert($j >= 0 && !$other_changed[$j]);
+                }
+
+                /*
+                 * Set CORRESPONDING to the end of the changed run, at the last
+                 * point where it corresponds to a changed run in the other file.
+                 * CORRESPONDING == LEN means no such point has been found.
+                 */
+                $corresponding = $j < $other_len ? $i : $len;
+
+                /*
+                 * Move the changed region forward, so long as the
+                 * first changed line matches the following unchanged one.
+                 * This merges with following changed regions.
+                 * Do this second, so that if there are no merges,
+                 * the changed region is moved forward as far as possible.
+                 */
+                while ($i < $len && $lines[$start] == $lines[$i]) {
+                    $changed[$start++] = false;
+                    $changed[$i++] = 1;
+                    while ($i < $len && $changed[$i])
+                        $i++;
+
+                    USE_ASSERTS && assert($j < $other_len && ! $other_changed[$j]);
+                    $j++;
+                    if ($j < $other_len && $other_changed[$j]) {
+                        $corresponding = $i;
+                        while ($j < $other_len && $other_changed[$j])
+                            $j++;
+                    }
+                }
+            } while ($runlength != $i - $start);
+
+            /*
+             * If possible, move the fully-merged run of changes
+             * back to a corresponding run in the other file.
+             */
+            while ($corresponding < $i) {
+                $changed[--$start] = 1;
+                $changed[--$i] = 0;
+                USE_ASSERTS && assert($j > 0);
+                while ($other_changed[--$j])
+                    continue;
+                USE_ASSERTS && assert($j >= 0 && !$other_changed[$j]);
+            }
+        }
+    }
+}
+
+/**
+ * Class representing a 'diff' between two sequences of strings.
+ */
+class Diff {
+
+    var $edits;
+
+    /**
+     * Constructor.
+     * Computes diff between sequences of strings.
+     *
+     * @param array $from_lines An array of strings.
+     *                          (Typically these are lines from a file.)
+     * @param array $to_lines   An array of strings.
+     */
+    function __construct($from_lines, $to_lines) {
+        $eng = new _DiffEngine;
+        $this->edits = $eng->diff($from_lines, $to_lines);
+        //$this->_check($from_lines, $to_lines);
+    }
+
+    /**
+     * Compute reversed Diff.
+     *
+     * SYNOPSIS:
+     *
+     *  $diff = new Diff($lines1, $lines2);
+     *  $rev = $diff->reverse();
+     *
+     * @return Diff  A Diff object representing the inverse of the
+     *               original diff.
+     */
+    function reverse() {
+        $rev = $this;
+        $rev->edits = array();
+        foreach ($this->edits as $edit) {
+            $rev->edits[] = $edit->reverse();
+        }
+        return $rev;
+    }
+
+    /**
+     * Check for empty diff.
+     *
+     * @return bool True iff two sequences were identical.
+     */
+    function isEmpty() {
+        foreach ($this->edits as $edit) {
+            if ($edit->type != 'copy')
+                return false;
+        }
+        return true;
+    }
+
+    /**
+     * Compute the length of the Longest Common Subsequence (LCS).
+     *
+     * This is mostly for diagnostic purposed.
+     *
+     * @return int The length of the LCS.
+     */
+    function lcs() {
+        $lcs = 0;
+        foreach ($this->edits as $edit) {
+            if ($edit->type == 'copy')
+                $lcs += count($edit->orig);
+        }
+        return $lcs;
+    }
+
+    /**
+     * Get the original set of lines.
+     *
+     * This reconstructs the $from_lines parameter passed to the
+     * constructor.
+     *
+     * @return array The original sequence of strings.
+     */
+    function orig() {
+        $lines = array();
+
+        foreach ($this->edits as $edit) {
+            if ($edit->orig)
+                array_splice($lines, count($lines), 0, $edit->orig);
+        }
+        return $lines;
+    }
+
+    /**
+     * Get the closing set of lines.
+     *
+     * This reconstructs the $to_lines parameter passed to the
+     * constructor.
+     *
+     * @return array The sequence of strings.
+     */
+    function closing() {
+        $lines = array();
+
+        foreach ($this->edits as $edit) {
+            if ($edit->closing)
+                array_splice($lines, count($lines), 0, $edit->closing);
+        }
+        return $lines;
+    }
+
+    /**
+     * Check a Diff for validity.
+     *
+     * This is here only for debugging purposes.
+     *
+     * @param mixed $from_lines
+     * @param mixed $to_lines
+     */
+    function _check($from_lines, $to_lines) {
+        if (serialize($from_lines) != serialize($this->orig()))
+            trigger_error("Reconstructed original doesn't match", E_USER_ERROR);
+        if (serialize($to_lines) != serialize($this->closing()))
+            trigger_error("Reconstructed closing doesn't match", E_USER_ERROR);
+
+        $rev = $this->reverse();
+        if (serialize($to_lines) != serialize($rev->orig()))
+            trigger_error("Reversed original doesn't match", E_USER_ERROR);
+        if (serialize($from_lines) != serialize($rev->closing()))
+            trigger_error("Reversed closing doesn't match", E_USER_ERROR);
+
+        $prevtype = 'none';
+        foreach ($this->edits as $edit) {
+            if ($prevtype == $edit->type)
+                trigger_error("Edit sequence is non-optimal", E_USER_ERROR);
+            $prevtype = $edit->type;
+        }
+
+        $lcs = $this->lcs();
+        trigger_error("Diff okay: LCS = $lcs", E_USER_NOTICE);
+    }
+}
+
+/**
+ * FIXME: bad name.
+ */
+class MappedDiff extends Diff {
+    /**
+     * Constructor.
+     *
+     * Computes diff between sequences of strings.
+     *
+     * This can be used to compute things like
+     * case-insensitve diffs, or diffs which ignore
+     * changes in white-space.
+     *
+     * @param string[] $from_lines         An array of strings.
+     *                                     (Typically these are lines from a file.)
+     *
+     * @param string[] $to_lines           An array of strings.
+     *
+     * @param string[] $mapped_from_lines  This array should
+     *                                     have the same size number of elements as $from_lines.
+     *                                     The elements in $mapped_from_lines and
+     *                                     $mapped_to_lines are what is actually compared
+     *                                     when computing the diff.
+     *
+     * @param string[] $mapped_to_lines    This array should
+     *                                     have the same number of elements as $to_lines.
+     */
+    function __construct($from_lines, $to_lines, $mapped_from_lines, $mapped_to_lines) {
+
+        assert(count($from_lines) == count($mapped_from_lines));
+        assert(count($to_lines) == count($mapped_to_lines));
+
+        parent::__construct($mapped_from_lines, $mapped_to_lines);
+
+        $xi = $yi = 0;
+        $ecnt = count($this->edits);
+        for ($i = 0; $i < $ecnt; $i++) {
+            $orig = &$this->edits[$i]->orig;
+            if (is_array($orig)) {
+                $orig = array_slice($from_lines, $xi, count($orig));
+                $xi += count($orig);
+            }
+
+            $closing = &$this->edits[$i]->closing;
+            if (is_array($closing)) {
+                $closing = array_slice($to_lines, $yi, count($closing));
+                $yi += count($closing);
+            }
+        }
+    }
+}
+
+/**
+ * A class to format Diffs
+ *
+ * This class formats the diff in classic diff format.
+ * It is intended that this class be customized via inheritance,
+ * to obtain fancier outputs.
+ */
+class DiffFormatter {
+    /**
+     * Number of leading context "lines" to preserve.
+     *
+     * This should be left at zero for this class, but subclasses
+     * may want to set this to other values.
+     */
+    var $leading_context_lines = 0;
+
+    /**
+     * Number of trailing context "lines" to preserve.
+     *
+     * This should be left at zero for this class, but subclasses
+     * may want to set this to other values.
+     */
+    var $trailing_context_lines = 0;
+
+    /**
+     * Format a diff.
+     *
+     * @param Diff $diff A Diff object.
+     * @return string The formatted output.
+     */
+    function format($diff) {
+
+        $xi = $yi = 1;
+        $x0 = $y0 = 0;
+        $block = false;
+        $context = array();
+
+        $nlead = $this->leading_context_lines;
+        $ntrail = $this->trailing_context_lines;
+
+        $this->_start_diff();
+
+        foreach ($diff->edits as $edit) {
+            if ($edit->type == 'copy') {
+                if (is_array($block)) {
+                    if (count($edit->orig) <= $nlead + $ntrail) {
+                        $block[] = $edit;
+                    }
+                    else{
+                        if ($ntrail) {
+                            $context = array_slice($edit->orig, 0, $ntrail);
+                            $block[] = new _DiffOp_Copy($context);
+                        }
+                        $this->_block($x0, $ntrail + $xi - $x0, $y0, $ntrail + $yi - $y0, $block);
+                        $block = false;
+                    }
+                }
+                $context = $edit->orig;
+            }
+            else {
+                if (! is_array($block)) {
+                    $context = array_slice($context, count($context) - $nlead);
+                    $x0 = $xi - count($context);
+                    $y0 = $yi - count($context);
+                    $block = array();
+                    if ($context)
+                        $block[] = new _DiffOp_Copy($context);
+                }
+                $block[] = $edit;
+            }
+
+            if ($edit->orig)
+                $xi += count($edit->orig);
+            if ($edit->closing)
+                $yi += count($edit->closing);
+        }
+
+        if (is_array($block))
+            $this->_block($x0, $xi - $x0, $y0, $yi - $y0, $block);
+
+        return $this->_end_diff();
+    }
+
+    /**
+     * @param int $xbeg
+     * @param int $xlen
+     * @param int $ybeg
+     * @param int $ylen
+     * @param array $edits
+     */
+    function _block($xbeg, $xlen, $ybeg, $ylen, &$edits) {
+        $this->_start_block($this->_block_header($xbeg, $xlen, $ybeg, $ylen));
+        foreach ($edits as $edit) {
+            if ($edit->type == 'copy')
+                $this->_context($edit->orig);
+            elseif ($edit->type == 'add')
+                $this->_added($edit->closing);
+            elseif ($edit->type == 'delete')
+                $this->_deleted($edit->orig);
+            elseif ($edit->type == 'change')
+                $this->_changed($edit->orig, $edit->closing);
+            else
+                trigger_error("Unknown edit type", E_USER_ERROR);
+        }
+        $this->_end_block();
+    }
+
+    function _start_diff() {
+        ob_start();
+    }
+
+    function _end_diff() {
+        $val = ob_get_contents();
+        ob_end_clean();
+        return $val;
+    }
+
+    /**
+     * @param int $xbeg
+     * @param int $xlen
+     * @param int $ybeg
+     * @param int $ylen
+     * @return string
+     */
+    function _block_header($xbeg, $xlen, $ybeg, $ylen) {
+        if ($xlen > 1)
+            $xbeg .= "," . ($xbeg + $xlen - 1);
+        if ($ylen > 1)
+            $ybeg .= "," . ($ybeg + $ylen - 1);
+
+        return $xbeg . ($xlen ? ($ylen ? 'c' : 'd') : 'a') . $ybeg;
+    }
+
+    /**
+     * @param string $header
+     */
+    function _start_block($header) {
+        echo $header;
+    }
+
+    function _end_block() {
+    }
+
+    function _lines($lines, $prefix = ' ') {
+        foreach ($lines as $line)
+            echo "$prefix ".$this->_escape($line)."\n";
+    }
+
+    function _context($lines) {
+        $this->_lines($lines);
+    }
+
+    function _added($lines) {
+        $this->_lines($lines, ">");
+    }
+    function _deleted($lines) {
+        $this->_lines($lines, "<");
+    }
+
+    function _changed($orig, $closing) {
+        $this->_deleted($orig);
+        echo "---\n";
+        $this->_added($closing);
+    }
+
+    /**
+     * Escape string
+     *
+     * Override this method within other formatters if escaping required.
+     * Base class requires $str to be returned WITHOUT escaping.
+     *
+     * @param $str string Text string to escape
+     * @return string The escaped string.
+     */
+    function _escape($str){
+        return $str;
+    }
+}
+
+/**
+ * Utilityclass for styling HTML formatted diffs
+ *
+ * Depends on global var $DIFF_INLINESTYLES, if true some minimal predefined
+ * inline styles are used. Useful for HTML mails and RSS feeds
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+class HTMLDiff {
+    /**
+     * Holds the style names and basic CSS
+     */
+    static public $styles = array(
+            'diff-addedline'    => 'background-color: #ddffdd;',
+            'diff-deletedline'  => 'background-color: #ffdddd;',
+            'diff-context'      => 'background-color: #f5f5f5;',
+            'diff-mark'         => 'color: #ff0000;',
+        );
+
+    /**
+     * Return a class or style parameter
+     *
+     * @param string $classname
+     *
+     * @return string
+     */
+    static function css($classname){
+        global $DIFF_INLINESTYLES;
+
+        if($DIFF_INLINESTYLES){
+            if(!isset(self::$styles[$classname])) return '';
+            return 'style="'.self::$styles[$classname].'"';
+        }else{
+            return 'class="'.$classname.'"';
+        }
+    }
+}
+
+/**
+ *  Additions by Axel Boldt follow, partly taken from diff.php, phpwiki-1.3.3
+ *
+ */
+
+define('NBSP', "\xC2\xA0");     // utf-8 non-breaking space.
+
+class _HWLDF_WordAccumulator {
+
+    function __construct() {
+        $this->_lines = array();
+        $this->_line = '';
+        $this->_group = '';
+        $this->_tag = '';
+    }
+
+    function _flushGroup($new_tag) {
+        if ($this->_group !== '') {
+            if ($this->_tag == 'mark')
+                $this->_line .= '<strong '.HTMLDiff::css('diff-mark').'>'.$this->_escape($this->_group).'</strong>';
+            elseif ($this->_tag == 'add')
+                $this->_line .= '<span '.HTMLDiff::css('diff-addedline').'>'.$this->_escape($this->_group).'</span>';
+            elseif ($this->_tag == 'del')
+                $this->_line .= '<span '.HTMLDiff::css('diff-deletedline').'><del>'.$this->_escape($this->_group).'</del></span>';
+            else
+                $this->_line .= $this->_escape($this->_group);
+        }
+        $this->_group = '';
+        $this->_tag = $new_tag;
+    }
+
+    /**
+     * @param string $new_tag
+     */
+    function _flushLine($new_tag) {
+        $this->_flushGroup($new_tag);
+        if ($this->_line != '')
+            $this->_lines[] = $this->_line;
+        $this->_line = '';
+    }
+
+    function addWords($words, $tag = '') {
+        if ($tag != $this->_tag)
+            $this->_flushGroup($tag);
+
+        foreach ($words as $word) {
+            // new-line should only come as first char of word.
+            if ($word == '')
+                continue;
+            if ($word[0] == "\n") {
+                $this->_group .= NBSP;
+                $this->_flushLine($tag);
+                $word = substr($word, 1);
+            }
+            assert(!strstr($word, "\n"));
+            $this->_group .= $word;
+        }
+    }
+
+    function getLines() {
+        $this->_flushLine('~done');
+        return $this->_lines;
+    }
+
+    function _escape($str){
+        return hsc($str);
+    }
+}
+
+class WordLevelDiff extends MappedDiff {
+
+    function __construct($orig_lines, $closing_lines) {
+        list ($orig_words, $orig_stripped) = $this->_split($orig_lines);
+        list ($closing_words, $closing_stripped) = $this->_split($closing_lines);
+
+        parent::__construct($orig_words, $closing_words, $orig_stripped, $closing_stripped);
+    }
+
+    function _split($lines) {
+        if (!preg_match_all('/ ( [^\S\n]+ | [0-9_A-Za-z\x80-\xff]+ | . ) (?: (?!< \n) [^\S\n])? /xsu',
+             implode("\n", $lines), $m)) {
+            return array(array(''), array(''));
+        }
+        return array($m[0], $m[1]);
+    }
+
+    function orig() {
+        $orig = new _HWLDF_WordAccumulator;
+
+        foreach ($this->edits as $edit) {
+            if ($edit->type == 'copy')
+                $orig->addWords($edit->orig);
+            elseif ($edit->orig)
+                $orig->addWords($edit->orig, 'mark');
+        }
+        return $orig->getLines();
+    }
+
+    function closing() {
+        $closing = new _HWLDF_WordAccumulator;
+
+        foreach ($this->edits as $edit) {
+            if ($edit->type == 'copy')
+                $closing->addWords($edit->closing);
+            elseif ($edit->closing)
+                $closing->addWords($edit->closing, 'mark');
+        }
+        return $closing->getLines();
+    }
+}
+
+class InlineWordLevelDiff extends MappedDiff {
+
+    function __construct($orig_lines, $closing_lines) {
+        list ($orig_words, $orig_stripped) = $this->_split($orig_lines);
+        list ($closing_words, $closing_stripped) = $this->_split($closing_lines);
+
+        parent::__construct($orig_words, $closing_words, $orig_stripped, $closing_stripped);
+    }
+
+    function _split($lines) {
+        if (!preg_match_all('/ ( [^\S\n]+ | [0-9_A-Za-z\x80-\xff]+ | . ) (?: (?!< \n) [^\S\n])? /xsu',
+             implode("\n", $lines), $m)) {
+            return array(array(''), array(''));
+        }
+        return array($m[0], $m[1]);
+    }
+
+    function inline() {
+        $orig = new _HWLDF_WordAccumulator;
+        foreach ($this->edits as $edit) {
+            if ($edit->type == 'copy')
+                $orig->addWords($edit->closing);
+            elseif ($edit->type == 'change'){
+                $orig->addWords($edit->orig, 'del');
+                $orig->addWords($edit->closing, 'add');
+            } elseif ($edit->type == 'delete')
+                $orig->addWords($edit->orig, 'del');
+            elseif ($edit->type == 'add')
+                $orig->addWords($edit->closing, 'add');
+            elseif ($edit->orig)
+                $orig->addWords($edit->orig, 'del');
+        }
+        return $orig->getLines();
+    }
+}
+
+/**
+ * "Unified" diff formatter.
+ *
+ * This class formats the diff in classic "unified diff" format.
+ *
+ * NOTE: output is plain text and unsafe for use in HTML without escaping.
+ */
+class UnifiedDiffFormatter extends DiffFormatter {
+
+    function __construct($context_lines = 4) {
+        $this->leading_context_lines = $context_lines;
+        $this->trailing_context_lines = $context_lines;
+    }
+
+    function _block_header($xbeg, $xlen, $ybeg, $ylen) {
+        if ($xlen != 1)
+            $xbeg .= "," . $xlen;
+        if ($ylen != 1)
+            $ybeg .= "," . $ylen;
+        return "@@ -$xbeg +$ybeg @@\n";
+    }
+
+    function _added($lines) {
+        $this->_lines($lines, "+");
+    }
+    function _deleted($lines) {
+        $this->_lines($lines, "-");
+    }
+    function _changed($orig, $final) {
+        $this->_deleted($orig);
+        $this->_added($final);
+    }
+}
+
+/**
+ *  Wikipedia Table style diff formatter.
+ *
+ */
+class TableDiffFormatter extends DiffFormatter {
+    var $colspan = 2;
+
+    function __construct() {
+        $this->leading_context_lines = 2;
+        $this->trailing_context_lines = 2;
+    }
+
+    /**
+     * @param Diff $diff
+     * @return string
+     */
+    function format($diff) {
+        // Preserve whitespaces by converting some to non-breaking spaces.
+        // Do not convert all of them to allow word-wrap.
+        $val = parent::format($diff);
+        $val = str_replace('  ','&#160; ', $val);
+        $val = preg_replace('/ (?=<)|(?<=[ >]) /', '&#160;', $val);
+        return $val;
+    }
+
+    function _pre($text){
+        $text = htmlspecialchars($text);
+        return $text;
+    }
+
+    function _block_header($xbeg, $xlen, $ybeg, $ylen) {
+        global $lang;
+        $l1 = $lang['line'].' '.$xbeg;
+        $l2 = $lang['line'].' '.$ybeg;
+        $r = '<tr><td '.HTMLDiff::css('diff-blockheader').' colspan="'.$this->colspan.'">'.$l1.":</td>\n".
+             '<td '.HTMLDiff::css('diff-blockheader').' colspan="'.$this->colspan.'">'.$l2.":</td>\n".
+             "</tr>\n";
+        return $r;
+    }
+
+    function _start_block($header) {
+        print($header);
+    }
+
+    function _end_block() {
+    }
+
+    function _lines($lines, $prefix=' ', $color="white") {
+    }
+
+    function addedLine($line,$escaped=false) {
+        if (!$escaped){
+            $line = $this->_escape($line);
+        }
+        return '<td '.HTMLDiff::css('diff-lineheader').'>+</td>'.
+               '<td '.HTMLDiff::css('diff-addedline').'>' .  $line.'</td>';
+    }
+
+    function deletedLine($line,$escaped=false) {
+        if (!$escaped){
+            $line = $this->_escape($line);
+        }
+        return '<td '.HTMLDiff::css('diff-lineheader').'>-</td>'.
+               '<td '.HTMLDiff::css('diff-deletedline').'>' .  $line.'</td>';
+    }
+
+    function emptyLine() {
+        return '<td colspan="'.$this->colspan.'">&#160;</td>';
+    }
+
+    function contextLine($line) {
+        return '<td '.HTMLDiff::css('diff-lineheader').'>&#160;</td>'.
+               '<td '.HTMLDiff::css('diff-context').'>'.$this->_escape($line).'</td>';
+    }
+
+    function _added($lines) {
+        $this->_addedLines($lines,false);
+    }
+
+    function _addedLines($lines,$escaped=false){
+        foreach ($lines as $line) {
+            print('<tr>' . $this->emptyLine() . $this->addedLine($line,$escaped) . "</tr>\n");
+        }
+    }
+
+    function _deleted($lines) {
+        foreach ($lines as $line) {
+            print('<tr>' . $this->deletedLine($line) . $this->emptyLine() . "</tr>\n");
+        }
+    }
+
+    function _context($lines) {
+        foreach ($lines as $line) {
+            print('<tr>' . $this->contextLine($line) .  $this->contextLine($line) . "</tr>\n");
+        }
+    }
+
+    function _changed($orig, $closing) {
+        $diff = new WordLevelDiff($orig, $closing);  // this escapes the diff data
+        $del = $diff->orig();
+        $add = $diff->closing();
+
+        while ($line = array_shift($del)) {
+            $aline = array_shift($add);
+            print('<tr>' . $this->deletedLine($line,true) . $this->addedLine($aline,true) . "</tr>\n");
+        }
+        $this->_addedLines($add,true); # If any leftovers
+    }
+
+    function _escape($str) {
+        return hsc($str);
+    }
+}
+
+/**
+ *  Inline style diff formatter.
+ *
+ */
+class InlineDiffFormatter extends DiffFormatter {
+    var $colspan = 2;
+
+    function __construct() {
+        $this->leading_context_lines = 2;
+        $this->trailing_context_lines = 2;
+    }
+
+    /**
+     * @param Diff $diff
+     * @return string
+     */
+    function format($diff) {
+        // Preserve whitespaces by converting some to non-breaking spaces.
+        // Do not convert all of them to allow word-wrap.
+        $val = parent::format($diff);
+        $val = str_replace('  ','&#160; ', $val);
+        $val = preg_replace('/ (?=<)|(?<=[ >]) /', '&#160;', $val);
+        return $val;
+    }
+
+    function _pre($text){
+        $text = htmlspecialchars($text);
+        return $text;
+    }
+
+    function _block_header($xbeg, $xlen, $ybeg, $ylen) {
+        global $lang;
+        if ($xlen != 1)
+            $xbeg .= "," . $xlen;
+        if ($ylen != 1)
+            $ybeg .= "," . $ylen;
+        $r = '<tr><td colspan="'.$this->colspan.'" '.HTMLDiff::css('diff-blockheader').'>@@ '.$lang['line']." -$xbeg +$ybeg @@";
+        $r .= ' <span '.HTMLDiff::css('diff-deletedline').'><del>'.$lang['deleted'].'</del></span>';
+        $r .= ' <span '.HTMLDiff::css('diff-addedline').'>'.$lang['created'].'</span>';
+        $r .= "</td></tr>\n";
+        return $r;
+    }
+
+    function _start_block($header) {
+        print($header."\n");
+    }
+
+    function _end_block() {
+    }
+
+    function _lines($lines, $prefix=' ', $color="white") {
+    }
+
+    function _added($lines) {
+        foreach ($lines as $line) {
+            print('<tr><td '.HTMLDiff::css('diff-lineheader').'>&#160;</td><td '.HTMLDiff::css('diff-addedline').'>'. $this->_escape($line) . "</td></tr>\n");
+        }
+    }
+
+    function _deleted($lines) {
+        foreach ($lines as $line) {
+            print('<tr><td '.HTMLDiff::css('diff-lineheader').'>&#160;</td><td '.HTMLDiff::css('diff-deletedline').'><del>' . $this->_escape($line) . "</del></td></tr>\n");
+        }
+    }
+
+    function _context($lines) {
+        foreach ($lines as $line) {
+            print('<tr><td '.HTMLDiff::css('diff-lineheader').'>&#160;</td><td '.HTMLDiff::css('diff-context').'>'. $this->_escape($line) ."</td></tr>\n");
+        }
+    }
+
+    function _changed($orig, $closing) {
+        $diff = new InlineWordLevelDiff($orig, $closing);  // this escapes the diff data
+        $add = $diff->inline();
+
+        foreach ($add as $line)
+            print('<tr><td '.HTMLDiff::css('diff-lineheader').'>&#160;</td><td>'.$line."</td></tr>\n");
+    }
+
+    function _escape($str) {
+        return hsc($str);
+    }
+}
+
+/**
+ * A class for computing three way diffs.
+ *
+ * @author  Geoffrey T. Dairiki <dairiki@dairiki.org>
+ */
+class Diff3 extends Diff {
+
+    /**
+     * Conflict counter.
+     *
+     * @var integer
+     */
+    var $_conflictingBlocks = 0;
+
+    /**
+     * Computes diff between 3 sequences of strings.
+     *
+     * @param array $orig    The original lines to use.
+     * @param array $final1  The first version to compare to.
+     * @param array $final2  The second version to compare to.
+     */
+    function __construct($orig, $final1, $final2) {
+        $engine = new _DiffEngine();
+
+        $this->_edits = $this->_diff3($engine->diff($orig, $final1),
+                                      $engine->diff($orig, $final2));
+    }
+
+    /**
+     * Returns the merged lines
+     *
+     * @param string $label1  label for first version
+     * @param string $label2  label for second version
+     * @param string $label3  separator between versions
+     * @return array          lines of the merged text
+     */
+    function mergedOutput($label1='<<<<<<<',$label2='>>>>>>>',$label3='=======') {
+        $lines = array();
+        foreach ($this->_edits as $edit) {
+            if ($edit->isConflict()) {
+                /* FIXME: this should probably be moved somewhere else. */
+                $lines = array_merge($lines,
+                                     array($label1),
+                                     $edit->final1,
+                                     array($label3),
+                                     $edit->final2,
+                                     array($label2));
+                $this->_conflictingBlocks++;
+            } else {
+                $lines = array_merge($lines, $edit->merged());
+            }
+        }
+
+        return $lines;
+    }
+
+    /**
+     * @access private
+     *
+     * @param array $edits1
+     * @param array $edits2
+     *
+     * @return array
+     */
+    function _diff3($edits1, $edits2) {
+        $edits = array();
+        $bb = new _Diff3_BlockBuilder();
+
+        $e1 = current($edits1);
+        $e2 = current($edits2);
+        while ($e1 || $e2) {
+            if ($e1 && $e2 && is_a($e1, '_DiffOp_copy') && is_a($e2, '_DiffOp_copy')) {
+                /* We have copy blocks from both diffs. This is the (only)
+                 * time we want to emit a diff3 copy block.  Flush current
+                 * diff3 diff block, if any. */
+                if ($edit = $bb->finish()) {
+                    $edits[] = $edit;
+                }
+
+                $ncopy = min($e1->norig(), $e2->norig());
+                assert($ncopy > 0);
+                $edits[] = new _Diff3_Op_copy(array_slice($e1->orig, 0, $ncopy));
+
+                if ($e1->norig() > $ncopy) {
+                    array_splice($e1->orig, 0, $ncopy);
+                    array_splice($e1->closing, 0, $ncopy);
+                } else {
+                    $e1 = next($edits1);
+                }
+
+                if ($e2->norig() > $ncopy) {
+                    array_splice($e2->orig, 0, $ncopy);
+                    array_splice($e2->closing, 0, $ncopy);
+                } else {
+                    $e2 = next($edits2);
+                }
+            } else {
+                if ($e1 && $e2) {
+                    if ($e1->orig && $e2->orig) {
+                        $norig = min($e1->norig(), $e2->norig());
+                        $orig = array_splice($e1->orig, 0, $norig);
+                        array_splice($e2->orig, 0, $norig);
+                        $bb->input($orig);
+                    }
+
+                    if (is_a($e1, '_DiffOp_copy')) {
+                        $bb->out1(array_splice($e1->closing, 0, $norig));
+                    }
+
+                    if (is_a($e2, '_DiffOp_copy')) {
+                        $bb->out2(array_splice($e2->closing, 0, $norig));
+                    }
+                }
+
+                if ($e1 && ! $e1->orig) {
+                    $bb->out1($e1->closing);
+                    $e1 = next($edits1);
+                }
+                if ($e2 && ! $e2->orig) {
+                    $bb->out2($e2->closing);
+                    $e2 = next($edits2);
+                }
+            }
+        }
+
+        if ($edit = $bb->finish()) {
+            $edits[] = $edit;
+        }
+
+        return $edits;
+    }
+}
+
+/**
+ * @author  Geoffrey T. Dairiki <dairiki@dairiki.org>
+ *
+ * @access private
+ */
+class _Diff3_Op {
+
+    function __construct($orig = false, $final1 = false, $final2 = false) {
+        $this->orig = $orig ? $orig : array();
+        $this->final1 = $final1 ? $final1 : array();
+        $this->final2 = $final2 ? $final2 : array();
+    }
+
+    function merged() {
+        if (!isset($this->_merged)) {
+            if ($this->final1 === $this->final2) {
+                $this->_merged = &$this->final1;
+            } elseif ($this->final1 === $this->orig) {
+                $this->_merged = &$this->final2;
+            } elseif ($this->final2 === $this->orig) {
+                $this->_merged = &$this->final1;
+            } else {
+                $this->_merged = false;
+            }
+        }
+
+        return $this->_merged;
+    }
+
+    function isConflict() {
+        return $this->merged() === false;
+    }
+
+}
+
+/**
+ * @author  Geoffrey T. Dairiki <dairiki@dairiki.org>
+ *
+ * @access private
+ */
+class _Diff3_Op_copy extends _Diff3_Op {
+
+    function __construct($lines = false) {
+        $this->orig = $lines ? $lines : array();
+        $this->final1 = &$this->orig;
+        $this->final2 = &$this->orig;
+    }
+
+    function merged() {
+        return $this->orig;
+    }
+
+    function isConflict() {
+        return false;
+    }
+}
+
+/**
+ * @author  Geoffrey T. Dairiki <dairiki@dairiki.org>
+ *
+ * @access private
+ */
+class _Diff3_BlockBuilder {
+
+    function __construct() {
+        $this->_init();
+    }
+
+    function input($lines) {
+        if ($lines) {
+            $this->_append($this->orig, $lines);
+        }
+    }
+
+    function out1($lines) {
+        if ($lines) {
+            $this->_append($this->final1, $lines);
+        }
+    }
+
+    function out2($lines) {
+        if ($lines) {
+            $this->_append($this->final2, $lines);
+        }
+    }
+
+    function isEmpty() {
+        return !$this->orig && !$this->final1 && !$this->final2;
+    }
+
+    function finish() {
+        if ($this->isEmpty()) {
+            return false;
+        } else {
+            $edit = new _Diff3_Op($this->orig, $this->final1, $this->final2);
+            $this->_init();
+            return $edit;
+        }
+    }
+
+    function _init() {
+        $this->orig = $this->final1 = $this->final2 = array();
+    }
+
+    function _append(&$array, $lines) {
+        array_splice($array, sizeof($array), 0, $lines);
+    }
+}
+
+//Setup VIM: ex: et ts=4 :
diff --git a/wiki/inc/FeedParser.php b/wiki/inc/FeedParser.php
new file mode 100644
index 0000000..39434dc
--- /dev/null
+++ b/wiki/inc/FeedParser.php
@@ -0,0 +1,84 @@
+<?php
+/**
+ * Class used to parse RSS and ATOM feeds
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+
+if(!defined('DOKU_INC')) die('meh.');
+
+/**
+ * We override some methods of the original SimplePie class here
+ */
+class FeedParser extends SimplePie {
+
+    /**
+     * Constructor. Set some defaults
+     */
+    function __construct(){
+        parent::__construct();
+        $this->enable_cache(false);
+        $this->set_file_class('FeedParser_File');
+    }
+
+    /**
+     * Backward compatibility for older plugins
+     *
+     * @param string $url
+     */
+    function feed_url($url){
+        $this->set_feed_url($url);
+    }
+}
+
+/**
+ * Fetch an URL using our own HTTPClient
+ *
+ * Replaces SimplePie's own class
+ */
+class FeedParser_File extends SimplePie_File {
+    var $http;
+    var $useragent;
+    var $success = true;
+    var $headers = array();
+    var $body;
+    var $error;
+    /** @noinspection PhpMissingParentConstructorInspection */
+
+    /**
+     * Inititializes the HTTPClient
+     *
+     * We ignore all given parameters - they are set in DokuHTTPClient
+     *
+     * @inheritdoc
+     */
+    function __construct($url, $timeout=10, $redirects=5,
+                         $headers=null, $useragent=null, $force_fsockopen=false, $curl_options = array()) {
+        $this->http    = new DokuHTTPClient();
+        $this->success = $this->http->sendRequest($url);
+
+        $this->headers = $this->http->resp_headers;
+        $this->body    = $this->http->resp_body;
+        $this->error   = $this->http->error;
+
+        $this->method  = SIMPLEPIE_FILE_SOURCE_REMOTE | SIMPLEPIE_FILE_SOURCE_FSOCKOPEN;
+
+        return $this->success;
+    }
+
+    /** @inheritdoc */
+    function headers(){
+        return $this->headers;
+    }
+
+    /** @inheritdoc */
+    function body(){
+        return $this->body;
+    }
+
+    /** @inheritdoc */
+    function close(){
+        return true;
+    }
+
+}
diff --git a/wiki/inc/Form/ButtonElement.php b/wiki/inc/Form/ButtonElement.php
new file mode 100644
index 0000000..e2afe9c
--- /dev/null
+++ b/wiki/inc/Form/ButtonElement.php
@@ -0,0 +1,34 @@
+<?php
+namespace dokuwiki\Form;
+
+/**
+ * Class ButtonElement
+ *
+ * Represents a simple button
+ *
+ * @package dokuwiki\Form
+ */
+class ButtonElement extends Element {
+
+    /** @var string HTML content */
+    protected $content = '';
+
+    /**
+     * @param string $name
+     * @param string $content HTML content of the button. You have to escape it yourself.
+     */
+    function __construct($name, $content = '') {
+        parent::__construct('button', array('name' => $name, 'value' => 1));
+        $this->content = $content;
+    }
+
+    /**
+     * The HTML representation of this element
+     *
+     * @return string
+     */
+    public function toHTML() {
+        return '<button ' . buildAttributes($this->attrs(), true) . '>'.$this->content.'</button>';
+    }
+
+}
diff --git a/wiki/inc/Form/CheckableElement.php b/wiki/inc/Form/CheckableElement.php
new file mode 100644
index 0000000..27d5c2e
--- /dev/null
+++ b/wiki/inc/Form/CheckableElement.php
@@ -0,0 +1,62 @@
+<?php
+namespace dokuwiki\Form;
+
+/**
+ * Class CheckableElement
+ *
+ * For Radio- and Checkboxes
+ *
+ * @package dokuwiki\Form
+ */
+class CheckableElement extends InputElement {
+
+    /**
+     * @param string $type The type of this element
+     * @param string $name The name of this form element
+     * @param string $label The label text for this element
+     */
+    public function __construct($type, $name, $label) {
+        parent::__construct($type, $name, $label);
+        // default value is 1
+        $this->attr('value', 1);
+    }
+
+    /**
+     * Handles the useInput flag and sets the checked attribute accordingly
+     */
+    protected function prefillInput() {
+        global $INPUT;
+        list($name, $key) = $this->getInputName();
+        $myvalue = $this->val();
+
+        if(!$INPUT->has($name)) return;
+
+        if($key === null) {
+            // no key - single value
+            $value = $INPUT->str($name);
+            if($value == $myvalue) {
+                $this->attr('checked', 'checked');
+            } else {
+                $this->rmattr('checked');
+            }
+        } else {
+            // we have an array, there might be several values in it
+            $input = $INPUT->arr($name);
+            if(isset($input[$key])) {
+                $this->rmattr('checked');
+
+                // values seem to be in another sub array
+                if(is_array($input[$key])) {
+                    $input = $input[$key];
+                }
+
+                foreach($input as $value) {
+                    if($value == $myvalue) {
+                        $this->attr('checked', 'checked');
+                    }
+                }
+            }
+        }
+    }
+
+}
diff --git a/wiki/inc/Form/DropdownElement.php b/wiki/inc/Form/DropdownElement.php
new file mode 100644
index 0000000..023b67d
--- /dev/null
+++ b/wiki/inc/Form/DropdownElement.php
@@ -0,0 +1,190 @@
+<?php
+namespace dokuwiki\Form;
+
+/**
+ * Class DropdownElement
+ *
+ * Represents a HTML select. Please note that this does not support multiple selected options!
+ *
+ * @package dokuwiki\Form
+ */
+class DropdownElement extends InputElement {
+
+    /** @var array OptGroup[] */
+    protected $optGroups = array();
+
+    /**
+     * @param string $name The name of this form element
+     * @param array  $options The available options
+     * @param string $label The label text for this element (will be autoescaped)
+     */
+    public function __construct($name, $options, $label = '') {
+        parent::__construct('dropdown', $name, $label);
+        $this->rmattr('type');
+        $this->optGroups[''] = new OptGroup(null, $options);
+        $this->val('');
+    }
+
+    /**
+     * Add an `<optgroup>` and respective options
+     *
+     * @param string $label
+     * @param array  $options
+     * @return OptGroup a reference to the added optgroup
+     * @throws \Exception
+     */
+    public function addOptGroup($label, $options) {
+        if (empty($label)) {
+            throw new \InvalidArgumentException(hsc('<optgroup> must have a label!'));
+        }
+        $this->optGroups[$label] = new OptGroup($label, $options);
+        return end($this->optGroups);
+    }
+
+    /**
+     * Set or get the optgroups of an Dropdown-Element.
+     *
+     * optgroups have to be given as associative array
+     *   * the key being the label of the group
+     *   * the value being an array of options as defined in @see OptGroup::options()
+     *
+     * @param null|array $optGroups
+     * @return OptGroup[]|DropdownElement
+     */
+    public function optGroups($optGroups = null) {
+        if($optGroups === null) {
+            return $this->optGroups;
+        }
+        if (!is_array($optGroups)) {
+            throw new \InvalidArgumentException(hsc('Argument must be an associative array of label => [options]!'));
+        }
+        $this->optGroups = array();
+        foreach ($optGroups as $label => $options) {
+            $this->addOptGroup($label, $options);
+        }
+        return $this;
+    }
+
+    /**
+     * Get or set the options of the Dropdown
+     *
+     * Options can be given as associative array (value => label) or as an
+     * indexd array (label = value) or as an array of arrays. In the latter
+     * case an element has to look as follows:
+     * option-value => array (
+     *                 'label' => option-label,
+     *                 'attrs' => array (
+     *                                    attr-key => attr-value, ...
+     *                                  )
+     *                 )
+     *
+     * @param null|array $options
+     * @return $this|array
+     */
+    public function options($options = null) {
+        if ($options === null) {
+            return $this->optGroups['']->options();
+        }
+        $this->optGroups[''] = new OptGroup(null, $options);
+        return $this;
+    }
+
+    /**
+     * Gets or sets an attribute
+     *
+     * When no $value is given, the current content of the attribute is returned.
+     * An empty string is returned for unset attributes.
+     *
+     * When a $value is given, the content is set to that value and the Element
+     * itself is returned for easy chaining
+     *
+     * @param string $name Name of the attribute to access
+     * @param null|string $value New value to set
+     * @return string|$this
+     */
+    public function attr($name, $value = null) {
+        if(strtolower($name) == 'multiple') {
+            throw new \InvalidArgumentException('Sorry, the dropdown element does not support the "multiple" attribute');
+        }
+        return parent::attr($name, $value);
+    }
+
+    /**
+     * Get or set the current value
+     *
+     * When setting a value that is not defined in the options, the value is ignored
+     * and the first option's value is selected instead
+     *
+     * @param null|string $value The value to set
+     * @return $this|string
+     */
+    public function val($value = null) {
+        if($value === null) return $this->value;
+
+        $value_exists = $this->setValueInOptGroups($value);
+
+        if($value_exists) {
+            $this->value = $value;
+        } else {
+            // unknown value set, select first option instead
+            $this->value = $this->getFirstOption();
+            $this->setValueInOptGroups($this->value);
+        }
+
+        return $this;
+    }
+
+    /**
+     * Returns the first options as it will be rendered in HTML
+     *
+     * @return string
+     */
+    protected function getFirstOption() {
+        $options = $this->options();
+        if (!empty($options)) {
+            $keys = array_keys($options);
+            return (string) array_shift($keys);
+        }
+        foreach ($this->optGroups as $optGroup) {
+            $options = $optGroup->options();
+            if (!empty($options)) {
+                $keys = array_keys($options);
+                return (string) array_shift($keys);
+            }
+        }
+    }
+
+    /**
+     * Set the value in the OptGroups, including the optgroup for the options without optgroup.
+     *
+     * @param string $value
+     * @return bool
+     */
+    protected function setValueInOptGroups($value) {
+        $value_exists = false;
+        /** @var OptGroup $optGroup */
+        foreach ($this->optGroups as $optGroup) {
+            $value_exists = $optGroup->storeValue($value) || $value_exists;
+            if ($value_exists) {
+                $value = null;
+            }
+        }
+        return $value_exists;
+    }
+
+    /**
+     * Create the HTML for the select it self
+     *
+     * @return string
+     */
+    protected function mainElementHTML() {
+        if($this->useInput) $this->prefillInput();
+
+        $html = '<select ' . buildAttributes($this->attrs()) . '>';
+        $html = array_reduce($this->optGroups, function($html, OptGroup $optGroup) {return $html . $optGroup->toHTML();}, $html);
+        $html .= '</select>';
+
+        return $html;
+    }
+
+}
diff --git a/wiki/inc/Form/Element.php b/wiki/inc/Form/Element.php
new file mode 100644
index 0000000..a357882
--- /dev/null
+++ b/wiki/inc/Form/Element.php
@@ -0,0 +1,151 @@
+<?php
+namespace dokuwiki\Form;
+
+/**
+ * Class Element
+ *
+ * The basic building block of a form
+ *
+ * @package dokuwiki\Form
+ */
+abstract class Element {
+
+    /**
+     * @var array the attributes of this element
+     */
+    protected $attributes = array();
+
+    /**
+     * @var string The type of this element
+     */
+    protected $type;
+
+    /**
+     * @param string $type The type of this element
+     * @param array $attributes
+     */
+    public function __construct($type, $attributes = array()) {
+        $this->type = $type;
+        $this->attributes = $attributes;
+    }
+
+    /**
+     * Type of this element
+     *
+     * @return string
+     */
+    public function getType() {
+        return $this->type;
+    }
+
+    /**
+     * Gets or sets an attribute
+     *
+     * When no $value is given, the current content of the attribute is returned.
+     * An empty string is returned for unset attributes.
+     *
+     * When a $value is given, the content is set to that value and the Element
+     * itself is returned for easy chaining
+     *
+     * @param string $name Name of the attribute to access
+     * @param null|string $value New value to set
+     * @return string|$this
+     */
+    public function attr($name, $value = null) {
+        // set
+        if($value !== null) {
+            $this->attributes[$name] = $value;
+            return $this;
+        }
+
+        // get
+        if(isset($this->attributes[$name])) {
+            return $this->attributes[$name];
+        } else {
+            return '';
+        }
+    }
+
+    /**
+     * Removes the given attribute if it exists
+     *
+     * @param string $name
+     * @return $this
+     */
+    public function rmattr($name) {
+        if(isset($this->attributes[$name])) {
+            unset($this->attributes[$name]);
+        }
+        return $this;
+    }
+
+    /**
+     * Gets or adds a all given attributes at once
+     *
+     * @param array|null $attributes
+     * @return array|$this
+     */
+    public function attrs($attributes = null) {
+        // set
+        if($attributes) {
+            foreach((array) $attributes as $key => $val) {
+                $this->attr($key, $val);
+            }
+            return $this;
+        }
+        // get
+        return $this->attributes;
+    }
+
+    /**
+     * Adds a class to the class attribute
+     *
+     * This is the preferred method of setting the element's class
+     *
+     * @param string $class the new class to add
+     * @return $this
+     */
+    public function addClass($class) {
+        $classes = explode(' ', $this->attr('class'));
+        $classes[] = $class;
+        $classes = array_unique($classes);
+        $classes = array_filter($classes);
+        $this->attr('class', join(' ', $classes));
+        return $this;
+    }
+
+    /**
+     * Get or set the element's ID
+     *
+     * This is the preferred way of setting the element's ID
+     *
+     * @param null|string $id
+     * @return string|$this
+     */
+    public function id($id = null) {
+        if(strpos($id, '__') === false) {
+            throw new \InvalidArgumentException('IDs in DokuWiki have to contain two subsequent underscores');
+        }
+
+        return $this->attr('id', $id);
+    }
+
+    /**
+     * Get or set the element's value
+     *
+     * This is the preferred way of setting the element's value
+     *
+     * @param null|string $value
+     * @return string|$this
+     */
+    public function val($value = null) {
+        return $this->attr('value', $value);
+    }
+
+    /**
+     * The HTML representation of this element
+     *
+     * @return string
+     */
+    abstract public function toHTML();
+}
diff --git a/wiki/inc/Form/FieldsetCloseElement.php b/wiki/inc/Form/FieldsetCloseElement.php
new file mode 100644
index 0000000..8f26717
--- /dev/null
+++ b/wiki/inc/Form/FieldsetCloseElement.php
@@ -0,0 +1,30 @@
+<?php
+namespace dokuwiki\Form;
+
+/**
+ * Class FieldsetCloseElement
+ *
+ * Closes an open Fieldset
+ *
+ * @package dokuwiki\Form
+ */
+class FieldsetCloseElement extends TagCloseElement {
+
+    /**
+     * @param array $attributes
+     */
+    public function __construct($attributes = array()) {
+        parent::__construct('', $attributes);
+        $this->type = 'fieldsetclose';
+    }
+
+
+    /**
+     * The HTML representation of this element
+     *
+     * @return string
+     */
+    public function toHTML() {
+        return '</fieldset>';
+    }
+}
diff --git a/wiki/inc/Form/FieldsetOpenElement.php b/wiki/inc/Form/FieldsetOpenElement.php
new file mode 100644
index 0000000..a7de461
--- /dev/null
+++ b/wiki/inc/Form/FieldsetOpenElement.php
@@ -0,0 +1,36 @@
+<?php
+namespace dokuwiki\Form;
+
+/**
+ * Class FieldsetOpenElement
+ *
+ * Opens a Fieldset with an optional legend
+ *
+ * @package dokuwiki\Form
+ */
+class FieldsetOpenElement extends TagOpenElement {
+
+    /**
+     * @param string $legend
+     * @param array $attributes
+     */
+    public function __construct($legend='', $attributes = array()) {
+        // this is a bit messy and we just do it for the nicer class hierarchy
+        // the parent would expect the tag in $value but we're storing the
+        // legend there, so we have to set the type manually
+        parent::__construct($legend, $attributes);
+        $this->type = 'fieldsetopen';
+    }
+
+    /**
+     * The HTML representation of this element
+     *
+     * @return string
+     */
+    public function toHTML() {
+        $html = '<fieldset '.buildAttributes($this->attrs()).'>';
+        $legend = $this->val();
+        if($legend) $html .= DOKU_LF.'<legend>'.hsc($legend).'</legend>';
+        return $html;
+    }
+}
diff --git a/wiki/inc/Form/Form.php b/wiki/inc/Form/Form.php
new file mode 100644
index 0000000..92bbd30
--- /dev/null
+++ b/wiki/inc/Form/Form.php
@@ -0,0 +1,456 @@
+<?php
+namespace dokuwiki\Form;
+
+/**
+ * Class Form
+ *
+ * Represents the whole Form. This is what you work on, and add Elements to
+ *
+ * @package dokuwiki\Form
+ */
+class Form extends Element {
+
+    /**
+     * @var array name value pairs for hidden values
+     */
+    protected $hidden = array();
+
+    /**
+     * @var Element[] the elements of the form
+     */
+    protected $elements = array();
+
+    /**
+     * Creates a new, empty form with some default attributes
+     *
+     * @param array $attributes
+     * @param bool  $unsafe     if true, then the security token is ommited
+     */
+    public function __construct($attributes = array(), $unsafe = false) {
+        global $ID;
+
+        parent::__construct('form', $attributes);
+
+        // use the current URL as default action
+        if(!$this->attr('action')) {
+            $get = $_GET;
+            if(isset($get['id'])) unset($get['id']);
+            $self = wl($ID, $get, false, '&'); //attributes are escaped later
+            $this->attr('action', $self);
+        }
+
+        // post is default
+        if(!$this->attr('method')) {
+            $this->attr('method', 'post');
+        }
+
+        // we like UTF-8
+        if(!$this->attr('accept-charset')) {
+            $this->attr('accept-charset', 'utf-8');
+        }
+
+        // add the security token by default
+        if (!$unsafe) {
+            $this->setHiddenField('sectok', getSecurityToken());
+        }
+
+        // identify this as a new form based form in HTML
+        $this->addClass('doku_form');
+    }
+
+    /**
+     * Sets a hidden field
+     *
+     * @param string $name
+     * @param string $value
+     * @return $this
+     */
+    public function setHiddenField($name, $value) {
+        $this->hidden[$name] = $value;
+        return $this;
+    }
+
+    #region element query function
+
+    /**
+     * Returns the numbers of elements in the form
+     *
+     * @return int
+     */
+    public function elementCount() {
+        return count($this->elements);
+    }
+
+    /**
+     * Get the position of the element in the form or false if it is not in the form
+     *
+     * Warning: This function may return Boolean FALSE, but may also return a non-Boolean value which evaluates to FALSE. Please read the section on Booleans for more information. Use the === operator for testing the return value of this function.
+     *
+     * @param Element $element
+     *
+     * @return false|int
+     */
+    public function getElementPosition(Element $element)
+    {
+        return array_search($element, $this->elements, true);
+    }
+
+    /**
+     * Returns a reference to the element at a position.
+     * A position out-of-bounds will return either the
+     * first (underflow) or last (overflow) element.
+     *
+     * @param int $pos
+     * @return Element
+     */
+    public function getElementAt($pos) {
+        if($pos < 0) $pos = count($this->elements) + $pos;
+        if($pos < 0) $pos = 0;
+        if($pos >= count($this->elements)) $pos = count($this->elements) - 1;
+        return $this->elements[$pos];
+    }
+
+    /**
+     * Gets the position of the first of a type of element
+     *
+     * @param string $type Element type to look for.
+     * @param int $offset search from this position onward
+     * @return false|int position of element if found, otherwise false
+     */
+    public function findPositionByType($type, $offset = 0) {
+        $len = $this->elementCount();
+        for($pos = $offset; $pos < $len; $pos++) {
+            if($this->elements[$pos]->getType() == $type) {
+                return $pos;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Gets the position of the first element matching the attribute
+     *
+     * @param string $name Name of the attribute
+     * @param string $value Value the attribute should have
+     * @param int $offset search from this position onward
+     * @return false|int position of element if found, otherwise false
+     */
+    public function findPositionByAttribute($name, $value, $offset = 0) {
+        $len = $this->elementCount();
+        for($pos = $offset; $pos < $len; $pos++) {
+            if($this->elements[$pos]->attr($name) == $value) {
+                return $pos;
+            }
+        }
+        return false;
+    }
+
+    #endregion
+
+    #region Element positioning functions
+
+    /**
+     * Adds or inserts an element to the form
+     *
+     * @param Element $element
+     * @param int $pos 0-based position in the form, -1 for at the end
+     * @return Element
+     */
+    public function addElement(Element $element, $pos = -1) {
+        if(is_a($element, '\dokuwiki\Form\Form')) throw new \InvalidArgumentException('You can\'t add a form to a form');
+        if($pos < 0) {
+            $this->elements[] = $element;
+        } else {
+            array_splice($this->elements, $pos, 0, array($element));
+        }
+        return $element;
+    }
+
+    /**
+     * Replaces an existing element with a new one
+     *
+     * @param Element $element the new element
+     * @param int $pos 0-based position of the element to replace
+     */
+    public function replaceElement(Element $element, $pos) {
+        if(is_a($element, '\dokuwiki\Form\Form')) throw new \InvalidArgumentException('You can\'t add a form to a form');
+        array_splice($this->elements, $pos, 1, array($element));
+    }
+
+    /**
+     * Remove an element from the form completely
+     *
+     * @param int $pos 0-based position of the element to remove
+     */
+    public function removeElement($pos) {
+        array_splice($this->elements, $pos, 1);
+    }
+
+    #endregion
+
+    #region Element adding functions
+
+    /**
+     * Adds a text input field
+     *
+     * @param string $name
+     * @param string $label
+     * @param int $pos
+     * @return InputElement
+     */
+    public function addTextInput($name, $label = '', $pos = -1) {
+        return $this->addElement(new InputElement('text', $name, $label), $pos);
+    }
+
+    /**
+     * Adds a password input field
+     *
+     * @param string $name
+     * @param string $label
+     * @param int $pos
+     * @return InputElement
+     */
+    public function addPasswordInput($name, $label = '', $pos = -1) {
+        return $this->addElement(new InputElement('password', $name, $label), $pos);
+    }
+
+    /**
+     * Adds a radio button field
+     *
+     * @param string $name
+     * @param string $label
+     * @param int $pos
+     * @return CheckableElement
+     */
+    public function addRadioButton($name, $label = '', $pos = -1) {
+        return $this->addElement(new CheckableElement('radio', $name, $label), $pos);
+    }
+
+    /**
+     * Adds a checkbox field
+     *
+     * @param string $name
+     * @param string $label
+     * @param int $pos
+     * @return CheckableElement
+     */
+    public function addCheckbox($name, $label = '', $pos = -1) {
+        return $this->addElement(new CheckableElement('checkbox', $name, $label), $pos);
+    }
+
+    /**
+     * Adds a dropdown field
+     *
+     * @param string $name
+     * @param array $options
+     * @param string $label
+     * @param int $pos
+     * @return DropdownElement
+     */
+    public function addDropdown($name, $options, $label = '', $pos = -1) {
+        return $this->addElement(new DropdownElement($name, $options, $label), $pos);
+    }
+
+    /**
+     * Adds a textarea field
+     *
+     * @param string $name
+     * @param string $label
+     * @param int $pos
+     * @return TextareaElement
+     */
+    public function addTextarea($name, $label = '', $pos = -1) {
+        return $this->addElement(new TextareaElement($name, $label), $pos);
+    }
+
+    /**
+     * Adds a simple button, escapes the content for you
+     *
+     * @param string $name
+     * @param string $content
+     * @param int $pos
+     * @return Element
+     */
+    public function addButton($name, $content, $pos = -1) {
+        return $this->addElement(new ButtonElement($name, hsc($content)), $pos);
+    }
+
+    /**
+     * Adds a simple button, allows HTML for content
+     *
+     * @param string $name
+     * @param string $html
+     * @param int $pos
+     * @return Element
+     */
+    public function addButtonHTML($name, $html, $pos = -1) {
+        return $this->addElement(new ButtonElement($name, $html), $pos);
+    }
+
+    /**
+     * Adds a label referencing another input element, escapes the label for you
+     *
+     * @param string $label
+     * @param string $for
+     * @param int $pos
+     * @return Element
+     */
+    public function addLabel($label, $for='', $pos = -1) {
+        return $this->addLabelHTML(hsc($label), $for, $pos);
+    }
+
+    /**
+     * Adds a label referencing another input element, allows HTML for content
+     *
+     * @param string $content
+     * @param string|Element $for
+     * @param int $pos
+     * @return Element
+     */
+    public function addLabelHTML($content, $for='', $pos = -1) {
+        $element = new LabelElement(hsc($content));
+
+        if(is_a($for, '\dokuwiki\Form\Element')) {
+            /** @var Element $for */
+            $for = $for->id();
+        }
+        $for = (string) $for;
+        if($for !== '') {
+            $element->attr('for', $for);
+        }
+
+        return $this->addElement($element, $pos);
+    }
+
+    /**
+     * Add fixed HTML to the form
+     *
+     * @param string $html
+     * @param int $pos
+     * @return HTMLElement
+     */
+    public function addHTML($html, $pos = -1) {
+        return $this->addElement(new HTMLElement($html), $pos);
+    }
+
+    /**
+     * Add a closed HTML tag to the form
+     *
+     * @param string $tag
+     * @param int $pos
+     * @return TagElement
+     */
+    public function addTag($tag, $pos = -1) {
+        return $this->addElement(new TagElement($tag), $pos);
+    }
+
+    /**
+     * Add an open HTML tag to the form
+     *
+     * Be sure to close it again!
+     *
+     * @param string $tag
+     * @param int $pos
+     * @return TagOpenElement
+     */
+    public function addTagOpen($tag, $pos = -1) {
+        return $this->addElement(new TagOpenElement($tag), $pos);
+    }
+
+    /**
+     * Add a closing HTML tag to the form
+     *
+     * Be sure it had been opened before
+     *
+     * @param string $tag
+     * @param int $pos
+     * @return TagCloseElement
+     */
+    public function addTagClose($tag, $pos = -1) {
+        return $this->addElement(new TagCloseElement($tag), $pos);
+    }
+
+    /**
+     * Open a Fieldset
+     *
+     * @param string $legend
+     * @param int $pos
+     * @return FieldsetOpenElement
+     */
+    public function addFieldsetOpen($legend = '', $pos = -1) {
+        return $this->addElement(new FieldsetOpenElement($legend), $pos);
+    }
+
+    /**
+     * Close a fieldset
+     *
+     * @param int $pos
+     * @return TagCloseElement
+     */
+    public function addFieldsetClose($pos = -1) {
+        return $this->addElement(new FieldsetCloseElement(), $pos);
+    }
+
+    #endregion
+
+    /**
+     * Adjust the elements so that fieldset open and closes are matching
+     */
+    protected function balanceFieldsets() {
+        $lastclose = 0;
+        $isopen = false;
+        $len = count($this->elements);
+
+        for($pos = 0; $pos < $len; $pos++) {
+            $type = $this->elements[$pos]->getType();
+            if($type == 'fieldsetopen') {
+                if($isopen) {
+                    //close previous fieldset
+                    $this->addFieldsetClose($pos);
+                    $lastclose = $pos + 1;
+                    $pos++;
+                    $len++;
+                }
+                $isopen = true;
+            } else if($type == 'fieldsetclose') {
+                if(!$isopen) {
+                    // make sure there was a fieldsetopen
+                    // either right after the last close or at the begining
+                    $this->addFieldsetOpen('', $lastclose);
+                    $len++;
+                    $pos++;
+                }
+                $lastclose = $pos;
+                $isopen = false;
+            }
+        }
+
+        // close open fieldset at the end
+        if($isopen) {
+            $this->addFieldsetClose();
+        }
+    }
+
+    /**
+     * The HTML representation of the whole form
+     *
+     * @return string
+     */
+    public function toHTML() {
+        $this->balanceFieldsets();
+
+        $html = '<form ' . buildAttributes($this->attrs()) . '>';
+
+        foreach($this->hidden as $name => $value) {
+            $html .= '<input type="hidden" name="' . $name . '" value="' . formText($value) . '" />';
+        }
+
+        foreach($this->elements as $element) {
+            $html .= $element->toHTML();
+        }
+
+        $html .= '</form>';
+
+        return $html;
+    }
+}
diff --git a/wiki/inc/Form/HTMLElement.php b/wiki/inc/Form/HTMLElement.php
new file mode 100644
index 0000000..591cf47
--- /dev/null
+++ b/wiki/inc/Form/HTMLElement.php
@@ -0,0 +1,29 @@
+<?php
+namespace dokuwiki\Form;
+
+/**
+ * Class HTMLElement
+ *
+ * Holds arbitrary HTML that is added as is to the Form
+ *
+ * @package dokuwiki\Form
+ */
+class HTMLElement extends ValueElement {
+
+
+    /**
+     * @param string $html
+     */
+    public function __construct($html) {
+        parent::__construct('html', $html);
+    }
+
+    /**
+     * The HTML representation of this element
+     *
+     * @return string
+     */
+    public function toHTML() {
+        return $this->val();
+    }
+}
diff --git a/wiki/inc/Form/InputElement.php b/wiki/inc/Form/InputElement.php
new file mode 100644
index 0000000..0242b61
--- /dev/null
+++ b/wiki/inc/Form/InputElement.php
@@ -0,0 +1,159 @@
+<?php
+namespace dokuwiki\Form;
+
+/**
+ * Class InputElement
+ *
+ * Base class for all input elements. Uses a wrapping label when label
+ * text is given.
+ *
+ * @todo figure out how to make wrapping or related label configurable
+ * @package dokuwiki\Form
+ */
+class InputElement extends Element {
+    /**
+     * @var LabelElement
+     */
+    protected $label = null;
+
+    /**
+     * @var bool if the element should reflect posted values
+     */
+    protected $useInput = true;
+
+    /**
+     * @param string $type The type of this element
+     * @param string $name The name of this form element
+     * @param string $label The label text for this element (will be autoescaped)
+     */
+    public function __construct($type, $name, $label = '') {
+        parent::__construct($type, array('name' => $name));
+        $this->attr('name', $name);
+        $this->attr('type', $type);
+        if($label) $this->label = new LabelElement($label);
+    }
+
+    /**
+     * Returns the label element if there's one set
+     *
+     * @return LabelElement|null
+     */
+    public function getLabel() {
+        return $this->label;
+    }
+
+    /**
+     * Should the user sent input be used to initialize the input field
+     *
+     * The default is true. Any set values will be overwritten by the INPUT
+     * provided values.
+     *
+     * @param bool $useinput
+     * @return $this
+     */
+    public function useInput($useinput) {
+        $this->useInput = (bool) $useinput;
+        return $this;
+    }
+
+    /**
+     * Get or set the element's ID
+     *
+     * @param null|string $id
+     * @return string|$this
+     */
+    public function id($id = null) {
+        if($this->label) $this->label->attr('for', $id);
+        return parent::id($id);
+    }
+
+    /**
+     * Adds a class to the class attribute
+     *
+     * This is the preferred method of setting the element's class
+     *
+     * @param string $class the new class to add
+     * @return $this
+     */
+    public function addClass($class) {
+        if($this->label) $this->label->addClass($class);
+        return parent::addClass($class);
+    }
+
+    /**
+     * Figures out how to access the value for this field from INPUT data
+     *
+     * The element's name could have been given as a simple string ('foo')
+     * or in array notation ('foo[bar]').
+     *
+     * Note: this function only handles one level of arrays. If your data
+     * is nested deeper, you should call useInput(false) and set the
+     * correct value yourself
+     *
+     * @return array name and array key (null if not an array)
+     */
+    protected function getInputName() {
+        $name = $this->attr('name');
+        parse_str("$name=1", $parsed);
+
+        $name = array_keys($parsed);
+        $name = array_shift($name);
+
+        if(is_array($parsed[$name])) {
+            $key = array_keys($parsed[$name]);
+            $key = array_shift($key);
+        } else {
+            $key = null;
+        }
+
+        return array($name, $key);
+    }
+
+    /**
+     * Handles the useInput flag and set the value attribute accordingly
+     */
+    protected function prefillInput() {
+        global $INPUT;
+
+        list($name, $key) = $this->getInputName();
+        if(!$INPUT->has($name)) return;
+
+        if($key === null) {
+            $value = $INPUT->str($name);
+        } else {
+            $value = $INPUT->arr($name);
+            if(isset($value[$key])) {
+                $value = $value[$key];
+            } else {
+                $value = '';
+            }
+        }
+        $this->val($value);
+    }
+
+    /**
+     * The HTML representation of this element
+     *
+     * @return string
+     */
+    protected function mainElementHTML() {
+        if($this->useInput) $this->prefillInput();
+        return '<input ' . buildAttributes($this->attrs()) . ' />';
+    }
+
+    /**
+     * The HTML representation of this element wrapped in a label
+     *
+     * @return string
+     */
+    public function toHTML() {
+        if($this->label) {
+            return '<label ' . buildAttributes($this->label->attrs()) . '>' . DOKU_LF .
+            '<span>' . hsc($this->label->val()) . '</span>' . DOKU_LF .
+            $this->mainElementHTML() . DOKU_LF .
+            '</label>';
+        } else {
+            return $this->mainElementHTML();
+        }
+    }
+}
diff --git a/wiki/inc/Form/LabelElement.php b/wiki/inc/Form/LabelElement.php
new file mode 100644
index 0000000..9c8d542
--- /dev/null
+++ b/wiki/inc/Form/LabelElement.php
@@ -0,0 +1,27 @@
+<?php
+namespace dokuwiki\Form;
+
+/**
+ * Class Label
+ * @package dokuwiki\Form
+ */
+class LabelElement extends ValueElement {
+
+    /**
+     * Creates a new Label
+     *
+     * @param string $label This is is raw HTML and will not be escaped
+     */
+    public function __construct($label) {
+        parent::__construct('label', $label);
+    }
+
+    /**
+     * The HTML representation of this element
+     *
+     * @return string
+     */
+    public function toHTML() {
+        return '<label ' . buildAttributes($this->attrs()) . '>' . $this->val() . '</label>';
+    }
+}
diff --git a/wiki/inc/Form/LegacyForm.php b/wiki/inc/Form/LegacyForm.php
new file mode 100644
index 0000000..1b47ba2
--- /dev/null
+++ b/wiki/inc/Form/LegacyForm.php
@@ -0,0 +1,181 @@
+<?php
+namespace dokuwiki\Form;
+
+/**
+ * Class LegacyForm
+ *
+ * Provides a compatibility layer to the old Doku_Form API
+ *
+ * This can be used to work with the modern API on forms provided by old events for
+ * example. When you start new forms, just use Form\Form
+ *
+ * @package dokuwiki\Form
+ */
+class LegacyForm extends Form {
+
+    /**
+     * Creates a new modern form from an old legacy Doku_Form
+     *
+     * @param \Doku_Form $oldform
+     */
+    public function __construct(\Doku_Form $oldform) {
+        parent::__construct($oldform->params);
+
+        $this->hidden = $oldform->_hidden;
+
+        foreach($oldform->_content as $element) {
+            list($ctl, $attr) = $this->parseLegacyAttr($element);
+
+            if(is_array($element)) {
+                switch($ctl['elem']) {
+                    case 'wikitext':
+                        $this->addTextarea('wikitext')
+                             ->attrs($attr)
+                             ->id('wiki__text')
+                             ->val($ctl['text'])
+                             ->addClass($ctl['class']);
+                        break;
+                    case 'textfield':
+                        $this->addTextInput($ctl['name'], $ctl['text'])
+                             ->attrs($attr)
+                             ->id($ctl['id'])
+                             ->addClass($ctl['class']);
+                        break;
+                    case 'passwordfield':
+                        $this->addPasswordInput($ctl['name'], $ctl['text'])
+                             ->attrs($attr)
+                             ->id($ctl['id'])
+                             ->addClass($ctl['class']);
+                        break;
+                    case 'checkboxfield':
+                        $this->addCheckbox($ctl['name'], $ctl['text'])
+                             ->attrs($attr)
+                             ->id($ctl['id'])
+                             ->addClass($ctl['class']);
+                        break;
+                    case 'radiofield':
+                        $this->addRadioButton($ctl['name'], $ctl['text'])
+                             ->attrs($attr)
+                             ->id($ctl['id'])
+                             ->addClass($ctl['class']);
+                        break;
+                    case 'tag':
+                        $this->addTag($ctl['tag'])
+                             ->attrs($attr)
+                             ->attr('name', $ctl['name'])
+                             ->id($ctl['id'])
+                             ->addClass($ctl['class']);
+                        break;
+                    case 'opentag':
+                        $this->addTagOpen($ctl['tag'])
+                             ->attrs($attr)
+                             ->attr('name', $ctl['name'])
+                             ->id($ctl['id'])
+                             ->addClass($ctl['class']);
+                        break;
+                    case 'closetag':
+                        $this->addTagClose($ctl['tag']);
+                        break;
+                    case 'openfieldset':
+                        $this->addFieldsetOpen($ctl['legend'])
+                            ->attrs($attr)
+                            ->attr('name', $ctl['name'])
+                            ->id($ctl['id'])
+                            ->addClass($ctl['class']);
+                        break;
+                    case 'closefieldset':
+                        $this->addFieldsetClose();
+                        break;
+                    case 'button':
+                    case 'field':
+                    case 'fieldright':
+                    case 'filefield':
+                    case 'menufield':
+                    case 'listboxfield':
+                        throw new \UnexpectedValueException('Unsupported legacy field ' . $ctl['elem']);
+                        break;
+                    default:
+                        throw new \UnexpectedValueException('Unknown legacy field ' . $ctl['elem']);
+
+                }
+            } else {
+                $this->addHTML($element);
+            }
+        }
+
+    }
+
+    /**
+     * Parses out what is the elements attributes and what is control info
+     *
+     * @param array $legacy
+     * @return array
+     */
+    protected function parseLegacyAttr($legacy) {
+        $attributes = array();
+        $control = array();
+
+        foreach($legacy as $key => $val) {
+            if($key{0} == '_') {
+                $control[substr($key, 1)] = $val;
+            } elseif($key == 'name') {
+                $control[$key] = $val;
+            } elseif($key == 'id') {
+                $control[$key] = $val;
+            } else {
+                $attributes[$key] = $val;
+            }
+        }
+
+        return array($control, $attributes);
+    }
+
+    /**
+     * Translates our types to the legacy types
+     *
+     * @param string $type
+     * @return string
+     */
+    protected function legacyType($type) {
+        static $types = array(
+            'text' => 'textfield',
+            'password' => 'passwordfield',
+            'checkbox' => 'checkboxfield',
+            'radio' => 'radiofield',
+            'tagopen' => 'opentag',
+            'tagclose' => 'closetag',
+            'fieldsetopen' => 'openfieldset',
+            'fieldsetclose' => 'closefieldset',
+        );
+        if(isset($types[$type])) return $types[$type];
+        return $type;
+    }
+
+    /**
+     * Creates an old legacy form from this modern form's data
+     *
+     * @return \Doku_Form
+     */
+    public function toLegacy() {
+        $this->balanceFieldsets();
+
+        $legacy = new \Doku_Form($this->attrs());
+        $legacy->_hidden = $this->hidden;
+        foreach($this->elements as $element) {
+            if(is_a($element, 'dokuwiki\Form\HTMLElement')) {
+                $legacy->_content[] = $element->toHTML();
+            } elseif(is_a($element, 'dokuwiki\Form\InputElement')) {
+                /** @var InputElement $element */
+                $data = $element->attrs();
+                $data['_elem'] = $this->legacyType($element->getType());
+                $label = $element->getLabel();
+                if($label) {
+                    $data['_class'] = $label->attr('class');
+                }
+                $legacy->_content[] = $data;
+            }
+        }
+
+        return $legacy;
+    }
+}
diff --git a/wiki/inc/Form/OptGroup.php b/wiki/inc/Form/OptGroup.php
new file mode 100644
index 0000000..791f0b3
--- /dev/null
+++ b/wiki/inc/Form/OptGroup.php
@@ -0,0 +1,100 @@
+<?php
+
+namespace dokuwiki\Form;
+
+
+class OptGroup extends Element {
+    protected $options = array();
+    protected $value;
+
+    /**
+     * @param string $label The label text for this element (will be autoescaped)
+     * @param array  $options The available options
+     */
+    public function __construct($label, $options) {
+        parent::__construct('optGroup', array('label' => $label));
+        $this->options($options);
+    }
+
+    /**
+     * Store the given value so it can be used during rendering
+     *
+     * This is intended to be only called from within @see DropdownElement::val()
+     *
+     * @param string $value
+     * @return bool true if an option with the given value exists, false otherwise
+     */
+    public function storeValue($value) {
+        $this->value = $value;
+        return isset($this->options[$value]);
+    }
+
+    /**
+     * Get or set the options of the optgroup
+     *
+     * Options can be given as associative array (value => label) or as an
+     * indexd array (label = value) or as an array of arrays. In the latter
+     * case an element has to look as follows:
+     * option-value => array (
+     *                 'label' => option-label,
+     *                 'attrs' => array (
+     *                                    attr-key => attr-value, ...
+     *                                  )
+     *                 )
+     *
+     * @param null|array $options
+     * @return $this|array
+     */
+    public function options($options = null) {
+        if($options === null) return $this->options;
+        if(!is_array($options)) throw new \InvalidArgumentException('Options have to be an array');
+        $this->options = array();
+        foreach($options as $key => $val) {
+            if (is_array($val)) {
+                if (!key_exists('label', $val)) throw new \InvalidArgumentException('If option is given as array, it has to have a "label"-key!');
+                if (key_exists('attrs', $val) && is_array($val['attrs']) && key_exists('selected', $val['attrs'])) {
+                    throw new \InvalidArgumentException('Please use function "DropdownElement::val()" to set the selected option');
+                }
+                $this->options[$key] = $val;
+            } elseif(is_int($key)) {
+                $this->options[$val] = array('label' => (string) $val);
+            } else {
+                $this->options[$key] = array('label' => (string) $val);
+            }
+        }
+        return $this;
+    }
+
+
+    /**
+     * The HTML representation of this element
+     *
+     * @return string
+     */
+    public function toHTML() {
+        if ($this->attributes['label'] === null) {
+            return $this->renderOptions();
+        }
+        $html = '<optgroup '. buildAttributes($this->attrs()) . '>';
+        $html .= $this->renderOptions();
+        $html .= '</optgroup>';
+        return $html;
+    }
+
+
+    /**
+     * @return string
+     */
+    protected function renderOptions() {
+        $html = '';
+        foreach($this->options as $key => $val) {
+            $selected = ((string)$key === (string)$this->value) ? ' selected="selected"' : '';
+            $attrs = '';
+            if (!empty($val['attrs']) && is_array($val['attrs'])) {
+                $attrs = buildAttributes($val['attrs']);
+            }
+            $html .= '<option' . $selected . ' value="' . hsc($key) . '" '.$attrs.'>' . hsc($val['label']) . '</option>';
+        }
+        return $html;
+    }
+}
diff --git a/wiki/inc/Form/TagCloseElement.php b/wiki/inc/Form/TagCloseElement.php
new file mode 100644
index 0000000..b6bf753
--- /dev/null
+++ b/wiki/inc/Form/TagCloseElement.php
@@ -0,0 +1,88 @@
+<?php
+namespace dokuwiki\Form;
+
+/**
+ * Class TagCloseElement
+ *
+ * Creates an HTML close tag. You have to make sure it has been opened
+ * before or this will produce invalid HTML
+ *
+ * @package dokuwiki\Form
+ */
+class TagCloseElement extends ValueElement {
+
+    /**
+     * @param string $tag
+     * @param array $attributes
+     */
+    public function __construct($tag, $attributes = array()) {
+        parent::__construct('tagclose', $tag, $attributes);
+    }
+
+    /**
+     * do not call this
+     *
+     * @param string $class
+     * @return void
+     * @throws \BadMethodCallException
+     */
+    public function addClass($class) {
+        throw new \BadMethodCallException('You can\t add classes to closing tag');
+    }
+
+    /**
+     * do not call this
+     *
+     * @param null|string $id
+     * @return string
+     * @throws \BadMethodCallException
+     */
+    public function id($id = null) {
+        if ($id === null) {
+            return '';
+        } else {
+            throw new \BadMethodCallException('You can\t add ID to closing tag');
+        }
+    }
+
+    /**
+     * do not call this
+     *
+     * @param string $name
+     * @param null|string $value
+     * @return string
+     * @throws \BadMethodCallException
+     */
+    public function attr($name, $value = null) {
+        if ($value === null) {
+            return '';
+        } else {
+            throw new \BadMethodCallException('You can\t add attributes to closing tag');
+        }
+    }
+
+    /**
+     * do not call this
+     *
+     * @param array|null $attributes
+     * @return array
+     * @throws \BadMethodCallException
+     */
+    public function attrs($attributes = null) {
+        if ($attributes === null) {
+            return array();
+        } else {
+            throw new \BadMethodCallException('You can\t add attributes to closing tag');
+        }
+    }
+
+    /**
+     * The HTML representation of this element
+     *
+     * @return string
+     */
+    public function toHTML() {
+        return '</'.$this->val().'>';
+    }
+
+}
diff --git a/wiki/inc/Form/TagElement.php b/wiki/inc/Form/TagElement.php
new file mode 100644
index 0000000..ea5144c
--- /dev/null
+++ b/wiki/inc/Form/TagElement.php
@@ -0,0 +1,29 @@
+<?php
+namespace dokuwiki\Form;
+
+/**
+ * Class TagElement
+ *
+ * Creates a self closing HTML tag
+ *
+ * @package dokuwiki\Form
+ */
+class TagElement extends ValueElement {
+
+    /**
+     * @param string $tag
+     * @param array $attributes
+     */
+    public function __construct($tag, $attributes = array()) {
+        parent::__construct('tag', $tag, $attributes);
+    }
+
+    /**
+     * The HTML representation of this element
+     *
+     * @return string
+     */
+    public function toHTML() {
+        return '<'.$this->val().' '.buildAttributes($this->attrs()).' />';
+    }
+}
diff --git a/wiki/inc/Form/TagOpenElement.php b/wiki/inc/Form/TagOpenElement.php
new file mode 100644
index 0000000..0afe97b
--- /dev/null
+++ b/wiki/inc/Form/TagOpenElement.php
@@ -0,0 +1,30 @@
+<?php
+namespace dokuwiki\Form;
+
+/**
+ * Class TagOpenElement
+ *
+ * Creates an open HTML tag. You have to make sure you close it
+ * again or this will produce invalid HTML
+ *
+ * @package dokuwiki\Form
+ */
+class TagOpenElement extends ValueElement {
+
+    /**
+     * @param string $tag
+     * @param array $attributes
+     */
+    public function __construct($tag, $attributes = array()) {
+        parent::__construct('tagopen', $tag, $attributes);
+    }
+
+    /**
+     * The HTML representation of this element
+     *
+     * @return string
+     */
+    public function toHTML() {
+        return '<'.$this->val().' '.buildAttributes($this->attrs()).'>';
+    }
+}
diff --git a/wiki/inc/Form/TextareaElement.php b/wiki/inc/Form/TextareaElement.php
new file mode 100644
index 0000000..92741ee
--- /dev/null
+++ b/wiki/inc/Form/TextareaElement.php
@@ -0,0 +1,51 @@
+<?php
+namespace dokuwiki\Form;
+
+/**
+ * Class TextareaElement
+ * @package dokuwiki\Form
+ */
+class TextareaElement extends InputElement {
+
+    /**
+     * @var string the actual text within the area
+     */
+    protected $text;
+
+    /**
+     * @param string $name The name of this form element
+     * @param string $label The label text for this element
+     */
+    public function __construct($name, $label) {
+        parent::__construct('textarea', $name, $label);
+        $this->attr('dir', 'auto');
+    }
+
+    /**
+     * Get or set the element's value
+     *
+     * This is the preferred way of setting the element's value
+     *
+     * @param null|string $value
+     * @return string|$this
+     */
+    public function val($value = null) {
+        if($value !== null) {
+            $this->text = cleanText($value);
+            return $this;
+        }
+        return $this->text;
+    }
+
+    /**
+     * The HTML representation of this element
+     *
+     * @return string
+     */
+    protected function mainElementHTML() {
+        if($this->useInput) $this->prefillInput();
+        return '<textarea ' . buildAttributes($this->attrs()) . '>' .
+        formText($this->val()) . '</textarea>';
+    }
+
+}
diff --git a/wiki/inc/Form/ValueElement.php b/wiki/inc/Form/ValueElement.php
new file mode 100644
index 0000000..88db167
--- /dev/null
+++ b/wiki/inc/Form/ValueElement.php
@@ -0,0 +1,45 @@
+<?php
+
+namespace dokuwiki\Form;
+
+/**
+ * Class ValueElement
+ *
+ * Just like an Element but it's value is not part of its attributes
+ *
+ * What the value is (tag name, content, etc) is defined by the actual implementations
+ *
+ * @package dokuwiki\Form
+ */
+abstract class ValueElement extends Element {
+
+    /**
+     * @var string holds the element's value
+     */
+    protected $value = '';
+
+    /**
+     * @param string $type
+     * @param string $value
+     * @param array $attributes
+     */
+    public function __construct($type, $value, $attributes = array()) {
+        parent::__construct($type, $attributes);
+        $this->val($value);
+    }
+
+    /**
+     * Get or set the element's value
+     *
+     * @param null|string $value
+     * @return string|$this
+     */
+    public function val($value = null) {
+        if($value !== null) {
+            $this->value = $value;
+            return $this;
+        }
+        return $this->value;
+    }
+
+}
diff --git a/wiki/inc/HTTPClient.php b/wiki/inc/HTTPClient.php
new file mode 100644
index 0000000..e20b7d9
--- /dev/null
+++ b/wiki/inc/HTTPClient.php
@@ -0,0 +1,943 @@
+<?php
+/**
+ * HTTP Client
+ *
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author     Andreas Goetz <cpuidle@gmx.de>
+ */
+
+
+define('HTTP_NL',"\r\n");
+
+/**
+ * Class HTTPClientException
+ */
+class HTTPClientException extends Exception { }
+
+/**
+ * This class implements a basic HTTP client
+ *
+ * It supports POST and GET, Proxy usage, basic authentication,
+ * handles cookies and referers. It is based upon the httpclient
+ * function from the VideoDB project.
+ *
+ * @link   http://www.splitbrain.org/go/videodb
+ * @author Andreas Goetz <cpuidle@gmx.de>
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @author Tobias Sarnowski <sarnowski@new-thoughts.org>
+ */
+class HTTPClient {
+    //set these if you like
+    var $agent;         // User agent
+    var $http;          // HTTP version defaults to 1.0
+    var $timeout;       // read timeout (seconds)
+    var $cookies;
+    var $referer;
+    var $max_redirect;
+    var $max_bodysize;
+    var $max_bodysize_abort = true;  // if set, abort if the response body is bigger than max_bodysize
+    var $header_regexp; // if set this RE must match against the headers, else abort
+    var $headers;
+    var $debug;
+    var $start = 0.0; // for timings
+    var $keep_alive = true; // keep alive rocks
+
+    // don't set these, read on error
+    var $error;
+    var $redirect_count;
+
+    // read these after a successful request
+    var $status;
+    var $resp_body;
+    var $resp_headers;
+
+    // set these to do basic authentication
+    var $user;
+    var $pass;
+
+    // set these if you need to use a proxy
+    var $proxy_host;
+    var $proxy_port;
+    var $proxy_user;
+    var $proxy_pass;
+    var $proxy_ssl; //boolean set to true if your proxy needs SSL
+    var $proxy_except; // regexp of URLs to exclude from proxy
+
+    // list of kept alive connections
+    static $connections = array();
+
+    // what we use as boundary on multipart/form-data posts
+    var $boundary = '---DokuWikiHTTPClient--4523452351';
+
+    /**
+     * Constructor.
+     *
+     * @author Andreas Gohr <andi@splitbrain.org>
+     */
+    function __construct(){
+        $this->agent        = 'Mozilla/4.0 (compatible; DokuWiki HTTP Client; '.PHP_OS.')';
+        $this->timeout      = 15;
+        $this->cookies      = array();
+        $this->referer      = '';
+        $this->max_redirect = 3;
+        $this->redirect_count = 0;
+        $this->status       = 0;
+        $this->headers      = array();
+        $this->http         = '1.0';
+        $this->debug        = false;
+        $this->max_bodysize = 0;
+        $this->header_regexp= '';
+        if(extension_loaded('zlib')) $this->headers['Accept-encoding'] = 'gzip';
+        $this->headers['Accept'] = 'text/xml,application/xml,application/xhtml+xml,'.
+                                   'text/html,text/plain,image/png,image/jpeg,image/gif,*/*';
+        $this->headers['Accept-Language'] = 'en-us';
+    }
+
+
+    /**
+     * Simple function to do a GET request
+     *
+     * Returns the wanted page or false on an error;
+     *
+     * @param  string $url       The URL to fetch
+     * @param  bool   $sloppy304 Return body on 304 not modified
+     * @return false|string  response body, false on error
+     *
+     * @author Andreas Gohr <andi@splitbrain.org>
+     */
+    function get($url,$sloppy304=false){
+        if(!$this->sendRequest($url)) return false;
+        if($this->status == 304 && $sloppy304) return $this->resp_body;
+        if($this->status < 200 || $this->status > 206) return false;
+        return $this->resp_body;
+    }
+
+    /**
+     * Simple function to do a GET request with given parameters
+     *
+     * Returns the wanted page or false on an error.
+     *
+     * This is a convenience wrapper around get(). The given parameters
+     * will be correctly encoded and added to the given base URL.
+     *
+     * @param  string $url       The URL to fetch
+     * @param  array  $data      Associative array of parameters
+     * @param  bool   $sloppy304 Return body on 304 not modified
+     * @return false|string  response body, false on error
+     *
+     * @author Andreas Gohr <andi@splitbrain.org>
+     */
+    function dget($url,$data,$sloppy304=false){
+        if(strpos($url,'?')){
+            $url .= '&';
+        }else{
+            $url .= '?';
+        }
+        $url .= $this->_postEncode($data);
+        return $this->get($url,$sloppy304);
+    }
+
+    /**
+     * Simple function to do a POST request
+     *
+     * Returns the resulting page or false on an error;
+     *
+     * @param  string $url       The URL to fetch
+     * @param  array  $data      Associative array of parameters
+     * @return false|string  response body, false on error
+     * @author Andreas Gohr <andi@splitbrain.org>
+     */
+    function post($url,$data){
+        if(!$this->sendRequest($url,$data,'POST')) return false;
+        if($this->status < 200 || $this->status > 206) return false;
+        return $this->resp_body;
+    }
+
+    /**
+     * Send an HTTP request
+     *
+     * This method handles the whole HTTP communication. It respects set proxy settings,
+     * builds the request headers, follows redirects and parses the response.
+     *
+     * Post data should be passed as associative array. When passed as string it will be
+     * sent as is. You will need to setup your own Content-Type header then.
+     *
+     * @param  string $url    - the complete URL
+     * @param  mixed  $data   - the post data either as array or raw data
+     * @param  string $method - HTTP Method usually GET or POST.
+     * @return bool - true on success
+     *
+     * @author Andreas Goetz <cpuidle@gmx.de>
+     * @author Andreas Gohr <andi@splitbrain.org>
+     */
+    function sendRequest($url,$data='',$method='GET'){
+        $this->start  = $this->_time();
+        $this->error  = '';
+        $this->status = 0;
+        $this->status = 0;
+        $this->resp_body = '';
+        $this->resp_headers = array();
+
+        // don't accept gzip if truncated bodies might occur
+        if($this->max_bodysize &&
+           !$this->max_bodysize_abort &&
+           $this->headers['Accept-encoding'] == 'gzip'){
+            unset($this->headers['Accept-encoding']);
+        }
+
+        // parse URL into bits
+        $uri = parse_url($url);
+        $server = $uri['host'];
+        $path   = $uri['path'];
+        if(empty($path)) $path = '/';
+        if(!empty($uri['query'])) $path .= '?'.$uri['query'];
+        if(!empty($uri['port'])) $port = $uri['port'];
+        if(isset($uri['user'])) $this->user = $uri['user'];
+        if(isset($uri['pass'])) $this->pass = $uri['pass'];
+
+        // proxy setup
+        if($this->proxy_host && (!$this->proxy_except || !preg_match('/'.$this->proxy_except.'/i',$url)) ){
+            $request_url = $url;
+            $server      = $this->proxy_host;
+            $port        = $this->proxy_port;
+            if (empty($port)) $port = 8080;
+            $use_tls     = $this->proxy_ssl;
+        }else{
+            $request_url = $path;
+            if (!isset($port)) $port = ($uri['scheme'] == 'https') ? 443 : 80;
+            $use_tls     = ($uri['scheme'] == 'https');
+        }
+
+        // add SSL stream prefix if needed - needs SSL support in PHP
+        if($use_tls) {
+            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;
+        $headers['Host']       = $uri['host'];
+        if(!empty($uri['port'])) $headers['Host'].= ':'.$uri['port'];
+        $headers['User-Agent'] = $this->agent;
+        $headers['Referer']    = $this->referer;
+
+        if($method == 'POST'){
+            if(is_array($data)){
+                if (empty($headers['Content-Type'])) {
+                    $headers['Content-Type'] = null;
+                }
+                switch ($headers['Content-Type']) {
+                case 'multipart/form-data':
+                    $headers['Content-Type']   = 'multipart/form-data; boundary=' . $this->boundary;
+                    $data = $this->_postMultipartEncode($data);
+                    break;
+                default:
+                    $headers['Content-Type']   = 'application/x-www-form-urlencoded';
+                    $data = $this->_postEncode($data);
+                }
+            }
+        }elseif($method == 'GET'){
+            $data = ''; //no data allowed on GET requests
+        }
+
+        $contentlength = strlen($data);
+        if($contentlength)  {
+            $headers['Content-Length'] = $contentlength;
+        }
+
+        if($this->user) {
+            $headers['Authorization'] = 'Basic '.base64_encode($this->user.':'.$this->pass);
+        }
+        if($this->proxy_user) {
+            $headers['Proxy-Authorization'] = 'Basic '.base64_encode($this->proxy_user.':'.$this->proxy_pass);
+        }
+
+        // already connected?
+        $connectionId = $this->_uniqueConnectionId($server,$port);
+        $this->_debug('connection pool', self::$connections);
+        $socket = null;
+        if (isset(self::$connections[$connectionId])) {
+            $this->_debug('reusing connection', $connectionId);
+            $socket = self::$connections[$connectionId];
+        }
+        if (is_null($socket) || feof($socket)) {
+            $this->_debug('opening connection', $connectionId);
+            // open socket
+            $socket = @fsockopen($server,$port,$errno, $errstr, $this->timeout);
+            if (!$socket){
+                $this->status = -100;
+                $this->error = "Could not connect to $server:$port\n$errstr ($errno)";
+                return false;
+            }
+
+            // try establish a CONNECT tunnel for SSL
+            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?
+            if ($this->keep_alive) {
+                self::$connections[$connectionId] = $socket;
+            } else {
+                unset(self::$connections[$connectionId]);
+            }
+        }
+
+        if ($this->keep_alive && !$this->proxy_host) {
+            // RFC 2068, section 19.7.1: A client MUST NOT send the Keep-Alive
+            // connection token to a proxy server. We still do keep the connection the
+            // proxy alive (well except for CONNECT tunnels)
+            $headers['Connection'] = 'Keep-Alive';
+        } else {
+            $headers['Connection'] = 'Close';
+        }
+
+        try {
+            //set non-blocking
+            stream_set_blocking($socket, 0);
+
+            // build request
+            $request  = "$method $request_url HTTP/".$this->http.HTTP_NL;
+            $request .= $this->_buildHeaders($headers);
+            $request .= $this->_getCookies();
+            $request .= HTTP_NL;
+            $request .= $data;
+
+            $this->_debug('request',$request);
+            $this->_sendData($socket, $request, 'request');
+
+            // read headers from socket
+            $r_headers = '';
+            do{
+                $r_line = $this->_readLine($socket, 'headers');
+                $r_headers .= $r_line;
+            }while($r_line != "\r\n" && $r_line != "\n");
+
+            $this->_debug('response headers',$r_headers);
+
+            // check if expected body size exceeds allowance
+            if($this->max_bodysize && preg_match('/\r?\nContent-Length:\s*(\d+)\r?\n/i',$r_headers,$match)){
+                if($match[1] > $this->max_bodysize){
+                    if ($this->max_bodysize_abort)
+                        throw new HTTPClientException('Reported content length exceeds allowed response size');
+                    else
+                        $this->error = 'Reported content length exceeds allowed response size';
+                }
+            }
+
+            // get Status
+            if (!preg_match('/^HTTP\/(\d\.\d)\s*(\d+).*?\n/', $r_headers, $m))
+                throw new HTTPClientException('Server returned bad answer '.$r_headers);
+
+            $this->status = $m[2];
+
+            // handle headers and cookies
+            $this->resp_headers = $this->_parseHeaders($r_headers);
+            if(isset($this->resp_headers['set-cookie'])){
+                foreach ((array) $this->resp_headers['set-cookie'] as $cookie){
+                    list($cookie)   = explode(';',$cookie,2);
+                    list($key,$val) = explode('=',$cookie,2);
+                    $key = trim($key);
+                    if($val == 'deleted'){
+                        if(isset($this->cookies[$key])){
+                            unset($this->cookies[$key]);
+                        }
+                    }elseif($key){
+                        $this->cookies[$key] = $val;
+                    }
+                }
+            }
+
+            $this->_debug('Object headers',$this->resp_headers);
+
+            // check server status code to follow redirect
+            if($this->status == 301 || $this->status == 302 ){
+                if (empty($this->resp_headers['location'])){
+                    throw new HTTPClientException('Redirect but no Location Header found');
+                }elseif($this->redirect_count == $this->max_redirect){
+                    throw new HTTPClientException('Maximum number of redirects exceeded');
+                }else{
+                    // close the connection because we don't handle content retrieval here
+                    // that's the easiest way to clean up the connection
+                    fclose($socket);
+                    unset(self::$connections[$connectionId]);
+
+                    $this->redirect_count++;
+                    $this->referer = $url;
+                    // handle non-RFC-compliant relative redirects
+                    if (!preg_match('/^http/i', $this->resp_headers['location'])){
+                        if($this->resp_headers['location'][0] != '/'){
+                            $this->resp_headers['location'] = $uri['scheme'].'://'.$uri['host'].':'.$uri['port'].
+                                                            dirname($uri['path']).'/'.$this->resp_headers['location'];
+                        }else{
+                            $this->resp_headers['location'] = $uri['scheme'].'://'.$uri['host'].':'.$uri['port'].
+                                                            $this->resp_headers['location'];
+                        }
+                    }
+                    // perform redirected request, always via GET (required by RFC)
+                    return $this->sendRequest($this->resp_headers['location'],array(),'GET');
+                }
+            }
+
+            // check if headers are as expected
+            if($this->header_regexp && !preg_match($this->header_regexp,$r_headers))
+                throw new HTTPClientException('The received headers did not match the given regexp');
+
+            //read body (with chunked encoding if needed)
+            $r_body    = '';
+            if((isset($this->resp_headers['transfer-encoding']) && $this->resp_headers['transfer-encoding'] == 'chunked')
+            || (isset($this->resp_headers['transfer-coding']) && $this->resp_headers['transfer-coding'] == 'chunked')){
+                $abort = false;
+                do {
+                    $chunk_size = '';
+                    while (preg_match('/^[a-zA-Z0-9]?$/',$byte=$this->_readData($socket,1,'chunk'))){
+                        // read chunksize until \r
+                        $chunk_size .= $byte;
+                        if (strlen($chunk_size) > 128) // set an abritrary limit on the size of chunks
+                            throw new HTTPClientException('Allowed response size exceeded');
+                    }
+                    $this->_readLine($socket, 'chunk');     // readtrailing \n
+                    $chunk_size = hexdec($chunk_size);
+
+                    if($this->max_bodysize && $chunk_size+strlen($r_body) > $this->max_bodysize){
+                        if ($this->max_bodysize_abort)
+                            throw new HTTPClientException('Allowed response size exceeded');
+                        $this->error = 'Allowed response size exceeded';
+                        $chunk_size = $this->max_bodysize - strlen($r_body);
+                        $abort = true;
+                    }
+
+                    if ($chunk_size > 0) {
+                        $r_body .= $this->_readData($socket, $chunk_size, 'chunk');
+                        $this->_readData($socket, 2, 'chunk'); // read trailing \r\n
+                    }
+                } while ($chunk_size && !$abort);
+            }elseif(isset($this->resp_headers['content-length']) && !isset($this->resp_headers['transfer-encoding'])){
+                /* RFC 2616
+                 * If a message is received with both a Transfer-Encoding header field and a Content-Length
+                 * header field, the latter MUST be ignored.
+                 */
+
+                // read up to the content-length or max_bodysize
+                // for keep alive we need to read the whole message to clean up the socket for the next read
+                if(!$this->keep_alive && $this->max_bodysize && $this->max_bodysize < $this->resp_headers['content-length']){
+                    $length = $this->max_bodysize;
+                }else{
+                    $length = $this->resp_headers['content-length'];
+                }
+
+                $r_body = $this->_readData($socket, $length, 'response (content-length limited)', true);
+            }elseif( !isset($this->resp_headers['transfer-encoding']) && $this->max_bodysize && !$this->keep_alive){
+                $r_body = $this->_readData($socket, $this->max_bodysize, 'response (content-length limited)', true);
+            } elseif ((int)$this->status === 204) {
+                // request has no content
+            } else{
+                // read entire socket
+                while (!feof($socket)) {
+                    $r_body .= $this->_readData($socket, 4096, 'response (unlimited)', true);
+                }
+            }
+
+            // recheck body size, we might had to read the whole body, so we abort late or trim here
+            if($this->max_bodysize){
+                if(strlen($r_body) > $this->max_bodysize){
+                    if ($this->max_bodysize_abort) {
+                        throw new HTTPClientException('Allowed response size exceeded');
+                    } else {
+                        $this->error = 'Allowed response size exceeded';
+                    }
+                }
+            }
+
+        } catch (HTTPClientException $err) {
+            $this->error = $err->getMessage();
+            if ($err->getCode())
+                $this->status = $err->getCode();
+            unset(self::$connections[$connectionId]);
+            fclose($socket);
+            return false;
+        }
+
+        if (!$this->keep_alive ||
+                (isset($this->resp_headers['connection']) && $this->resp_headers['connection'] == 'Close')) {
+            // close socket
+            fclose($socket);
+            unset(self::$connections[$connectionId]);
+        }
+
+        // decode gzip if needed
+        if(isset($this->resp_headers['content-encoding']) &&
+           $this->resp_headers['content-encoding'] == 'gzip' &&
+           strlen($r_body) > 10 && substr($r_body,0,3)=="\x1f\x8b\x08"){
+            $this->resp_body = @gzinflate(substr($r_body, 10));
+            if($this->resp_body === false){
+                $this->error = 'Failed to decompress gzip encoded content';
+                $this->resp_body = $r_body;
+            }
+        }else{
+            $this->resp_body = $r_body;
+        }
+
+        $this->_debug('response body',$this->resp_body);
+        $this->redirect_count = 0;
+        return true;
+    }
+
+    /**
+     * Tries to establish a CONNECT tunnel via Proxy
+     *
+     * Protocol, Servername and Port will be stripped from the request URL when a successful CONNECT happened
+     *
+     * @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){
+        if(!$this->proxy_host) return false;
+        $requestinfo = parse_url($requesturl);
+        if($requestinfo['scheme'] != 'https') return false;
+        if(!$requestinfo['port']) $requestinfo['port'] = 443;
+
+        // build request
+        $request  = "CONNECT {$requestinfo['host']}:{$requestinfo['port']} HTTP/1.0".HTTP_NL;
+        $request .= "Host: {$requestinfo['host']}".HTTP_NL;
+        if($this->proxy_user) {
+            $request .= 'Proxy-Authorization: Basic '.base64_encode($this->proxy_user.':'.$this->proxy_pass).HTTP_NL;
+        }
+        $request .= HTTP_NL;
+
+        $this->_debug('SSL Tunnel CONNECT',$request);
+        $this->_sendData($socket, $request, 'SSL Tunnel CONNECT');
+
+        // read headers from socket
+        $r_headers = '';
+        do{
+            $r_line = $this->_readLine($socket, 'headers');
+            $r_headers .= $r_line;
+        }while($r_line != "\r\n" && $r_line != "\n");
+
+        $this->_debug('SSL Tunnel Response',$r_headers);
+        if(preg_match('/^HTTP\/1\.[01] 200/i',$r_headers)){
+            // set correct peer name for verification (enabled since PHP 5.6)
+            stream_context_set_option($socket, 'ssl', 'peer_name', $requestinfo['host']);
+
+            // SSLv3 is broken, use only TLS connections.
+            // @link https://bugs.php.net/69195
+            if (PHP_VERSION_ID >= 50600 && PHP_VERSION_ID <= 50606) {
+                $cryptoMethod = STREAM_CRYPTO_METHOD_TLS_CLIENT;
+            } else {
+                // actually means neither SSLv2 nor SSLv3
+                $cryptoMethod = STREAM_CRYPTO_METHOD_SSLv23_CLIENT;
+            }
+
+            if (@stream_socket_enable_crypto($socket, true, $cryptoMethod)) {
+                $requesturl = $requestinfo['path'].
+                  (!empty($requestinfo['query'])?'?'.$requestinfo['query']:'');
+                return true;
+            }
+
+            throw new HTTPClientException('Failed to set up crypto for secure connection to '.$requestinfo['host'], -151);
+        }
+
+        throw new HTTPClientException('Failed to establish secure proxy connection', -150);
+    }
+
+    /**
+     * Safely write data to a socket
+     *
+     * @param  resource $socket     An open socket handle
+     * @param  string   $data       The data to write
+     * @param  string   $message    Description of what is being read
+     * @throws HTTPClientException
+     *
+     * @author Tom N Harris <tnharris@whoopdedo.org>
+     */
+    function _sendData($socket, $data, $message) {
+        // send request
+        $towrite = strlen($data);
+        $written = 0;
+        while($written < $towrite){
+            // check timeout
+            $time_used = $this->_time() - $this->start;
+            if($time_used > $this->timeout)
+                throw new HTTPClientException(sprintf('Timeout while sending %s (%.3fs)',$message, $time_used), -100);
+            if(feof($socket))
+                throw new HTTPClientException("Socket disconnected while writing $message");
+
+            // select parameters
+            $sel_r = null;
+            $sel_w = array($socket);
+            $sel_e = null;
+            // wait for stream ready or timeout (1sec)
+            if(@stream_select($sel_r,$sel_w,$sel_e,1) === false){
+                 usleep(1000);
+                 continue;
+            }
+
+            // write to stream
+            $nbytes = fwrite($socket, substr($data,$written,4096));
+            if($nbytes === false)
+                throw new HTTPClientException("Failed writing to socket while sending $message", -100);
+            $written += $nbytes;
+        }
+    }
+
+    /**
+     * Safely read data from a socket
+     *
+     * Reads up to a given number of bytes or throws an exception if the
+     * response times out or ends prematurely.
+     *
+     * @param  resource $socket     An open socket handle in non-blocking mode
+     * @param  int      $nbytes     Number of bytes to read
+     * @param  string   $message    Description of what is being read
+     * @param  bool     $ignore_eof End-of-file is not an error if this is set
+     * @throws HTTPClientException
+     * @return string
+     *
+     * @author Tom N Harris <tnharris@whoopdedo.org>
+     */
+    function _readData($socket, $nbytes, $message, $ignore_eof = false) {
+        $r_data = '';
+        // Does not return immediately so timeout and eof can be checked
+        if ($nbytes < 0) $nbytes = 0;
+        $to_read = $nbytes;
+        do {
+            $time_used = $this->_time() - $this->start;
+            if ($time_used > $this->timeout)
+                throw new HTTPClientException(
+                        sprintf('Timeout while reading %s after %d bytes (%.3fs)', $message,
+                                strlen($r_data), $time_used), -100);
+            if(feof($socket)) {
+                if(!$ignore_eof)
+                    throw new HTTPClientException("Premature End of File (socket) while reading $message");
+                break;
+            }
+
+            if ($to_read > 0) {
+                // select parameters
+                $sel_r = array($socket);
+                $sel_w = null;
+                $sel_e = null;
+                // wait for stream ready or timeout (1sec)
+                if(@stream_select($sel_r,$sel_w,$sel_e,1) === false){
+                     usleep(1000);
+                     continue;
+                }
+
+                $bytes = fread($socket, $to_read);
+                if($bytes === false)
+                    throw new HTTPClientException("Failed reading from socket while reading $message", -100);
+                $r_data .= $bytes;
+                $to_read -= strlen($bytes);
+            }
+        } while ($to_read > 0 && strlen($r_data) < $nbytes);
+        return $r_data;
+    }
+
+    /**
+     * Safely read a \n-terminated line from a socket
+     *
+     * Always returns a complete line, including the terminating \n.
+     *
+     * @param  resource $socket     An open socket handle in non-blocking mode
+     * @param  string   $message    Description of what is being read
+     * @throws HTTPClientException
+     * @return string
+     *
+     * @author Tom N Harris <tnharris@whoopdedo.org>
+     */
+    function _readLine($socket, $message) {
+        $r_data = '';
+        do {
+            $time_used = $this->_time() - $this->start;
+            if ($time_used > $this->timeout)
+                throw new HTTPClientException(
+                        sprintf('Timeout while reading %s (%.3fs) >%s<', $message, $time_used, $r_data),
+                        -100);
+            if(feof($socket))
+                throw new HTTPClientException("Premature End of File (socket) while reading $message");
+
+            // select parameters
+            $sel_r = array($socket);
+            $sel_w = null;
+            $sel_e = null;
+            // wait for stream ready or timeout (1sec)
+            if(@stream_select($sel_r,$sel_w,$sel_e,1) === false){
+                 usleep(1000);
+                 continue;
+            }
+
+            $r_data = fgets($socket, 1024);
+        } while (!preg_match('/\n$/',$r_data));
+        return $r_data;
+    }
+
+    /**
+     * print debug info
+     *
+     * Uses _debug_text or _debug_html depending on the SAPI name
+     *
+     * @author Andreas Gohr <andi@splitbrain.org>
+     *
+     * @param string $info
+     * @param mixed  $var
+     */
+    function _debug($info,$var=null){
+        if(!$this->debug) return;
+        if(php_sapi_name() == 'cli'){
+            $this->_debug_text($info, $var);
+        }else{
+            $this->_debug_html($info, $var);
+        }
+    }
+
+    /**
+     * print debug info as HTML
+     *
+     * @param string $info
+     * @param mixed  $var
+     */
+    function _debug_html($info, $var=null){
+        print '<b>'.$info.'</b> '.($this->_time() - $this->start).'s<br />';
+        if(!is_null($var)){
+            ob_start();
+            print_r($var);
+            $content = htmlspecialchars(ob_get_contents());
+            ob_end_clean();
+            print '<pre>'.$content.'</pre>';
+        }
+    }
+
+    /**
+     * prints debug info as plain text
+     *
+     * @param string $info
+     * @param mixed  $var
+     */
+    function _debug_text($info, $var=null){
+        print '*'.$info.'* '.($this->_time() - $this->start)."s\n";
+        if(!is_null($var)) print_r($var);
+        print "\n-----------------------------------------------\n";
+    }
+
+    /**
+     * Return current timestamp in microsecond resolution
+     *
+     * @return float
+     */
+    static function _time(){
+        list($usec, $sec) = explode(" ", microtime());
+        return ((float)$usec + (float)$sec);
+    }
+
+    /**
+     * convert given header string to Header array
+     *
+     * All Keys are lowercased.
+     *
+     * @author Andreas Gohr <andi@splitbrain.org>
+     *
+     * @param string $string
+     * @return array
+     */
+    function _parseHeaders($string){
+        $headers = array();
+        $lines = explode("\n",$string);
+        array_shift($lines); //skip first line (status)
+        foreach($lines as $line){
+            @list($key, $val) = explode(':',$line,2);
+            $key = trim($key);
+            $val = trim($val);
+            $key = strtolower($key);
+            if(!$key) continue;
+            if(isset($headers[$key])){
+                if(is_array($headers[$key])){
+                    $headers[$key][] = $val;
+                }else{
+                    $headers[$key] = array($headers[$key],$val);
+                }
+            }else{
+                $headers[$key] = $val;
+            }
+        }
+        return $headers;
+    }
+
+    /**
+     * convert given header array to header string
+     *
+     * @author Andreas Gohr <andi@splitbrain.org>
+     *
+     * @param array $headers
+     * @return string
+     */
+    function _buildHeaders($headers){
+        $string = '';
+        foreach($headers as $key => $value){
+            if($value === '') continue;
+            $string .= $key.': '.$value.HTTP_NL;
+        }
+        return $string;
+    }
+
+    /**
+     * get cookies as http header string
+     *
+     * @author Andreas Goetz <cpuidle@gmx.de>
+     *
+     * @return string
+     */
+    function _getCookies(){
+        $headers = '';
+        foreach ($this->cookies as $key => $val){
+            $headers .= "$key=$val; ";
+        }
+        $headers = substr($headers, 0, -2);
+        if ($headers) $headers = "Cookie: $headers".HTTP_NL;
+        return $headers;
+    }
+
+    /**
+     * Encode data for posting
+     *
+     * @author Andreas Gohr <andi@splitbrain.org>
+     *
+     * @param array $data
+     * @return string
+     */
+    function _postEncode($data){
+        return http_build_query($data,'','&');
+    }
+
+    /**
+     * Encode data for posting using multipart encoding
+     *
+     * @fixme use of urlencode might be wrong here
+     * @author Andreas Gohr <andi@splitbrain.org>
+     *
+     * @param array $data
+     * @return string
+     */
+    function _postMultipartEncode($data){
+        $boundary = '--'.$this->boundary;
+        $out = '';
+        foreach($data as $key => $val){
+            $out .= $boundary.HTTP_NL;
+            if(!is_array($val)){
+                $out .= 'Content-Disposition: form-data; name="'.urlencode($key).'"'.HTTP_NL;
+                $out .= HTTP_NL; // end of headers
+                $out .= $val;
+                $out .= HTTP_NL;
+            }else{
+                $out .= 'Content-Disposition: form-data; name="'.urlencode($key).'"';
+                if($val['filename']) $out .= '; filename="'.urlencode($val['filename']).'"';
+                $out .= HTTP_NL;
+                if($val['mimetype']) $out .= 'Content-Type: '.$val['mimetype'].HTTP_NL;
+                $out .= HTTP_NL; // end of headers
+                $out .= $val['body'];
+                $out .= HTTP_NL;
+            }
+        }
+        $out .= "$boundary--".HTTP_NL;
+        return $out;
+    }
+
+    /**
+     * Generates a unique identifier for a connection.
+     *
+     * @param  string $server
+     * @param  string $port
+     * @return string unique identifier
+     */
+    function _uniqueConnectionId($server, $port) {
+        return "$server:$port";
+    }
+}
+
+
+/**
+ * Adds DokuWiki specific configs to the HTTP client
+ *
+ * @author Andreas Goetz <cpuidle@gmx.de>
+ */
+class DokuHTTPClient extends HTTPClient {
+
+    /**
+     * Constructor.
+     *
+     * @author Andreas Gohr <andi@splitbrain.org>
+     */
+    function __construct(){
+        global $conf;
+
+        // call parent constructor
+        parent::__construct();
+
+        // set some values from the config
+        $this->proxy_host   = $conf['proxy']['host'];
+        $this->proxy_port   = $conf['proxy']['port'];
+        $this->proxy_user   = $conf['proxy']['user'];
+        $this->proxy_pass   = conf_decodeString($conf['proxy']['pass']);
+        $this->proxy_ssl    = $conf['proxy']['ssl'];
+        $this->proxy_except = $conf['proxy']['except'];
+
+        // allow enabling debugging via URL parameter (if debugging allowed)
+        if($conf['allowdebug']) {
+            if(
+                isset($_REQUEST['httpdebug']) ||
+                (
+                    isset($_SERVER['HTTP_REFERER']) &&
+                    strpos($_SERVER['HTTP_REFERER'], 'httpdebug') !== false
+                )
+            ) {
+                $this->debug = true;
+            }
+        }
+    }
+
+
+    /**
+     * Wraps an event around the parent function
+     *
+     * @triggers HTTPCLIENT_REQUEST_SEND
+     * @author   Andreas Gohr <andi@splitbrain.org>
+     */
+    /**
+     * @param string $url
+     * @param string|array $data the post data either as array or raw data
+     * @param string $method
+     * @return bool
+     */
+    function sendRequest($url,$data='',$method='GET'){
+        $httpdata = array('url'    => $url,
+                          'data'   => $data,
+                          'method' => $method);
+        $evt = new Doku_Event('HTTPCLIENT_REQUEST_SEND',$httpdata);
+        if($evt->advise_before()){
+            $url    = $httpdata['url'];
+            $data   = $httpdata['data'];
+            $method = $httpdata['method'];
+        }
+        $evt->advise_after();
+        unset($evt);
+        return parent::sendRequest($url,$data,$method);
+    }
+
+}
+
+//Setup VIM: ex: et ts=4 :
diff --git a/wiki/inc/IXR_Library.php b/wiki/inc/IXR_Library.php
new file mode 100644
index 0000000..5ae1402
--- /dev/null
+++ b/wiki/inc/IXR_Library.php
@@ -0,0 +1,1132 @@
+<?php
+
+/**
+ * IXR - The Incutio XML-RPC Library
+ *
+ * Copyright (c) 2010, Incutio Ltd.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ *  - Redistributions of source code must retain the above copyright notice,
+ *    this list of conditions and the following disclaimer.
+ *  - Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *  - Neither the name of Incutio Ltd. nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+ * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @package IXR
+ * @since 1.5
+ *
+ * @copyright  Incutio Ltd 2010 (http://www.incutio.com)
+ * @version    1.7.4 7th September 2010
+ * @author     Simon Willison
+ * @link       http://scripts.incutio.com/xmlrpc/ Site/manual
+ *
+ * Modified for DokuWiki
+ * @author  Andreas Gohr <andi@splitbrain.org>
+ */
+class IXR_Value {
+
+    /** @var  IXR_Value[]|IXR_Date|IXR_Base64|int|bool|double|string */
+    var $data;
+    /** @var string */
+    var $type;
+
+    /**
+     * @param mixed $data
+     * @param bool $type
+     */
+    function __construct($data, $type = false) {
+        $this->data = $data;
+        if(!$type) {
+            $type = $this->calculateType();
+        }
+        $this->type = $type;
+        if($type == 'struct') {
+            // Turn all the values in the array in to new IXR_Value objects
+            foreach($this->data as $key => $value) {
+                $this->data[$key] = new IXR_Value($value);
+            }
+        }
+        if($type == 'array') {
+            for($i = 0, $j = count($this->data); $i < $j; $i++) {
+                $this->data[$i] = new IXR_Value($this->data[$i]);
+            }
+        }
+    }
+
+    /**
+     * @return string
+     */
+    function calculateType() {
+        if($this->data === true || $this->data === false) {
+            return 'boolean';
+        }
+        if(is_integer($this->data)) {
+            return 'int';
+        }
+        if(is_double($this->data)) {
+            return 'double';
+        }
+
+        // Deal with IXR object types base64 and date
+        if(is_object($this->data) && is_a($this->data, 'IXR_Date')) {
+            return 'date';
+        }
+        if(is_object($this->data) && is_a($this->data, 'IXR_Base64')) {
+            return 'base64';
+        }
+
+        // If it is a normal PHP object convert it in to a struct
+        if(is_object($this->data)) {
+            $this->data = get_object_vars($this->data);
+            return 'struct';
+        }
+        if(!is_array($this->data)) {
+            return 'string';
+        }
+
+        // We have an array - is it an array or a struct?
+        if($this->isStruct($this->data)) {
+            return 'struct';
+        } else {
+            return 'array';
+        }
+    }
+
+    /**
+     * @return bool|string
+     */
+    function getXml() {
+        // Return XML for this value
+        switch($this->type) {
+            case 'boolean':
+                return '<boolean>' . (($this->data) ? '1' : '0') . '</boolean>';
+                break;
+            case 'int':
+                return '<int>' . $this->data . '</int>';
+                break;
+            case 'double':
+                return '<double>' . $this->data . '</double>';
+                break;
+            case 'string':
+                return '<string>' . htmlspecialchars($this->data) . '</string>';
+                break;
+            case 'array':
+                $return = '<array><data>' . "\n";
+                foreach($this->data as $item) {
+                    $return .= '  <value>' . $item->getXml() . "</value>\n";
+                }
+                $return .= '</data></array>';
+                return $return;
+                break;
+            case 'struct':
+                $return = '<struct>' . "\n";
+                foreach($this->data as $name => $value) {
+                    $return .= "  <member><name>$name</name><value>";
+                    $return .= $value->getXml() . "</value></member>\n";
+                }
+                $return .= '</struct>';
+                return $return;
+                break;
+            case 'date':
+            case 'base64':
+                return $this->data->getXml();
+                break;
+        }
+        return false;
+    }
+
+    /**
+     * Checks whether or not the supplied array is a struct or not
+     *
+     * @param array $array
+     * @return boolean
+     */
+    function isStruct($array) {
+        $expected = 0;
+        foreach($array as $key => $value) {
+            if((string) $key != (string) $expected) {
+                return true;
+            }
+            $expected++;
+        }
+        return false;
+    }
+}
+
+/**
+ * IXR_MESSAGE
+ *
+ * @package IXR
+ * @since 1.5
+ *
+ */
+class IXR_Message {
+    var $message;
+    var $messageType; // methodCall / methodResponse / fault
+    var $faultCode;
+    var $faultString;
+    var $methodName;
+    var $params;
+
+    // Current variable stacks
+    var $_arraystructs = array(); // The stack used to keep track of the current array/struct
+    var $_arraystructstypes = array(); // Stack keeping track of if things are structs or array
+    var $_currentStructName = array(); // A stack as well
+    var $_param;
+    var $_value;
+    var $_currentTag;
+    var $_currentTagContents;
+    var $_lastseen;
+    // The XML parser
+    var $_parser;
+
+    /**
+     * @param string $message
+     */
+    function __construct($message) {
+        $this->message =& $message;
+    }
+
+    /**
+     * @return bool
+     */
+    function parse() {
+        // first remove the XML declaration
+        // merged from WP #10698 - this method avoids the RAM usage of preg_replace on very large messages
+        $header = preg_replace('/<\?xml.*?\?' . '>/', '', substr($this->message, 0, 100), 1);
+        $this->message = substr_replace($this->message, $header, 0, 100);
+
+        // workaround for a bug in PHP/libxml2, see http://bugs.php.net/bug.php?id=45996
+        $this->message = str_replace('&lt;', '&#60;', $this->message);
+        $this->message = str_replace('&gt;', '&#62;', $this->message);
+        $this->message = str_replace('&amp;', '&#38;', $this->message);
+        $this->message = str_replace('&apos;', '&#39;', $this->message);
+        $this->message = str_replace('&quot;', '&#34;', $this->message);
+        $this->message = str_replace("\x0b", ' ', $this->message); //vertical tab
+        if(trim($this->message) == '') {
+            return false;
+        }
+        $this->_parser = xml_parser_create();
+        // Set XML parser to take the case of tags in to account
+        xml_parser_set_option($this->_parser, XML_OPTION_CASE_FOLDING, false);
+        // Set XML parser callback functions
+        xml_set_object($this->_parser, $this);
+        xml_set_element_handler($this->_parser, 'tag_open', 'tag_close');
+        xml_set_character_data_handler($this->_parser, 'cdata');
+        $chunk_size = 262144; // 256Kb, parse in chunks to avoid the RAM usage on very large messages
+        $final = false;
+        do {
+            if(strlen($this->message) <= $chunk_size) {
+                $final = true;
+            }
+            $part = substr($this->message, 0, $chunk_size);
+            $this->message = substr($this->message, $chunk_size);
+            if(!xml_parse($this->_parser, $part, $final)) {
+                return false;
+            }
+            if($final) {
+                break;
+            }
+        } while(true);
+        xml_parser_free($this->_parser);
+
+        // Grab the error messages, if any
+        if($this->messageType == 'fault') {
+            $this->faultCode = $this->params[0]['faultCode'];
+            $this->faultString = $this->params[0]['faultString'];
+        }
+        return true;
+    }
+
+    /**
+     * @param $parser
+     * @param string $tag
+     * @param $attr
+     */
+    function tag_open($parser, $tag, $attr) {
+        $this->_currentTagContents = '';
+        $this->_currentTag = $tag;
+
+        switch($tag) {
+            case 'methodCall':
+            case 'methodResponse':
+            case 'fault':
+                $this->messageType = $tag;
+                break;
+            /* Deal with stacks of arrays and structs */
+            case 'data': // data is to all intents and purposes more interesting than array
+                $this->_arraystructstypes[] = 'array';
+                $this->_arraystructs[] = array();
+                break;
+            case 'struct':
+                $this->_arraystructstypes[] = 'struct';
+                $this->_arraystructs[] = array();
+                break;
+        }
+        $this->_lastseen = $tag;
+    }
+
+    /**
+     * @param $parser
+     * @param string $cdata
+     */
+    function cdata($parser, $cdata) {
+        $this->_currentTagContents .= $cdata;
+    }
+
+    /**
+     * @param $parser
+     * @param $tag
+     */
+    function tag_close($parser, $tag) {
+        $value = null;
+        $valueFlag = false;
+        switch($tag) {
+            case 'int':
+            case 'i4':
+                $value = (int) trim($this->_currentTagContents);
+                $valueFlag = true;
+                break;
+            case 'double':
+                $value = (double) trim($this->_currentTagContents);
+                $valueFlag = true;
+                break;
+            case 'string':
+                $value = (string) $this->_currentTagContents;
+                $valueFlag = true;
+                break;
+            case 'dateTime.iso8601':
+                $value = new IXR_Date(trim($this->_currentTagContents));
+                $valueFlag = true;
+                break;
+            case 'value':
+                // "If no type is indicated, the type is string."
+                if($this->_lastseen == 'value') {
+                    $value = (string) $this->_currentTagContents;
+                    $valueFlag = true;
+                }
+                break;
+            case 'boolean':
+                $value = (boolean) trim($this->_currentTagContents);
+                $valueFlag = true;
+                break;
+            case 'base64':
+                $value = base64_decode($this->_currentTagContents);
+                $valueFlag = true;
+                break;
+            /* Deal with stacks of arrays and structs */
+            case 'data':
+            case 'struct':
+                $value = array_pop($this->_arraystructs);
+                array_pop($this->_arraystructstypes);
+                $valueFlag = true;
+                break;
+            case 'member':
+                array_pop($this->_currentStructName);
+                break;
+            case 'name':
+                $this->_currentStructName[] = trim($this->_currentTagContents);
+                break;
+            case 'methodName':
+                $this->methodName = trim($this->_currentTagContents);
+                break;
+        }
+
+        if($valueFlag) {
+            if(count($this->_arraystructs) > 0) {
+                // Add value to struct or array
+                if($this->_arraystructstypes[count($this->_arraystructstypes) - 1] == 'struct') {
+                    // Add to struct
+                    $this->_arraystructs[count($this->_arraystructs) - 1][$this->_currentStructName[count($this->_currentStructName) - 1]] = $value;
+                } else {
+                    // Add to array
+                    $this->_arraystructs[count($this->_arraystructs) - 1][] = $value;
+                }
+            } else {
+                // Just add as a parameter
+                $this->params[] = $value;
+            }
+        }
+        $this->_currentTagContents = '';
+        $this->_lastseen = $tag;
+    }
+}
+
+/**
+ * IXR_Server
+ *
+ * @package IXR
+ * @since 1.5
+ */
+class IXR_Server {
+    var $data;
+    /** @var array */
+    var $callbacks = array();
+    var $message;
+    /** @var array */
+    var $capabilities;
+
+    /**
+     * @param array|bool $callbacks
+     * @param bool $data
+     * @param bool $wait
+     */
+    function __construct($callbacks = false, $data = false, $wait = false) {
+        $this->setCapabilities();
+        if($callbacks) {
+            $this->callbacks = $callbacks;
+        }
+        $this->setCallbacks();
+
+        if(!$wait) {
+            $this->serve($data);
+        }
+    }
+
+    /**
+     * @param bool|string $data
+     */
+    function serve($data = false) {
+        if(!$data) {
+
+            $postData = trim(http_get_raw_post_data());
+            if(!$postData) {
+                header('Content-Type: text/plain'); // merged from WP #9093
+                die('XML-RPC server accepts POST requests only.');
+            }
+            $data = $postData;
+        }
+        $this->message = new IXR_Message($data);
+        if(!$this->message->parse()) {
+            $this->error(-32700, 'parse error. not well formed');
+        }
+        if($this->message->messageType != 'methodCall') {
+            $this->error(-32600, 'server error. invalid xml-rpc. not conforming to spec. Request must be a methodCall');
+        }
+        $result = $this->call($this->message->methodName, $this->message->params);
+
+        // Is the result an error?
+        if(is_a($result, 'IXR_Error')) {
+            $this->error($result);
+        }
+
+        // Encode the result
+        $r = new IXR_Value($result);
+        $resultxml = $r->getXml();
+
+        // Create the XML
+        $xml = <<<EOD
+<methodResponse>
+  <params>
+    <param>
+      <value>
+        $resultxml
+      </value>
+    </param>
+  </params>
+</methodResponse>
+
+EOD;
+        // Send it
+        $this->output($xml);
+    }
+
+    /**
+     * @param string $methodname
+     * @param array $args
+     * @return IXR_Error|mixed
+     */
+    function call($methodname, $args) {
+        if(!$this->hasMethod($methodname)) {
+            return new IXR_Error(-32601, 'server error. requested method ' . $methodname . ' does not exist.');
+        }
+        $method = $this->callbacks[$methodname];
+
+        // Perform the callback and send the response
+
+        # Removed for DokuWiki to have a more consistent interface
+        #        if (count($args) == 1) {
+        #            // If only one parameter just send that instead of the whole array
+        #            $args = $args[0];
+        #        }
+
+        # Adjusted for DokuWiki to use call_user_func_array
+
+        // args need to be an array
+        $args = (array) $args;
+
+        // Are we dealing with a function or a method?
+        if(is_string($method) && substr($method, 0, 5) == 'this:') {
+            // It's a class method - check it exists
+            $method = substr($method, 5);
+            if(!method_exists($this, $method)) {
+                return new IXR_Error(-32601, 'server error. requested class method "' . $method . '" does not exist.');
+            }
+            // Call the method
+            #$result = $this->$method($args);
+            $result = call_user_func_array(array(&$this, $method), $args);
+        } elseif(substr($method, 0, 7) == 'plugin:') {
+            list($pluginname, $callback) = explode(':', substr($method, 7), 2);
+            if(!plugin_isdisabled($pluginname)) {
+                $plugin = plugin_load('action', $pluginname);
+                return call_user_func_array(array($plugin, $callback), $args);
+            } else {
+                return new IXR_Error(-99999, 'server error');
+            }
+        } else {
+            // It's a function - does it exist?
+            if(is_array($method)) {
+                if(!is_callable(array($method[0], $method[1]))) {
+                    return new IXR_Error(-32601, 'server error. requested object method "' . $method[1] . '" does not exist.');
+                }
+            } else if(!function_exists($method)) {
+                return new IXR_Error(-32601, 'server error. requested function "' . $method . '" does not exist.');
+            }
+
+            // Call the function
+            $result = call_user_func($method, $args);
+        }
+        return $result;
+    }
+
+    /**
+     * @param int $error
+     * @param string|bool $message
+     */
+    function error($error, $message = false) {
+        // Accepts either an error object or an error code and message
+        if($message && !is_object($error)) {
+            $error = new IXR_Error($error, $message);
+        }
+        $this->output($error->getXml());
+    }
+
+    /**
+     * @param string $xml
+     */
+    function output($xml) {
+        header('Content-Type: text/xml; charset=utf-8');
+        echo '<?xml version="1.0"?>', "\n", $xml;
+        exit;
+    }
+
+    /**
+     * @param string $method
+     * @return bool
+     */
+    function hasMethod($method) {
+        return in_array($method, array_keys($this->callbacks));
+    }
+
+    function setCapabilities() {
+        // Initialises capabilities array
+        $this->capabilities = array(
+            'xmlrpc' => array(
+                'specUrl' => 'http://www.xmlrpc.com/spec',
+                'specVersion' => 1
+            ),
+            'faults_interop' => array(
+                'specUrl' => 'http://xmlrpc-epi.sourceforge.net/specs/rfc.fault_codes.php',
+                'specVersion' => 20010516
+            ),
+            'system.multicall' => array(
+                'specUrl' => 'http://www.xmlrpc.com/discuss/msgReader$1208',
+                'specVersion' => 1
+            ),
+        );
+    }
+
+    /**
+     * @return mixed
+     */
+    function getCapabilities() {
+        return $this->capabilities;
+    }
+
+    function setCallbacks() {
+        $this->callbacks['system.getCapabilities'] = 'this:getCapabilities';
+        $this->callbacks['system.listMethods'] = 'this:listMethods';
+        $this->callbacks['system.multicall'] = 'this:multiCall';
+    }
+
+    /**
+     * @return array
+     */
+    function listMethods() {
+        // Returns a list of methods - uses array_reverse to ensure user defined
+        // methods are listed before server defined methods
+        return array_reverse(array_keys($this->callbacks));
+    }
+
+    /**
+     * @param array $methodcalls
+     * @return array
+     */
+    function multiCall($methodcalls) {
+        // See http://www.xmlrpc.com/discuss/msgReader$1208
+        $return = array();
+        foreach($methodcalls as $call) {
+            $method = $call['methodName'];
+            $params = $call['params'];
+            if($method == 'system.multicall') {
+                $result = new IXR_Error(-32800, 'Recursive calls to system.multicall are forbidden');
+            } else {
+                $result = $this->call($method, $params);
+            }
+            if(is_a($result, 'IXR_Error')) {
+                $return[] = array(
+                    'faultCode' => $result->code,
+                    'faultString' => $result->message
+                );
+            } else {
+                $return[] = array($result);
+            }
+        }
+        return $return;
+    }
+}
+
+/**
+ * IXR_Request
+ *
+ * @package IXR
+ * @since 1.5
+ */
+class IXR_Request {
+    /** @var string */
+    var $method;
+    /** @var array */
+    var $args;
+    /** @var string */
+    var $xml;
+
+    /**
+     * @param string $method
+     * @param array $args
+     */
+    function __construct($method, $args) {
+        $this->method = $method;
+        $this->args = $args;
+        $this->xml = <<<EOD
+<?xml version="1.0"?>
+<methodCall>
+<methodName>{$this->method}</methodName>
+<params>
+
+EOD;
+        foreach($this->args as $arg) {
+            $this->xml .= '<param><value>';
+            $v = new IXR_Value($arg);
+            $this->xml .= $v->getXml();
+            $this->xml .= "</value></param>\n";
+        }
+        $this->xml .= '</params></methodCall>';
+    }
+
+    /**
+     * @return int
+     */
+    function getLength() {
+        return strlen($this->xml);
+    }
+
+    /**
+     * @return string
+     */
+    function getXml() {
+        return $this->xml;
+    }
+}
+
+/**
+ * IXR_Client
+ *
+ * @package IXR
+ * @since 1.5
+ *
+ * Changed for DokuWiki to use DokuHTTPClient
+ *
+ * This should be compatible to the original class, but uses DokuWiki's
+ * HTTP client library which will respect proxy settings
+ *
+ * Because the XMLRPC client is not used in DokuWiki currently this is completely
+ * untested
+ */
+class IXR_Client extends DokuHTTPClient {
+    var $posturl = '';
+    /** @var IXR_Message|bool */
+    var $message = false;
+
+    // Storage place for an error message
+    /** @var IXR_Error|bool */
+    var $xmlerror = false;
+
+    /**
+     * @param string $server
+     * @param string|bool $path
+     * @param int $port
+     * @param int $timeout
+     */
+    function __construct($server, $path = false, $port = 80, $timeout = 15) {
+        parent::__construct();
+        if(!$path) {
+            // Assume we have been given a URL instead
+            $this->posturl = $server;
+        } else {
+            $this->posturl = 'http://' . $server . ':' . $port . $path;
+        }
+        $this->timeout = $timeout;
+    }
+
+    /**
+     * parameters: method and arguments
+     * @return bool success or error
+     */
+    function query() {
+        $args = func_get_args();
+        $method = array_shift($args);
+        $request = new IXR_Request($method, $args);
+        $xml = $request->getXml();
+
+        $this->headers['Content-Type'] = 'text/xml';
+        if(!$this->sendRequest($this->posturl, $xml, 'POST')) {
+            $this->xmlerror = new IXR_Error(-32300, 'transport error - ' . $this->error);
+            return false;
+        }
+
+        // Check HTTP Response code
+        if($this->status < 200 || $this->status > 206) {
+            $this->xmlerror = new IXR_Error(-32300, 'transport error - HTTP status ' . $this->status);
+            return false;
+        }
+
+        // Now parse what we've got back
+        $this->message = new IXR_Message($this->resp_body);
+        if(!$this->message->parse()) {
+            // XML error
+            $this->xmlerror = new IXR_Error(-32700, 'parse error. not well formed');
+            return false;
+        }
+
+        // Is the message a fault?
+        if($this->message->messageType == 'fault') {
+            $this->xmlerror = new IXR_Error($this->message->faultCode, $this->message->faultString);
+            return false;
+        }
+
+        // Message must be OK
+        return true;
+    }
+
+    /**
+     * @return mixed
+     */
+    function getResponse() {
+        // methodResponses can only have one param - return that
+        return $this->message->params[0];
+    }
+
+    /**
+     * @return bool
+     */
+    function isError() {
+        return (is_object($this->xmlerror));
+    }
+
+    /**
+     * @return int
+     */
+    function getErrorCode() {
+        return $this->xmlerror->code;
+    }
+
+    /**
+     * @return string
+     */
+    function getErrorMessage() {
+        return $this->xmlerror->message;
+    }
+}
+
+/**
+ * IXR_Error
+ *
+ * @package IXR
+ * @since 1.5
+ */
+class IXR_Error {
+    var $code;
+    var $message;
+
+    /**
+     * @param int $code
+     * @param string $message
+     */
+    function __construct($code, $message) {
+        $this->code = $code;
+        $this->message = htmlspecialchars($message);
+    }
+
+    /**
+     * @return string
+     */
+    function getXml() {
+        $xml = <<<EOD
+<methodResponse>
+  <fault>
+    <value>
+      <struct>
+        <member>
+          <name>faultCode</name>
+          <value><int>{$this->code}</int></value>
+        </member>
+        <member>
+          <name>faultString</name>
+          <value><string>{$this->message}</string></value>
+        </member>
+      </struct>
+    </value>
+  </fault>
+</methodResponse>
+
+EOD;
+        return $xml;
+    }
+}
+
+/**
+ * IXR_Date
+ *
+ * @package IXR
+ * @since 1.5
+ */
+class IXR_Date {
+
+    /** @var DateTime */
+    protected $date;
+
+    /**
+     * @param int|string $time
+     */
+    public function __construct($time) {
+        // $time can be a PHP timestamp or an ISO one
+        if(is_numeric($time)) {
+            $this->parseTimestamp($time);
+        } else {
+            $this->parseIso($time);
+        }
+    }
+
+    /**
+     * Parse unix timestamp
+     *
+     * @param int $timestamp
+     */
+    protected function parseTimestamp($timestamp) {
+        $this->date = new DateTime('@' . $timestamp);
+    }
+
+    /**
+     * Parses less or more complete iso dates and much more, if no timezone given assumes UTC
+     *
+     * @param string $iso
+     */
+    protected function parseIso($iso) {
+        $this->date = new DateTime($iso, new DateTimeZone("UTC"));
+    }
+
+    /**
+     * Returns date in ISO 8601 format
+     *
+     * @return string
+     */
+    public function getIso() {
+        return $this->date->format(DateTime::ISO8601);
+    }
+
+    /**
+     * Returns date in valid xml
+     *
+     * @return string
+     */
+    public function getXml() {
+        return '<dateTime.iso8601>' . $this->getIso() . '</dateTime.iso8601>';
+    }
+
+    /**
+     * Returns Unix timestamp
+     *
+     * @return int
+     */
+    function getTimestamp() {
+        return $this->date->getTimestamp();
+    }
+}
+
+/**
+ * IXR_Base64
+ *
+ * @package IXR
+ * @since 1.5
+ */
+class IXR_Base64 {
+    var $data;
+
+    /**
+     * @param string $data
+     */
+    function __construct($data) {
+        $this->data = $data;
+    }
+
+    /**
+     * @return string
+     */
+    function getXml() {
+        return '<base64>' . base64_encode($this->data) . '</base64>';
+    }
+}
+
+/**
+ * IXR_IntrospectionServer
+ *
+ * @package IXR
+ * @since 1.5
+ */
+class IXR_IntrospectionServer extends IXR_Server {
+    /** @var array[] */
+    var $signatures;
+    /** @var string[] */
+    var $help;
+
+    /**
+     * Constructor
+     */
+    function __construct() {
+        $this->setCallbacks();
+        $this->setCapabilities();
+        $this->capabilities['introspection'] = array(
+            'specUrl' => 'http://xmlrpc.usefulinc.com/doc/reserved.html',
+            'specVersion' => 1
+        );
+        $this->addCallback(
+            'system.methodSignature',
+            'this:methodSignature',
+            array('array', 'string'),
+            'Returns an array describing the return type and required parameters of a method'
+        );
+        $this->addCallback(
+            'system.getCapabilities',
+            'this:getCapabilities',
+            array('struct'),
+            'Returns a struct describing the XML-RPC specifications supported by this server'
+        );
+        $this->addCallback(
+            'system.listMethods',
+            'this:listMethods',
+            array('array'),
+            'Returns an array of available methods on this server'
+        );
+        $this->addCallback(
+            'system.methodHelp',
+            'this:methodHelp',
+            array('string', 'string'),
+            'Returns a documentation string for the specified method'
+        );
+    }
+
+    /**
+     * @param string $method
+     * @param string $callback
+     * @param string[] $args
+     * @param string $help
+     */
+    function addCallback($method, $callback, $args, $help) {
+        $this->callbacks[$method] = $callback;
+        $this->signatures[$method] = $args;
+        $this->help[$method] = $help;
+    }
+
+    /**
+     * @param string $methodname
+     * @param array $args
+     * @return IXR_Error|mixed
+     */
+    function call($methodname, $args) {
+        // Make sure it's in an array
+        if($args && !is_array($args)) {
+            $args = array($args);
+        }
+
+        // Over-rides default call method, adds signature check
+        if(!$this->hasMethod($methodname)) {
+            return new IXR_Error(-32601, 'server error. requested method "' . $this->message->methodName . '" not specified.');
+        }
+        $method = $this->callbacks[$methodname];
+        $signature = $this->signatures[$methodname];
+        $returnType = array_shift($signature);
+        // Check the number of arguments. Check only, if the minimum count of parameters is specified. More parameters are possible.
+        // This is a hack to allow optional parameters...
+        if(count($args) < count($signature)) {
+            // print 'Num of args: '.count($args).' Num in signature: '.count($signature);
+            return new IXR_Error(-32602, 'server error. wrong number of method parameters');
+        }
+
+        // Check the argument types
+        $ok = true;
+        $argsbackup = $args;
+        for($i = 0, $j = count($args); $i < $j; $i++) {
+            $arg = array_shift($args);
+            $type = array_shift($signature);
+            switch($type) {
+                case 'int':
+                case 'i4':
+                    if(is_array($arg) || !is_int($arg)) {
+                        $ok = false;
+                    }
+                    break;
+                case 'base64':
+                case 'string':
+                    if(!is_string($arg)) {
+                        $ok = false;
+                    }
+                    break;
+                case 'boolean':
+                    if($arg !== false && $arg !== true) {
+                        $ok = false;
+                    }
+                    break;
+                case 'float':
+                case 'double':
+                    if(!is_float($arg)) {
+                        $ok = false;
+                    }
+                    break;
+                case 'date':
+                case 'dateTime.iso8601':
+                    if(!is_a($arg, 'IXR_Date')) {
+                        $ok = false;
+                    }
+                    break;
+            }
+            if(!$ok) {
+                return new IXR_Error(-32602, 'server error. invalid method parameters');
+            }
+        }
+        // It passed the test - run the "real" method call
+        return parent::call($methodname, $argsbackup);
+    }
+
+    /**
+     * @param string $method
+     * @return array|IXR_Error
+     */
+    function methodSignature($method) {
+        if(!$this->hasMethod($method)) {
+            return new IXR_Error(-32601, 'server error. requested method "' . $method . '" not specified.');
+        }
+        // We should be returning an array of types
+        $types = $this->signatures[$method];
+        $return = array();
+        foreach($types as $type) {
+            switch($type) {
+                case 'string':
+                    $return[] = 'string';
+                    break;
+                case 'int':
+                case 'i4':
+                    $return[] = 42;
+                    break;
+                case 'double':
+                    $return[] = 3.1415;
+                    break;
+                case 'dateTime.iso8601':
+                    $return[] = new IXR_Date(time());
+                    break;
+                case 'boolean':
+                    $return[] = true;
+                    break;
+                case 'base64':
+                    $return[] = new IXR_Base64('base64');
+                    break;
+                case 'array':
+                    $return[] = array('array');
+                    break;
+                case 'struct':
+                    $return[] = array('struct' => 'struct');
+                    break;
+            }
+        }
+        return $return;
+    }
+
+    /**
+     * @param string $method
+     * @return mixed
+     */
+    function methodHelp($method) {
+        return $this->help[$method];
+    }
+}
+
+/**
+ * IXR_ClientMulticall
+ *
+ * @package IXR
+ * @since 1.5
+ */
+class IXR_ClientMulticall extends IXR_Client {
+
+    /** @var array[] */
+    var $calls = array();
+
+    /**
+     * @param string $server
+     * @param string|bool $path
+     * @param int $port
+     */
+    function __construct($server, $path = false, $port = 80) {
+        parent::__construct($server, $path, $port);
+        //$this->useragent = 'The Incutio XML-RPC PHP Library (multicall client)';
+    }
+
+    /**
+     * Add a call
+     */
+    function addCall() {
+        $args = func_get_args();
+        $methodName = array_shift($args);
+        $struct = array(
+            'methodName' => $methodName,
+            'params' => $args
+        );
+        $this->calls[] = $struct;
+    }
+
+    /**
+     * @return bool
+     */
+    function query() {
+        // Prepare multicall, then call the parent::query() method
+        return parent::query('system.multicall', $this->calls);
+    }
+}
+
diff --git a/wiki/inc/Input.class.php b/wiki/inc/Input.class.php
new file mode 100644
index 0000000..199994d
--- /dev/null
+++ b/wiki/inc/Input.class.php
@@ -0,0 +1,335 @@
+<?php
+
+/**
+ * Encapsulates access to the $_REQUEST array, making sure used parameters are initialized and
+ * have the correct type.
+ *
+ * All function access the $_REQUEST array by default, if you want to access $_POST or $_GET
+ * explicitly use the $post and $get members.
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+class Input {
+
+    /** @var PostInput Access $_POST parameters */
+    public $post;
+    /** @var GetInput Access $_GET parameters */
+    public $get;
+    /** @var ServerInput Access $_SERVER parameters */
+    public $server;
+
+    protected $access;
+
+    /**
+     * @var Callable
+     */
+    protected $filter;
+
+    /**
+     * Intilizes the Input class and it subcomponents
+     */
+    function __construct() {
+        $this->access = &$_REQUEST;
+        $this->post   = new PostInput();
+        $this->get    = new GetInput();
+        $this->server = new ServerInput();
+    }
+
+    /**
+     * Apply the set filter to the given value
+     *
+     * @param string $data
+     * @return string
+     */
+    protected function applyfilter($data){
+        if(!$this->filter) return $data;
+        return call_user_func($this->filter, $data);
+    }
+
+    /**
+     * Return a filtered copy of the input object
+     *
+     * Expects a callable that accepts one string parameter and returns a filtered string
+     *
+     * @param Callable|string $filter
+     * @return Input
+     */
+    public function filter($filter='stripctl'){
+        $this->filter = $filter;
+        $clone = clone $this;
+        $this->filter = '';
+        return $clone;
+    }
+
+    /**
+     * Check if a parameter was set
+     *
+     * Basically a wrapper around isset. When called on the $post and $get subclasses,
+     * the parameter is set to $_POST or $_GET and to $_REQUEST
+     *
+     * @see isset
+     * @param string $name Parameter name
+     * @return bool
+     */
+    public function has($name) {
+        return isset($this->access[$name]);
+    }
+
+    /**
+     * Remove a parameter from the superglobals
+     *
+     * Basically a wrapper around unset. When NOT called on the $post and $get subclasses,
+     * the parameter will also be removed from $_POST or $_GET
+     *
+     * @see isset
+     * @param string $name Parameter name
+     */
+    public function remove($name) {
+        if(isset($this->access[$name])) {
+            unset($this->access[$name]);
+        }
+        // also remove from sub classes
+        if(isset($this->post) && isset($_POST[$name])) {
+            unset($_POST[$name]);
+        }
+        if(isset($this->get) && isset($_GET[$name])) {
+            unset($_GET[$name]);
+        }
+    }
+
+    /**
+     * Access a request parameter without any type conversion
+     *
+     * @param string    $name     Parameter name
+     * @param mixed     $default  Default to return if parameter isn't set
+     * @param bool      $nonempty Return $default if parameter is set but empty()
+     * @return mixed
+     */
+    public function param($name, $default = null, $nonempty = false) {
+        if(!isset($this->access[$name])) return $default;
+        $value = $this->applyfilter($this->access[$name]);
+        if($nonempty && empty($value)) return $default;
+        return $value;
+    }
+
+    /**
+     * Sets a parameter
+     *
+     * @param string $name Parameter name
+     * @param mixed  $value Value to set
+     */
+    public function set($name, $value) {
+        $this->access[$name] = $value;
+    }
+
+    /**
+     * Get a reference to a request parameter
+     *
+     * This avoids copying data in memory, when the parameter is not set it will be created
+     * and intialized with the given $default value before a reference is returned
+     *
+     * @param string    $name Parameter name
+     * @param mixed     $default If parameter is not set, initialize with this value
+     * @param bool      $nonempty Init with $default if parameter is set but empty()
+     * @return mixed (reference)
+     */
+    public function &ref($name, $default = '', $nonempty = false) {
+        if(!isset($this->access[$name]) || ($nonempty && empty($this->access[$name]))) {
+            $this->set($name, $default);
+        }
+
+        return $this->access[$name];
+    }
+
+    /**
+     * Access a request parameter as int
+     *
+     * @param string    $name     Parameter name
+     * @param int       $default  Default to return if parameter isn't set or is an array
+     * @param bool      $nonempty Return $default if parameter is set but empty()
+     * @return int
+     */
+    public function int($name, $default = 0, $nonempty = false) {
+        if(!isset($this->access[$name])) return $default;
+        if(is_array($this->access[$name])) return $default;
+        $value = $this->applyfilter($this->access[$name]);
+        if($value === '') return $default;
+        if($nonempty && empty($value)) return $default;
+
+        return (int) $value;
+    }
+
+    /**
+     * Access a request parameter as string
+     *
+     * @param string    $name     Parameter name
+     * @param string    $default  Default to return if parameter isn't set or is an array
+     * @param bool      $nonempty Return $default if parameter is set but empty()
+     * @return string
+     */
+    public function str($name, $default = '', $nonempty = false) {
+        if(!isset($this->access[$name])) return $default;
+        if(is_array($this->access[$name])) return $default;
+        $value = $this->applyfilter($this->access[$name]);
+        if($nonempty && empty($value)) return $default;
+
+        return (string) $value;
+    }
+
+    /**
+     * 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
+        $value = $this->applyfilter($this->access[$name]);
+        $found = array_search($value, $valids);
+        if($found !== false) return $valids[$found]; // return the valid value for type safety
+        return $default;
+    }
+
+    /**
+     * Access a request parameter as bool
+     *
+     * Note: $nonempty is here for interface consistency and makes not much sense for booleans
+     *
+     * @param string    $name     Parameter name
+     * @param mixed     $default  Default to return if parameter isn't set
+     * @param bool      $nonempty Return $default if parameter is set but empty()
+     * @return bool
+     */
+    public function bool($name, $default = false, $nonempty = false) {
+        if(!isset($this->access[$name])) return $default;
+        if(is_array($this->access[$name])) return $default;
+        $value = $this->applyfilter($this->access[$name]);
+        if($value === '') return $default;
+        if($nonempty && empty($value)) return $default;
+
+        return (bool) $value;
+    }
+
+    /**
+     * Access a request parameter as array
+     *
+     * @param string    $name     Parameter name
+     * @param mixed     $default  Default to return if parameter isn't set
+     * @param bool      $nonempty Return $default if parameter is set but empty()
+     * @return array
+     */
+    public function arr($name, $default = array(), $nonempty = false) {
+        if(!isset($this->access[$name])) return $default;
+        if(!is_array($this->access[$name])) return $default;
+        if($nonempty && empty($this->access[$name])) return $default;
+
+        return (array) $this->access[$name];
+    }
+
+    /**
+     * Create a simple key from an array key
+     *
+     * This is useful to access keys where the information is given as an array key or as a single array value.
+     * For example when the information was submitted as the name of a submit button.
+     *
+     * This function directly changes the access array.
+     *
+     * Eg. $_REQUEST['do']['save']='Speichern' becomes $_REQUEST['do'] = 'save'
+     *
+     * This function returns the $INPUT object itself for easy chaining
+     *
+     * @param string $name
+     * @return Input
+     */
+    public function extract($name){
+        if(!isset($this->access[$name])) return $this;
+        if(!is_array($this->access[$name])) return $this;
+        $keys = array_keys($this->access[$name]);
+        if(!$keys){
+            // this was an empty array
+            $this->remove($name);
+            return $this;
+        }
+        // get the first key
+        $value = array_shift($keys);
+        if($value === 0){
+            // we had a numeric array, assume the value is not in the key
+            $value = array_shift($this->access[$name]);
+        }
+
+        $this->set($name, $value);
+        return $this;
+    }
+}
+
+/**
+ * Internal class used for $_POST access in Input class
+ */
+class PostInput extends Input {
+    protected $access;
+
+    /**
+     * Initialize the $access array, remove subclass members
+     */
+    function __construct() {
+        $this->access = &$_POST;
+    }
+
+    /**
+     * Sets a parameter in $_POST and $_REQUEST
+     *
+     * @param string $name Parameter name
+     * @param mixed  $value Value to set
+     */
+    public function set($name, $value) {
+        parent::set($name, $value);
+        $_REQUEST[$name] = $value;
+    }
+}
+
+/**
+ * Internal class used for $_GET access in Input class
+ */
+class GetInput extends Input {
+    protected $access;
+
+    /**
+     * Initialize the $access array, remove subclass members
+     */
+    function __construct() {
+        $this->access = &$_GET;
+    }
+
+    /**
+     * Sets a parameter in $_GET and $_REQUEST
+     *
+     * @param string $name Parameter name
+     * @param mixed  $value Value to set
+     */
+    public function set($name, $value) {
+        parent::set($name, $value);
+        $_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/wiki/inc/JSON.php b/wiki/inc/JSON.php
new file mode 100644
index 0000000..fe4ca5c
--- /dev/null
+++ b/wiki/inc/JSON.php
@@ -0,0 +1,656 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * Converts to and from JSON format.
+ *
+ * JSON (JavaScript Object Notation) is a lightweight data-interchange
+ * format. It is easy for humans to read and write. It is easy for machines
+ * to parse and generate. It is based on a subset of the JavaScript
+ * Programming Language, Standard ECMA-262 3rd Edition - December 1999.
+ * This feature can also be found in  Python. JSON is a text format that is
+ * completely language independent but uses conventions that are familiar
+ * to programmers of the C-family of languages, including C, C++, C#, Java,
+ * JavaScript, Perl, TCL, and many others. These properties make JSON an
+ * ideal data-interchange language.
+ *
+ * This package provides a simple encoder and decoder for JSON notation. It
+ * is intended for use with client-side Javascript applications that make
+ * use of HTTPRequest to perform server communication functions - data can
+ * be encoded into JSON notation for use in a client-side javascript, or
+ * decoded from incoming Javascript requests. JSON format is native to
+ * Javascript, and can be directly eval()'ed with no further parsing
+ * overhead
+ *
+ * All strings should be in ASCII or UTF-8 format!
+ *
+ * PHP versions 4 and 5
+ *
+ * LICENSE: Redistribution and use in source and binary forms, with or
+ * without modification, are permitted provided that the following
+ * conditions are met: Redistributions of source code must retain the
+ * above copyright notice, this list of conditions and the following
+ * disclaimer. Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ * NO EVENT SHALL CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
+ * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+ * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * @author      Michal Migurski <mike-json@teczno.com>
+ * @author      Matt Knapp <mdknapp[at]gmail[dot]com>
+ * @author      Brett Stimmerman <brettstimmerman[at]gmail[dot]com>
+ * @copyright   2005 Michal Migurski
+ * @license     http://www.freebsd.org/copyright/freebsd-license.html
+ * @link        http://pear.php.net/pepr/pepr-proposal-show.php?id=198
+ */
+
+// for DokuWiki
+if(!defined('DOKU_INC')) die('meh.');
+
+/**
+ * Marker constant for JSON::decode(), used to flag stack state
+ */
+define('JSON_SLICE',   1);
+
+/**
+ * Marker constant for JSON::decode(), used to flag stack state
+ */
+define('JSON_IN_STR',  2);
+
+/**
+ * Marker constant for JSON::decode(), used to flag stack state
+ */
+define('JSON_IN_ARR',  4);
+
+/**
+ * Marker constant for JSON::decode(), used to flag stack state
+ */
+define('JSON_IN_OBJ',  8);
+
+/**
+ * Marker constant for JSON::decode(), used to flag stack state
+ */
+define('JSON_IN_CMT', 16);
+
+/**
+ * Behavior switch for JSON::decode()
+ */
+define('JSON_LOOSE_TYPE', 10);
+
+/**
+ * Behavior switch for JSON::decode()
+ */
+define('JSON_STRICT_TYPE', 11);
+
+/**
+ * Converts to and from JSON format.
+ */
+class JSON {
+
+    /**
+     * Disables the use of PHP5's native json_decode()
+     *
+     * You shouldn't change this usually because the native function is much
+     * faster. However, this non-native will also parse slightly broken JSON
+     * which might be handy when talking to a non-conform endpoint
+     */
+    public $skipnative = false;
+
+    /**
+     * constructs a new JSON instance
+     *
+     * @param    int     $use    object behavior: when encoding or decoding,
+     *                           be loose or strict about object/array usage
+     *
+     *                           possible values:
+     *                              JSON_STRICT_TYPE - strict typing, default
+     *                                                 "{...}" syntax creates objects in decode.
+     *                               JSON_LOOSE_TYPE - loose typing
+     *                                                 "{...}" syntax creates associative arrays in decode.
+     */
+    function __construct($use=JSON_STRICT_TYPE) {
+        $this->use = $use;
+    }
+
+    /**
+     * encodes an arbitrary variable into JSON format
+     * If available the native PHP JSON implementation is used.
+     *
+     * @param    mixed   $var    any number, boolean, string, array, or object to be encoded.
+     *                           see argument 1 to JSON() above for array-parsing behavior.
+     *                           if var is a strng, note that encode() always expects it
+     *                           to be in ASCII or UTF-8 format!
+     *
+     * @return   string  JSON string representation of input var
+     * @access   public
+     */
+    function encode($var) {
+        if (!$this->skipnative && function_exists('json_encode')){
+            return json_encode($var);
+        }
+        switch (gettype($var)) {
+            case 'boolean':
+                return $var ? 'true' : 'false';
+
+            case 'NULL':
+                return 'null';
+
+            case 'integer':
+                return sprintf('%d', $var);
+
+            case 'double':
+            case 'float':
+                return sprintf('%f', $var);
+
+            case 'string':
+                // STRINGS ARE EXPECTED TO BE IN ASCII OR UTF-8 FORMAT
+                $ascii = '';
+                $strlen_var = strlen($var);
+
+                /*
+                 * Iterate over every character in the string,
+                 * escaping with a slash or encoding to UTF-8 where necessary
+                 */
+                for ($c = 0; $c < $strlen_var; ++$c) {
+
+                    $ord_var_c = ord($var{$c});
+
+                    switch ($ord_var_c) {
+                        case 0x08:
+                            $ascii .= '\b';
+                            break;
+                        case 0x09:
+                            $ascii .= '\t';
+                            break;
+                        case 0x0A:
+                            $ascii .= '\n';
+                            break;
+                        case 0x0C:
+                            $ascii .= '\f';
+                            break;
+                        case 0x0D:
+                            $ascii .= '\r';
+                            break;
+
+                        case 0x22:
+                        case 0x2F:
+                        case 0x5C:
+                            // double quote, slash, slosh
+                            $ascii .= '\\'.$var{$c};
+                            break;
+
+                        case (($ord_var_c >= 0x20) && ($ord_var_c <= 0x7F)):
+                            // characters U-00000000 - U-0000007F (same as ASCII)
+                            $ascii .= $var{$c};
+                            break;
+
+                        case (($ord_var_c & 0xE0) == 0xC0):
+                            // characters U-00000080 - U-000007FF, mask 110XXXXX
+                            // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+                            $char = pack('C*', $ord_var_c, ord($var{$c+1}));
+                            $c+=1;
+                            //$utf16 = mb_convert_encoding($char, 'UTF-16', 'UTF-8');
+                            $utf16 = utf8_to_utf16be($char);
+                            $ascii .= sprintf('\u%04s', bin2hex($utf16));
+                            break;
+
+                        case (($ord_var_c & 0xF0) == 0xE0):
+                            // characters U-00000800 - U-0000FFFF, mask 1110XXXX
+                            // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+                            $char = pack('C*', $ord_var_c,
+                                         ord($var{$c+1}),
+                                         ord($var{$c+2}));
+                            $c+=2;
+                            //$utf16 = mb_convert_encoding($char, 'UTF-16', 'UTF-8');
+                            $utf16 = utf8_to_utf16be($char);
+                            $ascii .= sprintf('\u%04s', bin2hex($utf16));
+                            break;
+
+                        case (($ord_var_c & 0xF8) == 0xF0):
+                            // characters U-00010000 - U-001FFFFF, mask 11110XXX
+                            // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+                            $char = pack('C*', $ord_var_c,
+                                         ord($var{$c+1}),
+                                         ord($var{$c+2}),
+                                         ord($var{$c+3}));
+                            $c+=3;
+                            //$utf16 = mb_convert_encoding($char, 'UTF-16', 'UTF-8');
+                            $utf16 = utf8_to_utf16be($char);
+                            $ascii .= sprintf('\u%04s', bin2hex($utf16));
+                            break;
+
+                        case (($ord_var_c & 0xFC) == 0xF8):
+                            // characters U-00200000 - U-03FFFFFF, mask 111110XX
+                            // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+                            $char = pack('C*', $ord_var_c,
+                                         ord($var{$c+1}),
+                                         ord($var{$c+2}),
+                                         ord($var{$c+3}),
+                                         ord($var{$c+4}));
+                            $c+=4;
+                            //$utf16 = mb_convert_encoding($char, 'UTF-16', 'UTF-8');
+                            $utf16 = utf8_to_utf16be($char);
+                            $ascii .= sprintf('\u%04s', bin2hex($utf16));
+                            break;
+
+                        case (($ord_var_c & 0xFE) == 0xFC):
+                            // characters U-04000000 - U-7FFFFFFF, mask 1111110X
+                            // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+                            $char = pack('C*', $ord_var_c,
+                                         ord($var{$c+1}),
+                                         ord($var{$c+2}),
+                                         ord($var{$c+3}),
+                                         ord($var{$c+4}),
+                                         ord($var{$c+5}));
+                            $c+=5;
+                            //$utf16 = mb_convert_encoding($char, 'UTF-16', 'UTF-8');
+                            $utf16 = utf8_to_utf16be($char);
+                            $ascii .= sprintf('\u%04s', bin2hex($utf16));
+                            break;
+                    }
+                }
+
+                return '"'.$ascii.'"';
+
+            case 'array':
+                /*
+                 * As per JSON spec if any array key is not an integer
+                 * we must treat the the whole array as an object. We
+                 * also try to catch a sparsely populated associative
+                 * array with numeric keys here because some JS engines
+                 * will create an array with empty indexes up to
+                 * max_index which can cause memory issues and because
+                 * the keys, which may be relevant, will be remapped
+                 * otherwise.
+                 *
+                 * As per the ECMA and JSON specification an object may
+                 * have any string as a property. Unfortunately due to
+                 * a hole in the ECMA specification if the key is a
+                 * ECMA reserved word or starts with a digit the
+                 * parameter is only accessible using ECMAScript's
+                 * bracket notation.
+                 */
+
+                // treat as a JSON object
+                if (is_array($var) && count($var) && (array_keys($var) !== range(0, count($var) - 1))) {
+                    return sprintf('{%s}', join(',', array_map(array($this, 'name_value'),
+                                                               array_keys($var),
+                                                               array_values($var))));
+                }
+
+                // treat it like a regular array
+                return sprintf('[%s]', join(',', array_map(array($this, 'encode'), $var)));
+
+            case 'object':
+                $vars = get_object_vars($var);
+                return sprintf('{%s}', join(',', array_map(array($this, 'name_value'),
+                                                           array_keys($vars),
+                                                           array_values($vars))));
+
+            default:
+                return '';
+        }
+    }
+
+    /**
+     * encodes an arbitrary variable into JSON format, alias for encode()
+     *
+     * @param mixed $var
+     *
+     * @return string
+     */
+    function enc($var) {
+        return $this->encode($var);
+    }
+
+    /** function name_value
+     * array-walking function for use in generating JSON-formatted name-value pairs
+     *
+     * @param    string  $name   name of key to use
+     * @param    mixed   $value  reference to an array element to be encoded
+     *
+     * @return   string  JSON-formatted name-value pair, like '"name":value'
+     * @access   private
+     */
+    function name_value($name, $value) {
+        return (sprintf("%s:%s", $this->encode(strval($name)), $this->encode($value)));
+    }
+
+    /**
+     * reduce a string by removing leading and trailing comments and whitespace
+     *
+     * @param    $str    string      string value to strip of comments and whitespace
+     *
+     * @return   string  string value stripped of comments and whitespace
+     * @access   private
+     */
+    function reduce_string($str) {
+        $str = preg_replace(array(
+
+                // eliminate single line comments in '// ...' form
+                '#^\s*//(.+)$#m',
+
+                // eliminate multi-line comments in '/* ... */' form, at start of string
+                '#^\s*/\*(.+)\*/#Us',
+
+                // eliminate multi-line comments in '/* ... */' form, at end of string
+                '#/\*(.+)\*/\s*$#Us'
+
+            ), '', $str);
+
+        // eliminate extraneous space
+        return trim($str);
+    }
+
+    /**
+     * decodes a JSON string into appropriate variable
+     * If available the native PHP JSON implementation is used.
+     *
+     * @param    string  $str    JSON-formatted string
+     *
+     * @return   mixed   number, boolean, string, array, or object
+     *                   corresponding to given JSON input string.
+     *                   See argument 1 to JSON() above for object-output behavior.
+     *                   Note that decode() always returns strings
+     *                   in ASCII or UTF-8 format!
+     * @access   public
+     */
+    function decode($str) {
+        if (!$this->skipnative && function_exists('json_decode')){
+            return json_decode($str,($this->use == JSON_LOOSE_TYPE));
+        }
+
+        $str = $this->reduce_string($str);
+
+        switch (strtolower($str)) {
+            case 'true':
+                return true;
+
+            case 'false':
+                return false;
+
+            case 'null':
+                return null;
+
+            default:
+                if (is_numeric($str)) {
+                    // Lookie-loo, it's a number
+
+                    // This would work on its own, but I'm trying to be
+                    // good about returning integers where appropriate:
+                    // return (float)$str;
+
+                    // Return float or int, as appropriate
+                    return ((float)$str == (integer)$str)
+                        ? (integer)$str
+                        : (float)$str;
+
+                } elseif (preg_match('/^("|\').+("|\')$/s', $str, $m) && $m[1] == $m[2]) {
+                    // STRINGS RETURNED IN UTF-8 FORMAT
+                    $delim = substr($str, 0, 1);
+                    $chrs = substr($str, 1, -1);
+                    $utf8 = '';
+                    $strlen_chrs = strlen($chrs);
+
+                    for ($c = 0; $c < $strlen_chrs; ++$c) {
+
+                        $substr_chrs_c_2 = substr($chrs, $c, 2);
+                        $ord_chrs_c = ord($chrs{$c});
+
+                        switch ($substr_chrs_c_2) {
+                            case '\b':
+                                $utf8 .= chr(0x08);
+                                $c+=1;
+                                break;
+                            case '\t':
+                                $utf8 .= chr(0x09);
+                                $c+=1;
+                                break;
+                            case '\n':
+                                $utf8 .= chr(0x0A);
+                                $c+=1;
+                                break;
+                            case '\f':
+                                $utf8 .= chr(0x0C);
+                                $c+=1;
+                                break;
+                            case '\r':
+                                $utf8 .= chr(0x0D);
+                                $c+=1;
+                                break;
+
+                            case '\\"':
+                            case '\\\'':
+                            case '\\\\':
+                            case '\\/':
+                                if (($delim == '"' && $substr_chrs_c_2 != '\\\'') ||
+                                   ($delim == "'" && $substr_chrs_c_2 != '\\"')) {
+                                    $utf8 .= $chrs{++$c};
+                                }
+                                break;
+
+                            default:
+                                if (preg_match('/\\\u[0-9A-F]{4}/i', substr($chrs, $c, 6))) {
+                                    // single, escaped unicode character
+                                    $utf16 = chr(hexdec(substr($chrs, ($c+2), 2)))
+                                           . chr(hexdec(substr($chrs, ($c+4), 2)));
+                                    //$utf8 .= mb_convert_encoding($utf16, 'UTF-8', 'UTF-16');
+                                    $utf8 .= utf16be_to_utf8($utf16);
+                                    $c+=5;
+
+                                } elseif(($ord_chrs_c >= 0x20) && ($ord_chrs_c <= 0x7F)) {
+                                    $utf8 .= $chrs{$c};
+
+                                } elseif(($ord_chrs_c & 0xE0) == 0xC0) {
+                                    // characters U-00000080 - U-000007FF, mask 110XXXXX
+                                    //see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+                                    $utf8 .= substr($chrs, $c, 2);
+                                    $c += 1;
+
+                                } elseif(($ord_chrs_c & 0xF0) == 0xE0) {
+                                    // characters U-00000800 - U-0000FFFF, mask 1110XXXX
+                                    // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+                                    $utf8 .= substr($chrs, $c, 3);
+                                    $c += 2;
+
+                                } elseif(($ord_chrs_c & 0xF8) == 0xF0) {
+                                    // characters U-00010000 - U-001FFFFF, mask 11110XXX
+                                    // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+                                    $utf8 .= substr($chrs, $c, 4);
+                                    $c += 3;
+
+                                } elseif(($ord_chrs_c & 0xFC) == 0xF8) {
+                                    // characters U-00200000 - U-03FFFFFF, mask 111110XX
+                                    // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+                                    $utf8 .= substr($chrs, $c, 5);
+                                    $c += 4;
+
+                                } elseif(($ord_chrs_c & 0xFE) == 0xFC) {
+                                    // characters U-04000000 - U-7FFFFFFF, mask 1111110X
+                                    // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+                                    $utf8 .= substr($chrs, $c, 6);
+                                    $c += 5;
+
+                                }
+                                break;
+
+                        }
+
+                    }
+
+                    return $utf8;
+
+                } elseif (preg_match('/^\[.*\]$/s', $str) || preg_match('/^\{.*\}$/s', $str)) {
+                    // array, or object notation
+
+                    if ($str{0} == '[') {
+                        $stk = array(JSON_IN_ARR);
+                        $arr = array();
+                    } else {
+                        if ($this->use == JSON_LOOSE_TYPE) {
+                            $stk = array(JSON_IN_OBJ);
+                            $obj = array();
+                        } else {
+                            $stk = array(JSON_IN_OBJ);
+                            $obj = new stdClass();
+                        }
+                    }
+
+                    array_push($stk, array('what'  => JSON_SLICE,
+                                           'where' => 0,
+                                           'delim' => false));
+
+                    $chrs = substr($str, 1, -1);
+                    $chrs = $this->reduce_string($chrs);
+
+                    if ($chrs == '') {
+                        if (reset($stk) == JSON_IN_ARR) {
+                            return $arr;
+
+                        } else {
+                            return $obj;
+
+                        }
+                    }
+
+                    //print("\nparsing {$chrs}\n");
+
+                    $strlen_chrs = strlen($chrs);
+
+                    for ($c = 0; $c <= $strlen_chrs; ++$c) {
+
+                        $top = end($stk);
+                        $substr_chrs_c_2 = substr($chrs, $c, 2);
+
+                        if (($c == $strlen_chrs) || (($chrs{$c} == ',') && ($top['what'] == JSON_SLICE))) {
+                            // found a comma that is not inside a string, array, etc.,
+                            // OR we've reached the end of the character list
+                            $slice = substr($chrs, $top['where'], ($c - $top['where']));
+                            array_push($stk, array('what' => JSON_SLICE, 'where' => ($c + 1), 'delim' => false));
+                            //print("Found split at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");
+
+                            if (reset($stk) == JSON_IN_ARR) {
+                                // we are in an array, so just push an element onto the stack
+                                array_push($arr, $this->decode($slice));
+
+                            } elseif (reset($stk) == JSON_IN_OBJ) {
+                                // we are in an object, so figure
+                                // out the property name and set an
+                                // element in an associative array,
+                                // for now
+                                if (preg_match('/^\s*(["\'].*[^\\\]["\'])\s*:\s*(\S.*),?$/Uis', $slice, $parts)) {
+                                    // "name":value pair
+                                    $key = $this->decode($parts[1]);
+                                    $val = $this->decode($parts[2]);
+
+                                    if ($this->use == JSON_LOOSE_TYPE) {
+                                        $obj[$key] = $val;
+                                    } else {
+                                        $obj->$key = $val;
+                                    }
+                                } elseif (preg_match('/^\s*(\w+)\s*:\s*(\S.*),?$/Uis', $slice, $parts)) {
+                                    // name:value pair, where name is unquoted
+                                    $key = $parts[1];
+                                    $val = $this->decode($parts[2]);
+
+                                    if ($this->use == JSON_LOOSE_TYPE) {
+                                        $obj[$key] = $val;
+                                    } else {
+                                        $obj->$key = $val;
+                                    }
+                                }
+
+                            }
+
+                        } elseif ((($chrs{$c} == '"') || ($chrs{$c} == "'")) && ($top['what'] != JSON_IN_STR)) {
+                            // found a quote, and we are not inside a string
+                            array_push($stk, array('what' => JSON_IN_STR, 'where' => $c, 'delim' => $chrs{$c}));
+                            //print("Found start of string at {$c}\n");
+
+                        } elseif (($chrs{$c} == $top['delim']) &&
+                                 ($top['what'] == JSON_IN_STR) &&
+                                 ((strlen(substr($chrs, 0, $c)) - strlen(rtrim(substr($chrs, 0, $c), '\\'))) % 2 != 1)) {
+                            // found a quote, we're in a string, and it's not escaped
+                            // we know that it's not escaped becase there is _not_ an
+                            // odd number of backslashes at the end of the string so far
+                            array_pop($stk);
+                            //print("Found end of string at {$c}: ".substr($chrs, $top['where'], (1 + 1 + $c - $top['where']))."\n");
+
+                        } elseif (($chrs{$c} == '[') &&
+                                 in_array($top['what'], array(JSON_SLICE, JSON_IN_ARR, JSON_IN_OBJ))) {
+                            // found a left-bracket, and we are in an array, object, or slice
+                            array_push($stk, array('what' => JSON_IN_ARR, 'where' => $c, 'delim' => false));
+                            //print("Found start of array at {$c}\n");
+
+                        } elseif (($chrs{$c} == ']') && ($top['what'] == JSON_IN_ARR)) {
+                            // found a right-bracket, and we're in an array
+                            array_pop($stk);
+                            //print("Found end of array at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");
+
+                        } elseif (($chrs{$c} == '{') &&
+                                 in_array($top['what'], array(JSON_SLICE, JSON_IN_ARR, JSON_IN_OBJ))) {
+                            // found a left-brace, and we are in an array, object, or slice
+                            array_push($stk, array('what' => JSON_IN_OBJ, 'where' => $c, 'delim' => false));
+                            //print("Found start of object at {$c}\n");
+
+                        } elseif (($chrs{$c} == '}') && ($top['what'] == JSON_IN_OBJ)) {
+                            // found a right-brace, and we're in an object
+                            array_pop($stk);
+                            //print("Found end of object at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");
+
+                        } elseif (($substr_chrs_c_2 == '/*') &&
+                                 in_array($top['what'], array(JSON_SLICE, JSON_IN_ARR, JSON_IN_OBJ))) {
+                            // found a comment start, and we are in an array, object, or slice
+                            array_push($stk, array('what' => JSON_IN_CMT, 'where' => $c, 'delim' => false));
+                            $c++;
+                            //print("Found start of comment at {$c}\n");
+
+                        } elseif (($substr_chrs_c_2 == '*/') && ($top['what'] == JSON_IN_CMT)) {
+                            // found a comment end, and we're in one now
+                            array_pop($stk);
+                            $c++;
+
+                            for ($i = $top['where']; $i <= $c; ++$i)
+                                $chrs = substr_replace($chrs, ' ', $i, 1);
+
+                            //print("Found end of comment at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");
+
+                        }
+
+                    }
+
+                    if (reset($stk) == JSON_IN_ARR) {
+                        return $arr;
+
+                    } elseif (reset($stk) == JSON_IN_OBJ) {
+                        return $obj;
+
+                    }
+
+                }
+        }
+    }
+
+    /**
+     * decodes a JSON string into appropriate variable; alias for decode()
+     *
+     * @param string $var
+     *
+     * @return mixed
+     */
+    function dec($var) {
+        return $this->decode($var);
+    }
+}
+
diff --git a/wiki/inc/JpegMeta.php b/wiki/inc/JpegMeta.php
new file mode 100644
index 0000000..94c276c
--- /dev/null
+++ b/wiki/inc/JpegMeta.php
@@ -0,0 +1,3188 @@
+<?php
+/**
+ * JPEG metadata reader/writer
+ *
+ * @license    BSD <http://www.opensource.org/licenses/bsd-license.php>
+ * @link       http://github.com/sd/jpeg-php
+ * @author     Sebastian Delmont <sdelmont@zonageek.com>
+ * @author     Andreas Gohr <andi@splitbrain.org>
+ * @author     Hakan Sandell <hakan.sandell@mydata.se>
+ * @todo       Add support for Maker Notes, Extend for GIF and PNG metadata
+ */
+
+// Original copyright notice:
+//
+// Copyright (c) 2003 Sebastian Delmont <sdelmont@zonageek.com>
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1. Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+// 2. Redistributions in binary form must reproduce the above copyright
+//    notice, this list of conditions and the following disclaimer in the
+//    documentation and/or other materials provided with the distribution.
+// 3. Neither the name of the author nor the names of its contributors
+//    may be used to endorse or promote products derived from this software
+//    without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+// TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
+
+class JpegMeta {
+    var $_fileName;
+    var $_fp = null;
+    var $_fpout = null;
+    var $_type = 'unknown';
+
+    var $_markers;
+    var $_info;
+
+
+    /**
+     * Constructor
+     *
+     * @author Sebastian Delmont <sdelmont@zonageek.com>
+     *
+     * @param $fileName
+     */
+    function __construct($fileName) {
+
+        $this->_fileName = $fileName;
+
+        $this->_fp = null;
+        $this->_type = 'unknown';
+
+        unset($this->_info);
+        unset($this->_markers);
+    }
+
+    /**
+     * Returns all gathered info as multidim array
+     *
+     * @author Sebastian Delmont <sdelmont@zonageek.com>
+     */
+    function & getRawInfo() {
+        $this->_parseAll();
+
+        if ($this->_markers == null) {
+            return false;
+        }
+
+        return $this->_info;
+    }
+
+    /**
+     * Returns basic image info
+     *
+     * @author Sebastian Delmont <sdelmont@zonageek.com>
+     */
+    function & getBasicInfo() {
+        $this->_parseAll();
+
+        $info = array();
+
+        if ($this->_markers == null) {
+            return false;
+        }
+
+        $info['Name'] = $this->_info['file']['Name'];
+        if (isset($this->_info['file']['Url'])) {
+            $info['Url'] = $this->_info['file']['Url'];
+            $info['NiceSize'] = "???KB";
+        } else {
+            $info['Size'] = $this->_info['file']['Size'];
+            $info['NiceSize'] = $this->_info['file']['NiceSize'];
+        }
+
+        if (@isset($this->_info['sof']['Format'])) {
+            $info['Format'] = $this->_info['sof']['Format'] . " JPEG";
+        } else {
+            $info['Format'] = $this->_info['sof']['Format'] . " JPEG";
+        }
+
+        if (@isset($this->_info['sof']['ColorChannels'])) {
+            $info['ColorMode'] = ($this->_info['sof']['ColorChannels'] > 1) ? "Color" : "B&W";
+        }
+
+        $info['Width'] = $this->getWidth();
+        $info['Height'] = $this->getHeight();
+        $info['DimStr'] = $this->getDimStr();
+
+        $dates = $this->getDates();
+
+        $info['DateTime'] = $dates['EarliestTime'];
+        $info['DateTimeStr'] = $dates['EarliestTimeStr'];
+
+        $info['HasThumbnail'] = $this->hasThumbnail();
+
+        return $info;
+    }
+
+
+    /**
+     * Convinience function to access nearly all available Data
+     * through one function
+     *
+     * @author Andreas Gohr <andi@splitbrain.org>
+     *
+     * @param array|string $fields field name or array with field names
+     * @return bool|string
+     */
+    function getField($fields) {
+        if(!is_array($fields)) $fields = array($fields);
+        $info = false;
+        foreach($fields as $field){
+            if(strtolower(substr($field,0,5)) == 'iptc.'){
+                $info = $this->getIPTCField(substr($field,5));
+            }elseif(strtolower(substr($field,0,5)) == 'exif.'){
+                $info = $this->getExifField(substr($field,5));
+            }elseif(strtolower(substr($field,0,4)) == 'xmp.'){
+                $info = $this->getXmpField(substr($field,4));
+            }elseif(strtolower(substr($field,0,5)) == 'file.'){
+                $info = $this->getFileField(substr($field,5));
+            }elseif(strtolower(substr($field,0,5)) == 'date.'){
+                $info = $this->getDateField(substr($field,5));
+            }elseif(strtolower($field) == 'simple.camera'){
+                $info = $this->getCamera();
+            }elseif(strtolower($field) == 'simple.raw'){
+                return $this->getRawInfo();
+            }elseif(strtolower($field) == 'simple.title'){
+                $info = $this->getTitle();
+            }elseif(strtolower($field) == 'simple.shutterspeed'){
+                $info = $this->getShutterSpeed();
+            }else{
+                $info = $this->getExifField($field);
+            }
+            if($info != false) break;
+        }
+
+        if($info === false)  $info = '';
+        if(is_array($info)){
+            if(isset($info['val'])){
+                $info = $info['val'];
+            }else{
+                $info = join(', ',$info);
+            }
+        }
+        return trim($info);
+    }
+
+    /**
+     * Convinience function to set nearly all available Data
+     * through one function
+     *
+     * @author Andreas Gohr <andi@splitbrain.org>
+     *
+     * @param string $field field name
+     * @param string $value
+     * @return bool success or fail
+     */
+    function setField($field, $value) {
+        if(strtolower(substr($field,0,5)) == 'iptc.'){
+            return $this->setIPTCField(substr($field,5),$value);
+        }elseif(strtolower(substr($field,0,5)) == 'exif.'){
+            return $this->setExifField(substr($field,5),$value);
+        }else{
+            return $this->setExifField($field,$value);
+        }
+    }
+
+    /**
+     * Convinience function to delete nearly all available Data
+     * through one function
+     *
+     * @author Andreas Gohr <andi@splitbrain.org>
+     *
+     * @param string $field field name
+     * @return bool
+     */
+    function deleteField($field) {
+        if(strtolower(substr($field,0,5)) == 'iptc.'){
+            return $this->deleteIPTCField(substr($field,5));
+        }elseif(strtolower(substr($field,0,5)) == 'exif.'){
+            return $this->deleteExifField(substr($field,5));
+        }else{
+            return $this->deleteExifField($field);
+        }
+    }
+
+    /**
+     * Return a date field
+     *
+     * @author Andreas Gohr <andi@splitbrain.org>
+     *
+     * @param string $field
+     * @return false|string
+     */
+    function getDateField($field) {
+        if (!isset($this->_info['dates'])) {
+            $this->_info['dates'] = $this->getDates();
+        }
+
+        if (isset($this->_info['dates'][$field])) {
+            return $this->_info['dates'][$field];
+        }
+
+        return false;
+    }
+
+    /**
+     * Return a file info field
+     *
+     * @author Andreas Gohr <andi@splitbrain.org>
+     *
+     * @param string $field field name
+     * @return false|string
+     */
+    function getFileField($field) {
+        if (!isset($this->_info['file'])) {
+            $this->_parseFileInfo();
+        }
+
+        if (isset($this->_info['file'][$field])) {
+            return $this->_info['file'][$field];
+        }
+
+        return false;
+    }
+
+    /**
+     * Return the camera info (Maker and Model)
+     *
+     * @author Andreas Gohr <andi@splitbrain.org>
+     * @todo   handle makernotes
+     *
+     * @return false|string
+     */
+    function getCamera(){
+        $make  = $this->getField(array('Exif.Make','Exif.TIFFMake'));
+        $model = $this->getField(array('Exif.Model','Exif.TIFFModel'));
+        $cam = trim("$make $model");
+        if(empty($cam)) return false;
+        return $cam;
+    }
+
+    /**
+     * Return shutter speed as a ratio
+     *
+     * @author Joe Lapp <joe.lapp@pobox.com>
+     *
+     * @return string
+     */
+    function getShutterSpeed() {
+        if (!isset($this->_info['exif'])) {
+            $this->_parseMarkerExif();
+        }
+        if(!isset($this->_info['exif']['ExposureTime'])){
+            return '';
+        }
+
+        $field = $this->_info['exif']['ExposureTime'];
+        if($field['den'] == 1) return $field['num'];
+        return $field['num'].'/'.$field['den'];
+    }
+
+    /**
+     * Return an EXIF field
+     *
+     * @author Sebastian Delmont <sdelmont@zonageek.com>
+     *
+     * @param string $field field name
+     * @return false|string
+     */
+    function getExifField($field) {
+        if (!isset($this->_info['exif'])) {
+            $this->_parseMarkerExif();
+        }
+
+        if ($this->_markers == null) {
+            return false;
+        }
+
+        if (isset($this->_info['exif'][$field])) {
+            return $this->_info['exif'][$field];
+        }
+
+        return false;
+    }
+
+    /**
+     * Return an XMP field
+     *
+     * @author Hakan Sandell <hakan.sandell@mydata.se>
+     *
+     * @param string $field field name
+     * @return false|string
+     */
+    function getXmpField($field) {
+        if (!isset($this->_info['xmp'])) {
+            $this->_parseMarkerXmp();
+        }
+
+        if ($this->_markers == null) {
+            return false;
+        }
+
+        if (isset($this->_info['xmp'][$field])) {
+            return $this->_info['xmp'][$field];
+        }
+
+        return false;
+    }
+
+    /**
+     * Return an Adobe Field
+     *
+     * @author Sebastian Delmont <sdelmont@zonageek.com>
+     *
+     * @param string $field field name
+     * @return false|string
+     */
+    function getAdobeField($field) {
+        if (!isset($this->_info['adobe'])) {
+            $this->_parseMarkerAdobe();
+        }
+
+        if ($this->_markers == null) {
+            return false;
+        }
+
+        if (isset($this->_info['adobe'][$field])) {
+            return $this->_info['adobe'][$field];
+        }
+
+        return false;
+    }
+
+    /**
+     * Return an IPTC field
+     *
+     * @author Sebastian Delmont <sdelmont@zonageek.com>
+     *
+     * @param string $field field name
+     * @return false|string
+     */
+    function getIPTCField($field) {
+        if (!isset($this->_info['iptc'])) {
+            $this->_parseMarkerAdobe();
+        }
+
+        if ($this->_markers == null) {
+            return false;
+        }
+
+        if (isset($this->_info['iptc'][$field])) {
+            return $this->_info['iptc'][$field];
+        }
+
+        return false;
+    }
+
+    /**
+     * Set an EXIF field
+     *
+     * @author Sebastian Delmont <sdelmont@zonageek.com>
+     * @author Joe Lapp <joe.lapp@pobox.com>
+     *
+     * @param string $field field name
+     * @param string $value
+     * @return bool
+     */
+    function setExifField($field, $value) {
+        if (!isset($this->_info['exif'])) {
+            $this->_parseMarkerExif();
+        }
+
+        if ($this->_markers == null) {
+            return false;
+        }
+
+        if ($this->_info['exif'] == false) {
+            $this->_info['exif'] = array();
+        }
+
+        // make sure datetimes are in correct format
+        if(strlen($field) >= 8 && strtolower(substr($field, 0, 8)) == 'datetime') {
+            if(strlen($value) < 8 || $value{4} != ':' || $value{7} != ':') {
+                $value = date('Y:m:d H:i:s', strtotime($value));
+            }
+        }
+
+        $this->_info['exif'][$field] = $value;
+
+        return true;
+    }
+
+    /**
+     * Set an Adobe Field
+     *
+     * @author Sebastian Delmont <sdelmont@zonageek.com>
+     *
+     * @param string $field field name
+     * @param string $value
+     * @return bool
+     */
+    function setAdobeField($field, $value) {
+        if (!isset($this->_info['adobe'])) {
+            $this->_parseMarkerAdobe();
+        }
+
+        if ($this->_markers == null) {
+            return false;
+        }
+
+        if ($this->_info['adobe'] == false) {
+            $this->_info['adobe'] = array();
+        }
+
+        $this->_info['adobe'][$field] = $value;
+
+        return true;
+    }
+
+    /**
+     * Calculates the multiplier needed to resize the image to the given
+     * dimensions
+     *
+     * @author Andreas Gohr <andi@splitbrain.org>
+     *
+     * @param int $maxwidth
+     * @param int $maxheight
+     * @return float|int
+     */
+    function getResizeRatio($maxwidth,$maxheight=0){
+        if(!$maxheight) $maxheight = $maxwidth;
+
+        $w = $this->getField('File.Width');
+        $h = $this->getField('File.Height');
+
+        $ratio = 1;
+        if($w >= $h){
+            if($w >= $maxwidth){
+                $ratio = $maxwidth/$w;
+            }elseif($h > $maxheight){
+                $ratio = $maxheight/$h;
+            }
+        }else{
+            if($h >= $maxheight){
+                $ratio = $maxheight/$h;
+            }elseif($w > $maxwidth){
+                $ratio = $maxwidth/$w;
+            }
+        }
+        return $ratio;
+    }
+
+
+    /**
+     * Set an IPTC field
+     *
+     * @author Sebastian Delmont <sdelmont@zonageek.com>
+     *
+     * @param string $field field name
+     * @param string $value
+     * @return bool
+     */
+    function setIPTCField($field, $value) {
+        if (!isset($this->_info['iptc'])) {
+            $this->_parseMarkerAdobe();
+        }
+
+        if ($this->_markers == null) {
+            return false;
+        }
+
+        if ($this->_info['iptc'] == false) {
+            $this->_info['iptc'] = array();
+        }
+
+        $this->_info['iptc'][$field] = $value;
+
+        return true;
+    }
+
+    /**
+     * Delete an EXIF field
+     *
+     * @author Sebastian Delmont <sdelmont@zonageek.com>
+     *
+     * @param string $field field name
+     * @return bool
+     */
+    function deleteExifField($field) {
+        if (!isset($this->_info['exif'])) {
+            $this->_parseMarkerAdobe();
+        }
+
+        if ($this->_markers == null) {
+            return false;
+        }
+
+        if ($this->_info['exif'] != false) {
+            unset($this->_info['exif'][$field]);
+        }
+
+        return true;
+    }
+
+    /**
+     * Delete an Adobe field
+     *
+     * @author Sebastian Delmont <sdelmont@zonageek.com>
+     *
+     * @param string $field field name
+     * @return bool
+     */
+    function deleteAdobeField($field) {
+        if (!isset($this->_info['adobe'])) {
+            $this->_parseMarkerAdobe();
+        }
+
+        if ($this->_markers == null) {
+            return false;
+        }
+
+        if ($this->_info['adobe'] != false) {
+            unset($this->_info['adobe'][$field]);
+        }
+
+        return true;
+    }
+
+    /**
+     * Delete an IPTC field
+     *
+     * @author Sebastian Delmont <sdelmont@zonageek.com>
+     *
+     * @param string $field field name
+     * @return bool
+     */
+    function deleteIPTCField($field) {
+        if (!isset($this->_info['iptc'])) {
+            $this->_parseMarkerAdobe();
+        }
+
+        if ($this->_markers == null) {
+            return false;
+        }
+
+        if ($this->_info['iptc'] != false) {
+            unset($this->_info['iptc'][$field]);
+        }
+
+        return true;
+    }
+
+    /**
+     * Get the image's title, tries various fields
+     *
+     * @param int $max maximum number chars (keeps words)
+     * @return false|string
+     *
+     * @author Andreas Gohr <andi@splitbrain.org>
+     */
+    function getTitle($max=80){
+        // try various fields
+        $cap = $this->getField(array('Iptc.Headline',
+                    'Iptc.Caption',
+                    'Xmp.dc:title',
+                    'Exif.UserComment',
+                    'Exif.TIFFUserComment',
+                    'Exif.TIFFImageDescription',
+                    'File.Name'));
+        if (empty($cap)) return false;
+
+        if(!$max) return $cap;
+        // Shorten to 80 chars (keeping words)
+        $new = preg_replace('/\n.+$/','',wordwrap($cap, $max));
+        if($new != $cap) $new .= '...';
+
+        return $new;
+    }
+
+    /**
+     * Gather various date fields
+     *
+     * @author Sebastian Delmont <sdelmont@zonageek.com>
+     *
+     * @return array|bool
+     */
+    function getDates() {
+        $this->_parseAll();
+        if ($this->_markers == null) {
+            if (@isset($this->_info['file']['UnixTime'])) {
+                $dates = array();
+                $dates['FileModified'] = $this->_info['file']['UnixTime'];
+                $dates['Time'] = $this->_info['file']['UnixTime'];
+                $dates['TimeSource'] = 'FileModified';
+                $dates['TimeStr'] = date("Y-m-d H:i:s", $this->_info['file']['UnixTime']);
+                $dates['EarliestTime'] = $this->_info['file']['UnixTime'];
+                $dates['EarliestTimeSource'] = 'FileModified';
+                $dates['EarliestTimeStr'] = date("Y-m-d H:i:s", $this->_info['file']['UnixTime']);
+                $dates['LatestTime'] = $this->_info['file']['UnixTime'];
+                $dates['LatestTimeSource'] = 'FileModified';
+                $dates['LatestTimeStr'] = date("Y-m-d H:i:s", $this->_info['file']['UnixTime']);
+                return $dates;
+            }
+            return false;
+        }
+
+        $dates = array();
+
+        $latestTime = 0;
+        $latestTimeSource = "";
+        $earliestTime = time();
+        $earliestTimeSource = "";
+
+        if (@isset($this->_info['exif']['DateTime'])) {
+            $dates['ExifDateTime'] = $this->_info['exif']['DateTime'];
+
+            $aux = $this->_info['exif']['DateTime'];
+            $aux{4} = "-";
+            $aux{7} = "-";
+            $t = strtotime($aux);
+
+            if ($t && $t > $latestTime) {
+                $latestTime = $t;
+                $latestTimeSource = "ExifDateTime";
+            }
+
+            if ($t && $t < $earliestTime) {
+                $earliestTime = $t;
+                $earliestTimeSource = "ExifDateTime";
+            }
+        }
+
+        if (@isset($this->_info['exif']['DateTimeOriginal'])) {
+            $dates['ExifDateTimeOriginal'] = $this->_info['exif']['DateTime'];
+
+            $aux = $this->_info['exif']['DateTimeOriginal'];
+            $aux{4} = "-";
+            $aux{7} = "-";
+            $t = strtotime($aux);
+
+            if ($t && $t > $latestTime) {
+                $latestTime = $t;
+                $latestTimeSource = "ExifDateTimeOriginal";
+            }
+
+            if ($t && $t < $earliestTime) {
+                $earliestTime = $t;
+                $earliestTimeSource = "ExifDateTimeOriginal";
+            }
+        }
+
+        if (@isset($this->_info['exif']['DateTimeDigitized'])) {
+            $dates['ExifDateTimeDigitized'] = $this->_info['exif']['DateTime'];
+
+            $aux = $this->_info['exif']['DateTimeDigitized'];
+            $aux{4} = "-";
+            $aux{7} = "-";
+            $t = strtotime($aux);
+
+            if ($t && $t > $latestTime) {
+                $latestTime = $t;
+                $latestTimeSource = "ExifDateTimeDigitized";
+            }
+
+            if ($t && $t < $earliestTime) {
+                $earliestTime = $t;
+                $earliestTimeSource = "ExifDateTimeDigitized";
+            }
+        }
+
+        if (@isset($this->_info['iptc']['DateCreated'])) {
+            $dates['IPTCDateCreated'] = $this->_info['iptc']['DateCreated'];
+
+            $aux = $this->_info['iptc']['DateCreated'];
+            $aux = substr($aux, 0, 4) . "-" . substr($aux, 4, 2) . "-" . substr($aux, 6, 2);
+            $t = strtotime($aux);
+
+            if ($t && $t > $latestTime) {
+                $latestTime = $t;
+                $latestTimeSource = "IPTCDateCreated";
+            }
+
+            if ($t && $t < $earliestTime) {
+                $earliestTime = $t;
+                $earliestTimeSource = "IPTCDateCreated";
+            }
+        }
+
+        if (@isset($this->_info['file']['UnixTime'])) {
+            $dates['FileModified'] = $this->_info['file']['UnixTime'];
+
+            $t = $this->_info['file']['UnixTime'];
+
+            if ($t && $t > $latestTime) {
+                $latestTime = $t;
+                $latestTimeSource = "FileModified";
+            }
+
+            if ($t && $t < $earliestTime) {
+                $earliestTime = $t;
+                $earliestTimeSource = "FileModified";
+            }
+        }
+
+        $dates['Time'] = $earliestTime;
+        $dates['TimeSource'] = $earliestTimeSource;
+        $dates['TimeStr'] = date("Y-m-d H:i:s", $earliestTime);
+        $dates['EarliestTime'] = $earliestTime;
+        $dates['EarliestTimeSource'] = $earliestTimeSource;
+        $dates['EarliestTimeStr'] = date("Y-m-d H:i:s", $earliestTime);
+        $dates['LatestTime'] = $latestTime;
+        $dates['LatestTimeSource'] = $latestTimeSource;
+        $dates['LatestTimeStr'] = date("Y-m-d H:i:s", $latestTime);
+
+        return $dates;
+    }
+
+    /**
+     * Get the image width, tries various fields
+     *
+     * @author Sebastian Delmont <sdelmont@zonageek.com>
+     *
+     * @return false|string
+     */
+    function getWidth() {
+        if (!isset($this->_info['sof'])) {
+            $this->_parseMarkerSOF();
+        }
+
+        if ($this->_markers == null) {
+            return false;
+        }
+
+        if (isset($this->_info['sof']['ImageWidth'])) {
+            return $this->_info['sof']['ImageWidth'];
+        }
+
+        if (!isset($this->_info['exif'])) {
+            $this->_parseMarkerExif();
+        }
+
+        if (isset($this->_info['exif']['PixelXDimension'])) {
+            return $this->_info['exif']['PixelXDimension'];
+        }
+
+        return false;
+    }
+
+    /**
+     * Get the image height, tries various fields
+     *
+     * @author Sebastian Delmont <sdelmont@zonageek.com>
+     *
+     * @return false|string
+     */
+    function getHeight() {
+        if (!isset($this->_info['sof'])) {
+            $this->_parseMarkerSOF();
+        }
+
+        if ($this->_markers == null) {
+            return false;
+        }
+
+        if (isset($this->_info['sof']['ImageHeight'])) {
+            return $this->_info['sof']['ImageHeight'];
+        }
+
+        if (!isset($this->_info['exif'])) {
+            $this->_parseMarkerExif();
+        }
+
+        if (isset($this->_info['exif']['PixelYDimension'])) {
+            return $this->_info['exif']['PixelYDimension'];
+        }
+
+        return false;
+    }
+
+    /**
+     * Get an dimension string for use in img tag
+     *
+     * @author Sebastian Delmont <sdelmont@zonageek.com>
+     *
+     * @return false|string
+     */
+    function getDimStr() {
+        if ($this->_markers == null) {
+            return false;
+        }
+
+        $w = $this->getWidth();
+        $h = $this->getHeight();
+
+        return "width='" . $w . "' height='" . $h . "'";
+    }
+
+    /**
+     * Checks for an embedded thumbnail
+     *
+     * @author Sebastian Delmont <sdelmont@zonageek.com>
+     *
+     * @param string $which possible values: 'any', 'exif' or 'adobe'
+     * @return false|string
+     */
+    function hasThumbnail($which = 'any') {
+        if (($which == 'any') || ($which == 'exif')) {
+            if (!isset($this->_info['exif'])) {
+                $this->_parseMarkerExif();
+            }
+
+            if ($this->_markers == null) {
+                return false;
+            }
+
+            if (isset($this->_info['exif']) && is_array($this->_info['exif'])) {
+                if (isset($this->_info['exif']['JFIFThumbnail'])) {
+                    return 'exif';
+                }
+            }
+        }
+
+        if ($which == 'adobe') {
+            if (!isset($this->_info['adobe'])) {
+                $this->_parseMarkerAdobe();
+            }
+
+            if ($this->_markers == null) {
+                return false;
+            }
+
+            if (isset($this->_info['adobe']) && is_array($this->_info['adobe'])) {
+                if (isset($this->_info['adobe']['ThumbnailData'])) {
+                    return 'exif';
+                }
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * Send embedded thumbnail to browser
+     *
+     * @author Sebastian Delmont <sdelmont@zonageek.com>
+     *
+     * @param string $which possible values: 'any', 'exif' or 'adobe'
+     * @return bool
+     */
+    function sendThumbnail($which = 'any') {
+        $data = null;
+
+        if (($which == 'any') || ($which == 'exif')) {
+            if (!isset($this->_info['exif'])) {
+                $this->_parseMarkerExif();
+            }
+
+            if ($this->_markers == null) {
+                return false;
+            }
+
+            if (isset($this->_info['exif']) && is_array($this->_info['exif'])) {
+                if (isset($this->_info['exif']['JFIFThumbnail'])) {
+                    $data =& $this->_info['exif']['JFIFThumbnail'];
+                }
+            }
+        }
+
+        if (($which == 'adobe') || ($data == null)){
+            if (!isset($this->_info['adobe'])) {
+                $this->_parseMarkerAdobe();
+            }
+
+            if ($this->_markers == null) {
+                return false;
+            }
+
+            if (isset($this->_info['adobe']) && is_array($this->_info['adobe'])) {
+                if (isset($this->_info['adobe']['ThumbnailData'])) {
+                    $data =& $this->_info['adobe']['ThumbnailData'];
+                }
+            }
+        }
+
+        if ($data != null) {
+            header("Content-type: image/jpeg");
+            echo $data;
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * Save changed Metadata
+     *
+     * @author Sebastian Delmont <sdelmont@zonageek.com>
+     * @author Andreas Gohr <andi@splitbrain.org>
+     *
+     * @param string $fileName file name or empty string for a random name
+     * @return bool
+     */
+    function save($fileName = "") {
+        if ($fileName == "") {
+            $tmpName = tempnam(dirname($this->_fileName),'_metatemp_');
+            $this->_writeJPEG($tmpName);
+            if (file_exists($tmpName)) {
+                return io_rename($tmpName, $this->_fileName);
+            }
+        } else {
+            return $this->_writeJPEG($fileName);
+        }
+        return false;
+    }
+
+    /*************************************************************/
+    /* PRIVATE FUNCTIONS (Internal Use Only!)                    */
+    /*************************************************************/
+
+    /*************************************************************/
+    function _dispose($fileName = "") {
+        $this->_fileName = $fileName;
+
+        $this->_fp = null;
+        $this->_type = 'unknown';
+
+        unset($this->_markers);
+        unset($this->_info);
+    }
+
+    /*************************************************************/
+    function _readJPEG() {
+        unset($this->_markers);
+        //unset($this->_info);
+        $this->_markers = array();
+        //$this->_info = array();
+
+        $this->_fp = @fopen($this->_fileName, 'rb');
+        if ($this->_fp) {
+            if (file_exists($this->_fileName)) {
+                $this->_type = 'file';
+            }
+            else {
+                $this->_type = 'url';
+            }
+        } else {
+            $this->_fp = null;
+            return false;  // ERROR: Can't open file
+        }
+
+        // Check for the JPEG signature
+        $c1 = ord(fgetc($this->_fp));
+        $c2 = ord(fgetc($this->_fp));
+
+        if ($c1 != 0xFF || $c2 != 0xD8) {   // (0xFF + SOI)
+            $this->_markers = null;
+            return false;  // ERROR: File is not a JPEG
+        }
+
+        $count = 0;
+
+        $done = false;
+        $ok = true;
+
+        while (!$done) {
+            $capture = false;
+
+            // First, skip any non 0xFF bytes
+            $discarded = 0;
+            $c = ord(fgetc($this->_fp));
+            while (!feof($this->_fp) && ($c != 0xFF)) {
+                $discarded++;
+                $c = ord(fgetc($this->_fp));
+            }
+            // Then skip all 0xFF until the marker byte
+            do {
+                $marker = ord(fgetc($this->_fp));
+            } while (!feof($this->_fp) && ($marker == 0xFF));
+
+            if (feof($this->_fp)) {
+                return false; // ERROR: Unexpected EOF
+            }
+            if ($discarded != 0) {
+                return false; // ERROR: Extraneous data
+            }
+
+            $length = ord(fgetc($this->_fp)) * 256 + ord(fgetc($this->_fp));
+            if (feof($this->_fp)) {
+                return false; // ERROR: Unexpected EOF
+            }
+            if ($length < 2) {
+                return false; // ERROR: Extraneous data
+            }
+            $length = $length - 2; // The length we got counts itself
+
+            switch ($marker) {
+                case 0xC0:    // SOF0
+                case 0xC1:    // SOF1
+                case 0xC2:    // SOF2
+                case 0xC9:    // SOF9
+                case 0xE0:    // APP0: JFIF data
+                case 0xE1:    // APP1: EXIF or XMP data
+                case 0xED:    // APP13: IPTC / Photoshop data
+                    $capture = true;
+                    break;
+                case 0xDA:    // SOS: Start of scan... the image itself and the last block on the file
+                    $capture = false;
+                    $length = -1;  // This field has no length... it includes all data until EOF
+                    $done = true;
+                    break;
+                default:
+                    $capture = true;//false;
+                    break;
+            }
+
+            $this->_markers[$count] = array();
+            $this->_markers[$count]['marker'] = $marker;
+            $this->_markers[$count]['length'] = $length;
+
+            if ($capture) {
+                if ($length)
+                    $this->_markers[$count]['data'] = fread($this->_fp, $length);
+                else
+                    $this->_markers[$count]['data'] = "";
+            }
+            elseif (!$done) {
+                $result = @fseek($this->_fp, $length, SEEK_CUR);
+                // fseek doesn't seem to like HTTP 'files', but fgetc has no problem
+                if (!($result === 0)) {
+                    for ($i = 0; $i < $length; $i++) {
+                        fgetc($this->_fp);
+                    }
+                }
+            }
+            $count++;
+        }
+
+        if ($this->_fp) {
+            fclose($this->_fp);
+            $this->_fp = null;
+        }
+
+        return $ok;
+    }
+
+    /*************************************************************/
+    function _parseAll() {
+        if (!isset($this->_info['file'])) {
+            $this->_parseFileInfo();
+        }
+        if (!isset($this->_markers)) {
+            $this->_readJPEG();
+        }
+
+        if ($this->_markers == null) {
+            return false;
+        }
+
+        if (!isset($this->_info['jfif'])) {
+            $this->_parseMarkerJFIF();
+        }
+        if (!isset($this->_info['jpeg'])) {
+            $this->_parseMarkerSOF();
+        }
+        if (!isset($this->_info['exif'])) {
+            $this->_parseMarkerExif();
+        }
+        if (!isset($this->_info['xmp'])) {
+            $this->_parseMarkerXmp();
+        }
+        if (!isset($this->_info['adobe'])) {
+            $this->_parseMarkerAdobe();
+        }
+    }
+
+    /*************************************************************/
+
+    /**
+     * @param string $outputName
+     *
+     * @return bool
+     */
+    function _writeJPEG($outputName) {
+        $this->_parseAll();
+
+        $wroteEXIF = false;
+        $wroteAdobe = false;
+
+        $this->_fp = @fopen($this->_fileName, 'r');
+        if ($this->_fp) {
+            if (file_exists($this->_fileName)) {
+                $this->_type = 'file';
+            }
+            else {
+                $this->_type = 'url';
+            }
+        } else {
+            $this->_fp = null;
+            return false;  // ERROR: Can't open file
+        }
+
+        $this->_fpout = fopen($outputName, 'wb');
+        if (!$this->_fpout) {
+            $this->_fpout = null;
+            fclose($this->_fp);
+            $this->_fp = null;
+            return false;  // ERROR: Can't open output file
+        }
+
+        // Check for the JPEG signature
+        $c1 = ord(fgetc($this->_fp));
+        $c2 = ord(fgetc($this->_fp));
+
+        if ($c1 != 0xFF || $c2 != 0xD8) {   // (0xFF + SOI)
+            return false;  // ERROR: File is not a JPEG
+        }
+
+        fputs($this->_fpout, chr(0xFF), 1);
+        fputs($this->_fpout, chr(0xD8), 1); // (0xFF + SOI)
+
+        $count = 0;
+
+        $done = false;
+        $ok = true;
+
+        while (!$done) {
+            // First, skip any non 0xFF bytes
+            $discarded = 0;
+            $c = ord(fgetc($this->_fp));
+            while (!feof($this->_fp) && ($c != 0xFF)) {
+                $discarded++;
+                $c = ord(fgetc($this->_fp));
+            }
+            // Then skip all 0xFF until the marker byte
+            do {
+                $marker = ord(fgetc($this->_fp));
+            } while (!feof($this->_fp) && ($marker == 0xFF));
+
+            if (feof($this->_fp)) {
+                $ok = false;
+                break; // ERROR: Unexpected EOF
+            }
+            if ($discarded != 0) {
+                $ok = false;
+                break; // ERROR: Extraneous data
+            }
+
+            $length = ord(fgetc($this->_fp)) * 256 + ord(fgetc($this->_fp));
+            if (feof($this->_fp)) {
+                $ok = false;
+                break; // ERROR: Unexpected EOF
+            }
+            if ($length < 2) {
+                $ok = false;
+                break; // ERROR: Extraneous data
+            }
+            $length = $length - 2; // The length we got counts itself
+
+            unset($data);
+            if ($marker == 0xE1) { // APP1: EXIF data
+                $data =& $this->_createMarkerEXIF();
+                $wroteEXIF = true;
+            }
+            elseif ($marker == 0xED) { // APP13: IPTC / Photoshop data
+                $data =& $this->_createMarkerAdobe();
+                $wroteAdobe = true;
+            }
+            elseif ($marker == 0xDA) { // SOS: Start of scan... the image itself and the last block on the file
+                $done = true;
+            }
+
+            if (!$wroteEXIF && (($marker < 0xE0) || ($marker > 0xEF))) {
+                if (isset($this->_info['exif']) && is_array($this->_info['exif'])) {
+                    $exif =& $this->_createMarkerEXIF();
+                    $this->_writeJPEGMarker(0xE1, strlen($exif), $exif, 0);
+                    unset($exif);
+                }
+                $wroteEXIF = true;
+            }
+
+            if (!$wroteAdobe && (($marker < 0xE0) || ($marker > 0xEF))) {
+                if ((isset($this->_info['adobe']) && is_array($this->_info['adobe']))
+                        || (isset($this->_info['iptc']) && is_array($this->_info['iptc']))) {
+                    $adobe =& $this->_createMarkerAdobe();
+                    $this->_writeJPEGMarker(0xED, strlen($adobe), $adobe, 0);
+                    unset($adobe);
+                }
+                $wroteAdobe = true;
+            }
+
+            $origLength = $length;
+            if (isset($data)) {
+                $length = strlen($data);
+            }
+
+            if ($marker != -1) {
+                $this->_writeJPEGMarker($marker, $length, $data, $origLength);
+            }
+        }
+
+        if ($this->_fp) {
+            fclose($this->_fp);
+            $this->_fp = null;
+        }
+
+        if ($this->_fpout) {
+            fclose($this->_fpout);
+            $this->_fpout = null;
+        }
+
+        return $ok;
+    }
+
+    /*************************************************************/
+
+    /**
+     * @param integer $marker
+     * @param integer $length
+     * @param string $data
+     * @param integer $origLength
+     *
+     * @return bool
+     */
+    function _writeJPEGMarker($marker, $length, &$data, $origLength) {
+        if ($length <= 0) {
+            return false;
+        }
+
+        fputs($this->_fpout, chr(0xFF), 1);
+        fputs($this->_fpout, chr($marker), 1);
+        fputs($this->_fpout, chr((($length + 2) & 0x0000FF00) >> 8), 1);
+        fputs($this->_fpout, chr((($length + 2) & 0x000000FF) >> 0), 1);
+
+        if (isset($data)) {
+            // Copy the generated data
+            fputs($this->_fpout, $data, $length);
+
+            if ($origLength > 0) {   // Skip the original data
+                $result = @fseek($this->_fp, $origLength, SEEK_CUR);
+                // fseek doesn't seem to like HTTP 'files', but fgetc has no problem
+                if ($result != 0) {
+                    for ($i = 0; $i < $origLength; $i++) {
+                        fgetc($this->_fp);
+                    }
+                }
+            }
+        } else {
+            if ($marker == 0xDA) {  // Copy until EOF
+                while (!feof($this->_fp)) {
+                    $data = fread($this->_fp, 1024 * 16);
+                    fputs($this->_fpout, $data, strlen($data));
+                }
+            } else { // Copy only $length bytes
+                $data = @fread($this->_fp, $length);
+                fputs($this->_fpout, $data, $length);
+            }
+        }
+
+        return true;
+    }
+
+    /**
+     * Gets basic info from the file - should work with non-JPEGs
+     *
+     * @author  Sebastian Delmont <sdelmont@zonageek.com>
+     * @author  Andreas Gohr <andi@splitbrain.org>
+     */
+    function _parseFileInfo() {
+        if (file_exists($this->_fileName) && is_file($this->_fileName)) {
+            $this->_info['file'] = array();
+            $this->_info['file']['Name'] = utf8_decodeFN(utf8_basename($this->_fileName));
+            $this->_info['file']['Path'] = fullpath($this->_fileName);
+            $this->_info['file']['Size'] = filesize($this->_fileName);
+            if ($this->_info['file']['Size'] < 1024) {
+                $this->_info['file']['NiceSize'] = $this->_info['file']['Size'] . 'B';
+            } elseif ($this->_info['file']['Size'] < (1024 * 1024)) {
+                $this->_info['file']['NiceSize'] = round($this->_info['file']['Size'] / 1024) . 'KB';
+            } elseif ($this->_info['file']['Size'] < (1024 * 1024 * 1024)) {
+                $this->_info['file']['NiceSize'] = round($this->_info['file']['Size'] / (1024*1024)) . 'MB';
+            } else {
+                $this->_info['file']['NiceSize'] = $this->_info['file']['Size'] . 'B';
+            }
+            $this->_info['file']['UnixTime'] = filemtime($this->_fileName);
+
+            // get image size directly from file
+            $size = getimagesize($this->_fileName);
+            $this->_info['file']['Width']  = $size[0];
+            $this->_info['file']['Height'] = $size[1];
+            // set mime types and formats
+            // http://php.net/manual/en/function.getimagesize.php
+            // http://php.net/manual/en/function.image-type-to-mime-type.php
+            switch ($size[2]){
+                case 1:
+                    $this->_info['file']['Mime']   = 'image/gif';
+                    $this->_info['file']['Format'] = 'GIF';
+                    break;
+                case 2:
+                    $this->_info['file']['Mime']   = 'image/jpeg';
+                    $this->_info['file']['Format'] = 'JPEG';
+                    break;
+                case 3:
+                    $this->_info['file']['Mime']   = 'image/png';
+                    $this->_info['file']['Format'] = 'PNG';
+                    break;
+                case 4:
+                    $this->_info['file']['Mime']   = 'application/x-shockwave-flash';
+                    $this->_info['file']['Format'] = 'SWF';
+                    break;
+                case 5:
+                    $this->_info['file']['Mime']   = 'image/psd';
+                    $this->_info['file']['Format'] = 'PSD';
+                    break;
+                case 6:
+                    $this->_info['file']['Mime']   = 'image/bmp';
+                    $this->_info['file']['Format'] = 'BMP';
+                    break;
+                case 7:
+                    $this->_info['file']['Mime']   = 'image/tiff';
+                    $this->_info['file']['Format'] = 'TIFF (Intel)';
+                    break;
+                case 8:
+                    $this->_info['file']['Mime']   = 'image/tiff';
+                    $this->_info['file']['Format'] = 'TIFF (Motorola)';
+                    break;
+                case 9:
+                    $this->_info['file']['Mime']   = 'application/octet-stream';
+                    $this->_info['file']['Format'] = 'JPC';
+                    break;
+                case 10:
+                    $this->_info['file']['Mime']   = 'image/jp2';
+                    $this->_info['file']['Format'] = 'JP2';
+                    break;
+                case 11:
+                    $this->_info['file']['Mime']   = 'application/octet-stream';
+                    $this->_info['file']['Format'] = 'JPX';
+                    break;
+                case 12:
+                    $this->_info['file']['Mime']   = 'application/octet-stream';
+                    $this->_info['file']['Format'] = 'JB2';
+                    break;
+                case 13:
+                    $this->_info['file']['Mime']   = 'application/x-shockwave-flash';
+                    $this->_info['file']['Format'] = 'SWC';
+                    break;
+                case 14:
+                    $this->_info['file']['Mime']   = 'image/iff';
+                    $this->_info['file']['Format'] = 'IFF';
+                    break;
+                case 15:
+                    $this->_info['file']['Mime']   = 'image/vnd.wap.wbmp';
+                    $this->_info['file']['Format'] = 'WBMP';
+                    break;
+                case 16:
+                    $this->_info['file']['Mime']   = 'image/xbm';
+                    $this->_info['file']['Format'] = 'XBM';
+                    break;
+                default:
+                    $this->_info['file']['Mime']   = 'image/unknown';
+            }
+        } else {
+            $this->_info['file'] = array();
+            $this->_info['file']['Name'] = utf8_basename($this->_fileName);
+            $this->_info['file']['Url'] = $this->_fileName;
+        }
+
+        return true;
+    }
+
+    /*************************************************************/
+    function _parseMarkerJFIF() {
+        if (!isset($this->_markers)) {
+            $this->_readJPEG();
+        }
+
+        if ($this->_markers == null) {
+            return false;
+        }
+
+        $data = null;
+        $count = count($this->_markers);
+        for ($i = 0; $i < $count; $i++) {
+            if ($this->_markers[$i]['marker'] == 0xE0) {
+                $signature = $this->_getFixedString($this->_markers[$i]['data'], 0, 4);
+                if ($signature == 'JFIF') {
+                    $data =& $this->_markers[$i]['data'];
+                    break;
+                }
+            }
+        }
+
+        if ($data == null) {
+            $this->_info['jfif'] = false;
+            return false;
+        }
+
+        $this->_info['jfif'] = array();
+
+        $vmaj = $this->_getByte($data, 5);
+        $vmin = $this->_getByte($data, 6);
+
+        $this->_info['jfif']['Version'] = sprintf('%d.%02d', $vmaj, $vmin);
+
+        $units = $this->_getByte($data, 7);
+        switch ($units) {
+            case 0:
+                $this->_info['jfif']['Units'] = 'pixels';
+                break;
+            case 1:
+                $this->_info['jfif']['Units'] = 'dpi';
+                break;
+            case 2:
+                $this->_info['jfif']['Units'] = 'dpcm';
+                break;
+            default:
+                $this->_info['jfif']['Units'] = 'unknown';
+                break;
+        }
+
+        $xdens = $this->_getShort($data, 8);
+        $ydens = $this->_getShort($data, 10);
+
+        $this->_info['jfif']['XDensity'] = $xdens;
+        $this->_info['jfif']['YDensity'] = $ydens;
+
+        $thumbx = $this->_getByte($data, 12);
+        $thumby = $this->_getByte($data, 13);
+
+        $this->_info['jfif']['ThumbnailWidth'] = $thumbx;
+        $this->_info['jfif']['ThumbnailHeight'] = $thumby;
+
+        return true;
+    }
+
+    /*************************************************************/
+    function _parseMarkerSOF() {
+        if (!isset($this->_markers)) {
+            $this->_readJPEG();
+        }
+
+        if ($this->_markers == null) {
+            return false;
+        }
+
+        $data = null;
+        $count = count($this->_markers);
+        for ($i = 0; $i < $count; $i++) {
+            switch ($this->_markers[$i]['marker']) {
+                case 0xC0: // SOF0
+                case 0xC1: // SOF1
+                case 0xC2: // SOF2
+                case 0xC9: // SOF9
+                    $data =& $this->_markers[$i]['data'];
+                    $marker = $this->_markers[$i]['marker'];
+                    break;
+            }
+        }
+
+        if ($data == null) {
+            $this->_info['sof'] = false;
+            return false;
+        }
+
+        $pos = 0;
+        $this->_info['sof'] = array();
+
+        switch ($marker) {
+            case 0xC0: // SOF0
+                $format = 'Baseline';
+                break;
+            case 0xC1: // SOF1
+                $format = 'Progessive';
+                break;
+            case 0xC2: // SOF2
+                $format = 'Non-baseline';
+                break;
+            case 0xC9: // SOF9
+                $format = 'Arithmetic';
+                break;
+            default:
+                return false;
+        }
+
+        $this->_info['sof']['Format']          = $format;
+        $this->_info['sof']['SamplePrecision'] = $this->_getByte($data, $pos + 0);
+        $this->_info['sof']['ImageHeight']     = $this->_getShort($data, $pos + 1);
+        $this->_info['sof']['ImageWidth']      = $this->_getShort($data, $pos + 3);
+        $this->_info['sof']['ColorChannels']   = $this->_getByte($data, $pos + 5);
+
+        return true;
+    }
+
+    /**
+     * Parses the XMP data
+     *
+     * @author  Hakan Sandell <hakan.sandell@mydata.se>
+     */
+    function _parseMarkerXmp() {
+        if (!isset($this->_markers)) {
+            $this->_readJPEG();
+        }
+
+        if ($this->_markers == null) {
+            return false;
+        }
+
+        $data = null;
+        $count = count($this->_markers);
+        for ($i = 0; $i < $count; $i++) {
+            if ($this->_markers[$i]['marker'] == 0xE1) {
+                $signature = $this->_getFixedString($this->_markers[$i]['data'], 0, 29);
+                if ($signature == "http://ns.adobe.com/xap/1.0/\0") {
+                    $data = substr($this->_markers[$i]['data'], 29);
+                    break;
+                }
+            }
+        }
+
+        if ($data == null) {
+            $this->_info['xmp'] = false;
+            return false;
+        }
+
+        $parser = xml_parser_create();
+        xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
+        xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
+        $result = xml_parse_into_struct($parser, $data, $values, $tags);
+        xml_parser_free($parser);
+
+        if ($result == 0) {
+            $this->_info['xmp'] = false;
+            return false;
+        }
+
+        $this->_info['xmp'] = array();
+        $count = count($values);
+        for ($i = 0; $i < $count; $i++) {
+            if ($values[$i]['tag'] == 'rdf:Description' && $values[$i]['type'] == 'open') {
+
+                while ((++$i < $count) && ($values[$i]['tag'] != 'rdf:Description')) {
+                    $this->_parseXmpNode($values, $i, $this->_info['xmp'][$values[$i]['tag']], $count);
+                }
+            }
+        }
+        return true;
+    }
+
+    /**
+     * Parses XMP nodes by recursion
+     *
+     * @author  Hakan Sandell <hakan.sandell@mydata.se>
+     *
+     * @param array $values
+     * @param int $i
+     * @param mixed $meta
+     * @param integer $count
+     */
+    function _parseXmpNode($values, &$i, &$meta, $count) {
+        if ($values[$i]['type'] == 'close') return;
+
+        if ($values[$i]['type'] == 'complete') {
+            // Simple Type property
+            $meta = $values[$i]['value'];
+            return;
+        }
+
+        $i++;
+        if ($i >= $count) return;
+
+        if ($values[$i]['tag'] == 'rdf:Bag' || $values[$i]['tag'] == 'rdf:Seq') {
+            // Array property
+            $meta = array();
+            while ($values[++$i]['tag'] == 'rdf:li') {
+                $this->_parseXmpNode($values, $i, $meta[], $count);
+            }
+            $i++; // skip closing Bag/Seq tag
+
+        } elseif ($values[$i]['tag'] == 'rdf:Alt') {
+            // Language Alternative property, only the first (default) value is used
+            if ($values[$i]['type'] == 'open') {
+                $i++;
+                $this->_parseXmpNode($values, $i, $meta, $count);
+                while ((++$i < $count) && ($values[$i]['tag'] != 'rdf:Alt'));
+                $i++; // skip closing Alt tag
+            }
+
+        } else {
+            // Structure property
+            $meta = array();
+            $startTag = $values[$i-1]['tag'];
+            do {
+                $this->_parseXmpNode($values, $i, $meta[$values[$i]['tag']], $count);
+            } while ((++$i < $count) && ($values[$i]['tag'] != $startTag));
+        }
+    }
+
+    /*************************************************************/
+    function _parseMarkerExif() {
+        if (!isset($this->_markers)) {
+            $this->_readJPEG();
+        }
+
+        if ($this->_markers == null) {
+            return false;
+        }
+
+        $data = null;
+        $count = count($this->_markers);
+        for ($i = 0; $i < $count; $i++) {
+            if ($this->_markers[$i]['marker'] == 0xE1) {
+                $signature = $this->_getFixedString($this->_markers[$i]['data'], 0, 6);
+                if ($signature == "Exif\0\0") {
+                    $data =& $this->_markers[$i]['data'];
+                    break;
+                }
+            }
+        }
+
+        if ($data == null) {
+            $this->_info['exif'] = false;
+            return false;
+        }
+        $pos = 6;
+        $this->_info['exif'] = array();
+
+        // We don't increment $pos after this because Exif uses offsets relative to this point
+
+        $byteAlign = $this->_getShort($data, $pos + 0);
+
+        if ($byteAlign == 0x4949) { // "II"
+            $isBigEndian = false;
+        } elseif ($byteAlign == 0x4D4D) { // "MM"
+            $isBigEndian = true;
+        } else {
+            return false; // Unexpected data
+        }
+
+        $alignCheck = $this->_getShort($data, $pos + 2, $isBigEndian);
+        if ($alignCheck != 0x002A) // That's the expected value
+            return false; // Unexpected data
+
+        if ($isBigEndian) {
+            $this->_info['exif']['ByteAlign'] = "Big Endian";
+        } else {
+            $this->_info['exif']['ByteAlign'] = "Little Endian";
+        }
+
+        $offsetIFD0 = $this->_getLong($data, $pos + 4, $isBigEndian);
+        if ($offsetIFD0 < 8)
+            return false; // Unexpected data
+
+        $offsetIFD1 = $this->_readIFD($data, $pos, $offsetIFD0, $isBigEndian, 'ifd0');
+        if ($offsetIFD1 != 0)
+            $this->_readIFD($data, $pos, $offsetIFD1, $isBigEndian, 'ifd1');
+
+        return true;
+    }
+
+    /*************************************************************/
+
+    /**
+     * @param mixed $data
+     * @param integer $base
+     * @param integer $offset
+     * @param boolean $isBigEndian
+     * @param string $mode
+     *
+     * @return int
+     */
+    function _readIFD($data, $base, $offset, $isBigEndian, $mode) {
+        $EXIFTags = $this->_exifTagNames($mode);
+
+        $numEntries = $this->_getShort($data, $base + $offset, $isBigEndian);
+        $offset += 2;
+
+        $exifTIFFOffset = 0;
+        $exifTIFFLength = 0;
+        $exifThumbnailOffset = 0;
+        $exifThumbnailLength = 0;
+
+        for ($i = 0; $i < $numEntries; $i++) {
+            $tag = $this->_getShort($data, $base + $offset, $isBigEndian);
+            $offset += 2;
+            $type = $this->_getShort($data, $base + $offset, $isBigEndian);
+            $offset += 2;
+            $count = $this->_getLong($data, $base + $offset, $isBigEndian);
+            $offset += 4;
+
+            if (($type < 1) || ($type > 12))
+                return false; // Unexpected Type
+
+            $typeLengths = array( -1, 1, 1, 2, 4, 8, 1, 1, 2, 4, 8, 4, 8 );
+
+            $dataLength = $typeLengths[$type] * $count;
+            if ($dataLength > 4) {
+                $dataOffset = $this->_getLong($data, $base + $offset, $isBigEndian);
+                $rawValue = $this->_getFixedString($data, $base + $dataOffset, $dataLength);
+            } else {
+                $rawValue = $this->_getFixedString($data, $base + $offset, $dataLength);
+            }
+            $offset += 4;
+
+            switch ($type) {
+                case 1:    // UBYTE
+                    if ($count == 1) {
+                        $value = $this->_getByte($rawValue, 0);
+                    } else {
+                        $value = array();
+                        for ($j = 0; $j < $count; $j++)
+                            $value[$j] = $this->_getByte($rawValue, $j);
+                    }
+                    break;
+                case 2:    // ASCII
+                    $value = $rawValue;
+                    break;
+                case 3:    // USHORT
+                    if ($count == 1) {
+                        $value = $this->_getShort($rawValue, 0, $isBigEndian);
+                    } else {
+                        $value = array();
+                        for ($j = 0; $j < $count; $j++)
+                            $value[$j] = $this->_getShort($rawValue, $j * 2, $isBigEndian);
+                    }
+                    break;
+                case 4:    // ULONG
+                    if ($count == 1) {
+                        $value = $this->_getLong($rawValue, 0, $isBigEndian);
+                    } else {
+                        $value = array();
+                        for ($j = 0; $j < $count; $j++)
+                            $value[$j] = $this->_getLong($rawValue, $j * 4, $isBigEndian);
+                    }
+                    break;
+                case 5:    // URATIONAL
+                    if ($count == 1) {
+                        $a = $this->_getLong($rawValue, 0, $isBigEndian);
+                        $b = $this->_getLong($rawValue, 4, $isBigEndian);
+                        $value = array();
+                        $value['val'] = 0;
+                        $value['num'] = $a;
+                        $value['den'] = $b;
+                        if (($a != 0) && ($b != 0)) {
+                            $value['val'] = $a / $b;
+                        }
+                    } else {
+                        $value = array();
+                        for ($j = 0; $j < $count; $j++) {
+                            $a = $this->_getLong($rawValue, $j * 8, $isBigEndian);
+                            $b = $this->_getLong($rawValue, ($j * 8) + 4, $isBigEndian);
+                            $value = array();
+                            $value[$j]['val'] = 0;
+                            $value[$j]['num'] = $a;
+                            $value[$j]['den'] = $b;
+                            if (($a != 0) && ($b != 0))
+                                $value[$j]['val'] = $a / $b;
+                        }
+                    }
+                    break;
+                case 6:    // SBYTE
+                    if ($count == 1) {
+                        $value = $this->_getByte($rawValue, 0);
+                    } else {
+                        $value = array();
+                        for ($j = 0; $j < $count; $j++)
+                            $value[$j] = $this->_getByte($rawValue, $j);
+                    }
+                    break;
+                case 7:    // UNDEFINED
+                    $value = $rawValue;
+                    break;
+                case 8:    // SSHORT
+                    if ($count == 1) {
+                        $value = $this->_getShort($rawValue, 0, $isBigEndian);
+                    } else {
+                        $value = array();
+                        for ($j = 0; $j < $count; $j++)
+                            $value[$j] = $this->_getShort($rawValue, $j * 2, $isBigEndian);
+                    }
+                    break;
+                case 9:    // SLONG
+                    if ($count == 1) {
+                        $value = $this->_getLong($rawValue, 0, $isBigEndian);
+                    } else {
+                        $value = array();
+                        for ($j = 0; $j < $count; $j++)
+                            $value[$j] = $this->_getLong($rawValue, $j * 4, $isBigEndian);
+                    }
+                    break;
+                case 10:   // SRATIONAL
+                    if ($count == 1) {
+                        $a = $this->_getLong($rawValue, 0, $isBigEndian);
+                        $b = $this->_getLong($rawValue, 4, $isBigEndian);
+                        $value = array();
+                        $value['val'] = 0;
+                        $value['num'] = $a;
+                        $value['den'] = $b;
+                        if (($a != 0) && ($b != 0))
+                            $value['val'] = $a / $b;
+                    } else {
+                        $value = array();
+                        for ($j = 0; $j < $count; $j++) {
+                            $a = $this->_getLong($rawValue, $j * 8, $isBigEndian);
+                            $b = $this->_getLong($rawValue, ($j * 8) + 4, $isBigEndian);
+                            $value = array();
+                            $value[$j]['val'] = 0;
+                            $value[$j]['num'] = $a;
+                            $value[$j]['den'] = $b;
+                            if (($a != 0) && ($b != 0))
+                                $value[$j]['val'] = $a / $b;
+                        }
+                    }
+                    break;
+                case 11:   // FLOAT
+                    $value = $rawValue;
+                    break;
+
+                case 12:   // DFLOAT
+                    $value = $rawValue;
+                    break;
+                default:
+                    return false; // Unexpected Type
+            }
+
+            $tagName = '';
+            if (($mode == 'ifd0') && ($tag == 0x8769)) {  // ExifIFDOffset
+                $this->_readIFD($data, $base, $value, $isBigEndian, 'exif');
+            } elseif (($mode == 'ifd0') && ($tag == 0x8825)) {  // GPSIFDOffset
+                $this->_readIFD($data, $base, $value, $isBigEndian, 'gps');
+            } elseif (($mode == 'ifd1') && ($tag == 0x0111)) {  // TIFFStripOffsets
+                $exifTIFFOffset = $value;
+            } elseif (($mode == 'ifd1') && ($tag == 0x0117)) {  // TIFFStripByteCounts
+                $exifTIFFLength = $value;
+            } elseif (($mode == 'ifd1') && ($tag == 0x0201)) {  // TIFFJFIFOffset
+                $exifThumbnailOffset = $value;
+            } elseif (($mode == 'ifd1') && ($tag == 0x0202)) {  // TIFFJFIFLength
+                $exifThumbnailLength = $value;
+            } elseif (($mode == 'exif') && ($tag == 0xA005)) {  // InteropIFDOffset
+                $this->_readIFD($data, $base, $value, $isBigEndian, 'interop');
+            }
+            // elseif (($mode == 'exif') && ($tag == 0x927C)) {  // MakerNote
+            // }
+            else {
+                if (isset($EXIFTags[$tag])) {
+                    $tagName = $EXIFTags[$tag];
+                    if (isset($this->_info['exif'][$tagName])) {
+                        if (!is_array($this->_info['exif'][$tagName])) {
+                            $aux = array();
+                            $aux[0] = $this->_info['exif'][$tagName];
+                            $this->_info['exif'][$tagName] = $aux;
+                        }
+
+                        $this->_info['exif'][$tagName][count($this->_info['exif'][$tagName])] = $value;
+                    } else {
+                        $this->_info['exif'][$tagName] = $value;
+                    }
+                }
+                /*
+                 else {
+                    echo sprintf("<h1>Unknown tag %02x (t: %d l: %d) %s in %s</h1>", $tag, $type, $count, $mode, $this->_fileName);
+                    // Unknown Tags will be ignored!!!
+                    // That's because the tag might be a pointer (like the Exif tag)
+                    // and saving it without saving the data it points to might
+                    // create an invalid file.
+                }
+                */
+            }
+        }
+
+        if (($exifThumbnailOffset > 0) && ($exifThumbnailLength > 0)) {
+            $this->_info['exif']['JFIFThumbnail'] = $this->_getFixedString($data, $base + $exifThumbnailOffset, $exifThumbnailLength);
+        }
+
+        if (($exifTIFFOffset > 0) && ($exifTIFFLength > 0)) {
+            $this->_info['exif']['TIFFStrips'] = $this->_getFixedString($data, $base + $exifTIFFOffset, $exifTIFFLength);
+        }
+
+        $nextOffset = $this->_getLong($data, $base + $offset, $isBigEndian);
+        return $nextOffset;
+    }
+
+    /*************************************************************/
+    function & _createMarkerExif() {
+        $data = null;
+        $count = count($this->_markers);
+        for ($i = 0; $i < $count; $i++) {
+            if ($this->_markers[$i]['marker'] == 0xE1) {
+                $signature = $this->_getFixedString($this->_markers[$i]['data'], 0, 6);
+                if ($signature == "Exif\0\0") {
+                    $data =& $this->_markers[$i]['data'];
+                    break;
+                }
+            }
+        }
+
+        if (!isset($this->_info['exif'])) {
+            return false;
+        }
+
+        $data = "Exif\0\0";
+        $pos = 6;
+        $offsetBase = 6;
+
+        if (isset($this->_info['exif']['ByteAlign']) && ($this->_info['exif']['ByteAlign'] == "Big Endian")) {
+            $isBigEndian = true;
+            $aux = "MM";
+            $pos = $this->_putString($data, $pos, $aux);
+        } else {
+            $isBigEndian = false;
+            $aux = "II";
+            $pos = $this->_putString($data, $pos, $aux);
+        }
+        $pos = $this->_putShort($data, $pos, 0x002A, $isBigEndian);
+        $pos = $this->_putLong($data, $pos, 0x00000008, $isBigEndian); // IFD0 Offset is always 8
+
+        $ifd0 =& $this->_getIFDEntries($isBigEndian, 'ifd0');
+        $ifd1 =& $this->_getIFDEntries($isBigEndian, 'ifd1');
+
+        $pos = $this->_writeIFD($data, $pos, $offsetBase, $ifd0, $isBigEndian, true);
+        $pos = $this->_writeIFD($data, $pos, $offsetBase, $ifd1, $isBigEndian, false);
+
+        return $data;
+    }
+
+    /*************************************************************/
+
+    /**
+     * @param mixed $data
+     * @param integer $pos
+     * @param integer $offsetBase
+     * @param array $entries
+     * @param boolean $isBigEndian
+     * @param boolean $hasNext
+     *
+     * @return mixed
+     */
+    function _writeIFD(&$data, $pos, $offsetBase, &$entries, $isBigEndian, $hasNext) {
+        $tiffData = null;
+        $tiffDataOffsetPos = -1;
+
+        $entryCount = count($entries);
+
+        $dataPos = $pos + 2 + ($entryCount * 12) + 4;
+        $pos = $this->_putShort($data, $pos, $entryCount, $isBigEndian);
+
+        for ($i = 0; $i < $entryCount; $i++) {
+            $tag = $entries[$i]['tag'];
+            $type = $entries[$i]['type'];
+
+            if ($type == -99) { // SubIFD
+                $pos = $this->_putShort($data, $pos, $tag, $isBigEndian);
+                $pos = $this->_putShort($data, $pos, 0x04, $isBigEndian); // LONG
+                $pos = $this->_putLong($data, $pos, 0x01, $isBigEndian); // Count = 1
+                $pos = $this->_putLong($data, $pos, $dataPos - $offsetBase, $isBigEndian);
+
+                $dataPos = $this->_writeIFD($data, $dataPos, $offsetBase, $entries[$i]['value'], $isBigEndian, false);
+            } elseif ($type == -98) { // TIFF Data
+                $pos = $this->_putShort($data, $pos, $tag, $isBigEndian);
+                $pos = $this->_putShort($data, $pos, 0x04, $isBigEndian); // LONG
+                $pos = $this->_putLong($data, $pos, 0x01, $isBigEndian); // Count = 1
+                $tiffDataOffsetPos = $pos;
+                $pos = $this->_putLong($data, $pos, 0x00, $isBigEndian); // For Now
+                $tiffData =& $entries[$i]['value'] ;
+            } else { // Regular Entry
+                $pos = $this->_putShort($data, $pos, $tag, $isBigEndian);
+                $pos = $this->_putShort($data, $pos, $type, $isBigEndian);
+                $pos = $this->_putLong($data, $pos, $entries[$i]['count'], $isBigEndian);
+                if (strlen($entries[$i]['value']) > 4) {
+                    $pos = $this->_putLong($data, $pos, $dataPos - $offsetBase, $isBigEndian);
+                    $dataPos = $this->_putString($data, $dataPos, $entries[$i]['value']);
+                } else {
+                    $val = str_pad($entries[$i]['value'], 4, "\0");
+                    $pos = $this->_putString($data, $pos, $val);
+                }
+            }
+        }
+
+        if ($tiffData != null) {
+            $this->_putLong($data, $tiffDataOffsetPos, $dataPos - $offsetBase, $isBigEndian);
+            $dataPos = $this->_putString($data, $dataPos, $tiffData);
+        }
+
+        if ($hasNext) {
+            $pos = $this->_putLong($data, $pos, $dataPos - $offsetBase, $isBigEndian);
+        } else {
+            $pos = $this->_putLong($data, $pos, 0, $isBigEndian);
+        }
+
+        return $dataPos;
+    }
+
+    /*************************************************************/
+
+    /**
+     * @param boolean $isBigEndian
+     * @param string $mode
+     *
+     * @return array
+     */
+    function & _getIFDEntries($isBigEndian, $mode) {
+        $EXIFNames = $this->_exifTagNames($mode);
+        $EXIFTags = $this->_exifNameTags($mode);
+        $EXIFTypeInfo = $this->_exifTagTypes($mode);
+
+        $ifdEntries = array();
+        $entryCount = 0;
+
+        foreach($EXIFNames as $tag => $name) {
+            $type = $EXIFTypeInfo[$tag][0];
+            $count = $EXIFTypeInfo[$tag][1];
+            $value = null;
+
+            if (($mode == 'ifd0') && ($tag == 0x8769)) {  // ExifIFDOffset
+                if (isset($this->_info['exif']['EXIFVersion'])) {
+                    $value =& $this->_getIFDEntries($isBigEndian, "exif");
+                    $type = -99;
+                }
+                else {
+                    $value = null;
+                }
+            } elseif (($mode == 'ifd0') && ($tag == 0x8825)) {  // GPSIFDOffset
+                if (isset($this->_info['exif']['GPSVersionID'])) {
+                    $value =& $this->_getIFDEntries($isBigEndian, "gps");
+                    $type = -99;
+                } else {
+                    $value = null;
+                }
+            } elseif (($mode == 'ifd1') && ($tag == 0x0111)) {  // TIFFStripOffsets
+                if (isset($this->_info['exif']['TIFFStrips'])) {
+                    $value =& $this->_info['exif']['TIFFStrips'];
+                    $type = -98;
+                } else {
+                    $value = null;
+                }
+            } elseif (($mode == 'ifd1') && ($tag == 0x0117)) {  // TIFFStripByteCounts
+                if (isset($this->_info['exif']['TIFFStrips'])) {
+                    $value = strlen($this->_info['exif']['TIFFStrips']);
+                } else {
+                    $value = null;
+                }
+            } elseif (($mode == 'ifd1') && ($tag == 0x0201)) {  // TIFFJFIFOffset
+                if (isset($this->_info['exif']['JFIFThumbnail'])) {
+                    $value =& $this->_info['exif']['JFIFThumbnail'];
+                    $type = -98;
+                } else {
+                    $value = null;
+                }
+            } elseif (($mode == 'ifd1') && ($tag == 0x0202)) {  // TIFFJFIFLength
+                if (isset($this->_info['exif']['JFIFThumbnail'])) {
+                    $value = strlen($this->_info['exif']['JFIFThumbnail']);
+                } else {
+                    $value = null;
+                }
+            } elseif (($mode == 'exif') && ($tag == 0xA005)) {  // InteropIFDOffset
+                if (isset($this->_info['exif']['InteroperabilityIndex'])) {
+                    $value =& $this->_getIFDEntries($isBigEndian, "interop");
+                    $type = -99;
+                } else {
+                    $value = null;
+                }
+            } elseif (isset($this->_info['exif'][$name])) {
+                $origValue =& $this->_info['exif'][$name];
+
+                // This makes it easier to process variable size elements
+                if (!is_array($origValue) || isset($origValue['val'])) {
+                    unset($origValue); // Break the reference
+                    $origValue = array($this->_info['exif'][$name]);
+                }
+                $origCount = count($origValue);
+
+                if ($origCount == 0 ) {
+                    $type = -1;  // To ignore this field
+                }
+
+                $value = " ";
+
+                switch ($type) {
+                    case 1:    // UBYTE
+                        if ($count == 0) {
+                            $count = $origCount;
+                        }
+
+                        $j = 0;
+                        while (($j < $count) && ($j < $origCount)) {
+
+                            $this->_putByte($value, $j, $origValue[$j]);
+                            $j++;
+                        }
+
+                        while ($j < $count) {
+                            $this->_putByte($value, $j, 0);
+                            $j++;
+                        }
+                        break;
+                    case 2:    // ASCII
+                        $v = strval($origValue[0]);
+                        if (($count != 0) && (strlen($v) > $count)) {
+                            $v = substr($v, 0, $count);
+                        }
+                        elseif (($count > 0) && (strlen($v) < $count)) {
+                            $v = str_pad($v, $count, "\0");
+                        }
+
+                        $count = strlen($v);
+
+                        $this->_putString($value, 0, $v);
+                        break;
+                    case 3:    // USHORT
+                        if ($count == 0) {
+                            $count = $origCount;
+                        }
+
+                        $j = 0;
+                        while (($j < $count) && ($j < $origCount)) {
+                            $this->_putShort($value, $j * 2, $origValue[$j], $isBigEndian);
+                            $j++;
+                        }
+
+                        while ($j < $count) {
+                            $this->_putShort($value, $j * 2, 0, $isBigEndian);
+                            $j++;
+                        }
+                        break;
+                    case 4:    // ULONG
+                        if ($count == 0) {
+                            $count = $origCount;
+                        }
+
+                        $j = 0;
+                        while (($j < $count) && ($j < $origCount)) {
+                            $this->_putLong($value, $j * 4, $origValue[$j], $isBigEndian);
+                            $j++;
+                        }
+
+                        while ($j < $count) {
+                            $this->_putLong($value, $j * 4, 0, $isBigEndian);
+                            $j++;
+                        }
+                        break;
+                    case 5:    // URATIONAL
+                        if ($count == 0) {
+                            $count = $origCount;
+                        }
+
+                        $j = 0;
+                        while (($j < $count) && ($j < $origCount)) {
+                            $v = $origValue[$j];
+                            if (is_array($v)) {
+                                $a = $v['num'];
+                                $b = $v['den'];
+                            }
+                            else {
+                                $a = 0;
+                                $b = 0;
+                                // TODO: Allow other types and convert them
+                            }
+                            $this->_putLong($value, $j * 8, $a, $isBigEndian);
+                            $this->_putLong($value, ($j * 8) + 4, $b, $isBigEndian);
+                            $j++;
+                        }
+
+                        while ($j < $count) {
+                            $this->_putLong($value, $j * 8, 0, $isBigEndian);
+                            $this->_putLong($value, ($j * 8) + 4, 0, $isBigEndian);
+                            $j++;
+                        }
+                        break;
+                    case 6:    // SBYTE
+                        if ($count == 0) {
+                            $count = $origCount;
+                        }
+
+                        $j = 0;
+                        while (($j < $count) && ($j < $origCount)) {
+                            $this->_putByte($value, $j, $origValue[$j]);
+                            $j++;
+                        }
+
+                        while ($j < $count) {
+                            $this->_putByte($value, $j, 0);
+                            $j++;
+                        }
+                        break;
+                    case 7:    // UNDEFINED
+                        $v = strval($origValue[0]);
+                        if (($count != 0) && (strlen($v) > $count)) {
+                            $v = substr($v, 0, $count);
+                        }
+                        elseif (($count > 0) && (strlen($v) < $count)) {
+                            $v = str_pad($v, $count, "\0");
+                        }
+
+                        $count = strlen($v);
+
+                        $this->_putString($value, 0, $v);
+                        break;
+                    case 8:    // SSHORT
+                        if ($count == 0) {
+                            $count = $origCount;
+                        }
+
+                        $j = 0;
+                        while (($j < $count) && ($j < $origCount)) {
+                            $this->_putShort($value, $j * 2, $origValue[$j], $isBigEndian);
+                            $j++;
+                        }
+
+                        while ($j < $count) {
+                            $this->_putShort($value, $j * 2, 0, $isBigEndian);
+                            $j++;
+                        }
+                        break;
+                    case 9:    // SLONG
+                        if ($count == 0) {
+                            $count = $origCount;
+                        }
+
+                        $j = 0;
+                        while (($j < $count) && ($j < $origCount)) {
+                            $this->_putLong($value, $j * 4, $origValue[$j], $isBigEndian);
+                            $j++;
+                        }
+
+                        while ($j < $count) {
+                            $this->_putLong($value, $j * 4, 0, $isBigEndian);
+                            $j++;
+                        }
+                        break;
+                    case 10:   // SRATIONAL
+                        if ($count == 0) {
+                            $count = $origCount;
+                        }
+
+                        $j = 0;
+                        while (($j < $count) && ($j < $origCount)) {
+                            $v = $origValue[$j];
+                            if (is_array($v)) {
+                                $a = $v['num'];
+                                $b = $v['den'];
+                            }
+                            else {
+                                $a = 0;
+                                $b = 0;
+                                // TODO: Allow other types and convert them
+                            }
+
+                            $this->_putLong($value, $j * 8, $a, $isBigEndian);
+                            $this->_putLong($value, ($j * 8) + 4, $b, $isBigEndian);
+                            $j++;
+                        }
+
+                        while ($j < $count) {
+                            $this->_putLong($value, $j * 8, 0, $isBigEndian);
+                            $this->_putLong($value, ($j * 8) + 4, 0, $isBigEndian);
+                            $j++;
+                        }
+                        break;
+                    case 11:   // FLOAT
+                        if ($count == 0) {
+                            $count = $origCount;
+                        }
+
+                        $j = 0;
+                        while (($j < $count) && ($j < $origCount)) {
+                            $v = strval($origValue[$j]);
+                            if (strlen($v) > 4) {
+                                $v = substr($v, 0, 4);
+                            }
+                            elseif (strlen($v) < 4) {
+                                $v = str_pad($v, 4, "\0");
+                            }
+                            $this->_putString($value, $j * 4, $v);
+                            $j++;
+                        }
+
+                        while ($j < $count) {
+                            $v = "\0\0\0\0";
+                            $this->_putString($value, $j * 4, $v);
+                            $j++;
+                        }
+                        break;
+                    case 12:   // DFLOAT
+                        if ($count == 0) {
+                            $count = $origCount;
+                        }
+
+                        $j = 0;
+                        while (($j < $count) && ($j < $origCount)) {
+                            $v = strval($origValue[$j]);
+                            if (strlen($v) > 8) {
+                                $v = substr($v, 0, 8);
+                            }
+                            elseif (strlen($v) < 8) {
+                                $v = str_pad($v, 8, "\0");
+                            }
+                            $this->_putString($value, $j * 8, $v);
+                            $j++;
+                        }
+
+                        while ($j < $count) {
+                            $v = "\0\0\0\0\0\0\0\0";
+                            $this->_putString($value, $j * 8, $v);
+                            $j++;
+                        }
+                        break;
+                    default:
+                        $value = null;
+                        break;
+                }
+            }
+
+            if ($value != null) {
+                $ifdEntries[$entryCount] = array();
+                $ifdEntries[$entryCount]['tag'] = $tag;
+                $ifdEntries[$entryCount]['type'] = $type;
+                $ifdEntries[$entryCount]['count'] = $count;
+                $ifdEntries[$entryCount]['value'] = $value;
+
+                $entryCount++;
+            }
+        }
+
+        return $ifdEntries;
+    }
+
+    /*************************************************************/
+    function _parseMarkerAdobe() {
+        if (!isset($this->_markers)) {
+            $this->_readJPEG();
+        }
+
+        if ($this->_markers == null) {
+            return false;
+        }
+
+        $data = null;
+        $count = count($this->_markers);
+        for ($i = 0; $i < $count; $i++) {
+            if ($this->_markers[$i]['marker'] == 0xED) {
+                $signature = $this->_getFixedString($this->_markers[$i]['data'], 0, 14);
+                if ($signature == "Photoshop 3.0\0") {
+                    $data =& $this->_markers[$i]['data'];
+                    break;
+                }
+            }
+        }
+
+        if ($data == null) {
+            $this->_info['adobe'] = false;
+            $this->_info['iptc'] = false;
+            return false;
+        }
+        $pos = 14;
+        $this->_info['adobe'] = array();
+        $this->_info['adobe']['raw'] = array();
+        $this->_info['iptc'] = array();
+
+        $datasize = strlen($data);
+
+        while ($pos < $datasize) {
+            $signature = $this->_getFixedString($data, $pos, 4);
+            if ($signature != '8BIM')
+                return false;
+            $pos += 4;
+
+            $type = $this->_getShort($data, $pos);
+            $pos += 2;
+
+            $strlen = $this->_getByte($data, $pos);
+            $pos += 1;
+            $header = '';
+            for ($i = 0; $i < $strlen; $i++) {
+                $header .= $data{$pos + $i};
+            }
+            $pos += $strlen + 1 - ($strlen % 2);  // The string is padded to even length, counting the length byte itself
+
+            $length = $this->_getLong($data, $pos);
+            $pos += 4;
+
+            $basePos = $pos;
+
+            switch ($type) {
+                case 0x0404: // Caption (IPTC Data)
+                    $pos = $this->_readIPTC($data, $pos);
+                    if ($pos == false)
+                        return false;
+                    break;
+                case 0x040A: // CopyrightFlag
+                    $this->_info['adobe']['CopyrightFlag'] = $this->_getByte($data, $pos);
+                    $pos += $length;
+                    break;
+                case 0x040B: // ImageURL
+                    $this->_info['adobe']['ImageURL'] = $this->_getFixedString($data, $pos, $length);
+                    $pos += $length;
+                    break;
+                case 0x040C: // Thumbnail
+                    $aux = $this->_getLong($data, $pos);
+                    $pos += 4;
+                    if ($aux == 1) {
+                        $this->_info['adobe']['ThumbnailWidth'] = $this->_getLong($data, $pos);
+                        $pos += 4;
+                        $this->_info['adobe']['ThumbnailHeight'] = $this->_getLong($data, $pos);
+                        $pos += 4;
+
+                        $pos += 16; // Skip some data
+
+                        $this->_info['adobe']['ThumbnailData'] = $this->_getFixedString($data, $pos, $length - 28);
+                        $pos += $length - 28;
+                    }
+                    break;
+                default:
+                    break;
+            }
+
+            // We save all blocks, even those we recognized
+            $label = sprintf('8BIM_0x%04x', $type);
+            $this->_info['adobe']['raw'][$label] = array();
+            $this->_info['adobe']['raw'][$label]['type'] = $type;
+            $this->_info['adobe']['raw'][$label]['header'] = $header;
+            $this->_info['adobe']['raw'][$label]['data'] =& $this->_getFixedString($data, $basePos, $length);
+
+            $pos = $basePos + $length + ($length % 2); // Even padding
+        }
+
+    }
+
+    /*************************************************************/
+    function _readIPTC(&$data, $pos = 0) {
+        $totalLength = strlen($data);
+
+        $IPTCTags = $this->_iptcTagNames();
+
+        while ($pos < ($totalLength - 5)) {
+            $signature = $this->_getShort($data, $pos);
+            if ($signature != 0x1C02)
+                return $pos;
+            $pos += 2;
+
+            $type = $this->_getByte($data, $pos);
+            $pos += 1;
+            $length = $this->_getShort($data, $pos);
+            $pos += 2;
+
+            $basePos = $pos;
+            $label = '';
+
+            if (isset($IPTCTags[$type])) {
+                $label = $IPTCTags[$type];
+            } else {
+                $label = sprintf('IPTC_0x%02x', $type);
+            }
+
+            if ($label != '') {
+                if (isset($this->_info['iptc'][$label])) {
+                    if (!is_array($this->_info['iptc'][$label])) {
+                        $aux = array();
+                        $aux[0] = $this->_info['iptc'][$label];
+                        $this->_info['iptc'][$label] = $aux;
+                    }
+                    $this->_info['iptc'][$label][ count($this->_info['iptc'][$label]) ] = $this->_getFixedString($data, $pos, $length);
+                } else {
+                    $this->_info['iptc'][$label] = $this->_getFixedString($data, $pos, $length);
+                }
+            }
+
+            $pos = $basePos + $length; // No padding
+        }
+        return $pos;
+    }
+
+    /*************************************************************/
+    function & _createMarkerAdobe() {
+        if (isset($this->_info['iptc'])) {
+            if (!isset($this->_info['adobe'])) {
+                $this->_info['adobe'] = array();
+            }
+            if (!isset($this->_info['adobe']['raw'])) {
+                $this->_info['adobe']['raw'] = array();
+            }
+            if (!isset($this->_info['adobe']['raw']['8BIM_0x0404'])) {
+                $this->_info['adobe']['raw']['8BIM_0x0404'] = array();
+            }
+            $this->_info['adobe']['raw']['8BIM_0x0404']['type'] = 0x0404;
+            $this->_info['adobe']['raw']['8BIM_0x0404']['header'] = "Caption";
+            $this->_info['adobe']['raw']['8BIM_0x0404']['data'] =& $this->_writeIPTC();
+        }
+
+        if (isset($this->_info['adobe']['raw']) && (count($this->_info['adobe']['raw']) > 0)) {
+            $data = "Photoshop 3.0\0";
+            $pos = 14;
+
+            reset($this->_info['adobe']['raw']);
+            foreach ($this->_info['adobe']['raw'] as $value){
+                $pos = $this->_write8BIM(
+                        $data,
+                        $pos,
+                        $value['type'],
+                        $value['header'],
+                        $value['data'] );
+            }
+        }
+
+        return $data;
+    }
+
+    /*************************************************************/
+
+    /**
+     * @param mixed $data
+     * @param integer $pos
+     *
+     * @param string $type
+     * @param string $header
+     * @param mixed $value
+     *
+     * @return int|mixed
+     */
+    function _write8BIM(&$data, $pos, $type, $header, &$value) {
+        $signature = "8BIM";
+
+        $pos = $this->_putString($data, $pos, $signature);
+        $pos = $this->_putShort($data, $pos, $type);
+
+        $len = strlen($header);
+
+        $pos = $this->_putByte($data, $pos, $len);
+        $pos = $this->_putString($data, $pos, $header);
+        if (($len % 2) == 0) {  // Even padding, including the length byte
+            $pos = $this->_putByte($data, $pos, 0);
+        }
+
+        $len = strlen($value);
+        $pos = $this->_putLong($data, $pos, $len);
+        $pos = $this->_putString($data, $pos, $value);
+        if (($len % 2) != 0) {  // Even padding
+            $pos = $this->_putByte($data, $pos, 0);
+        }
+        return $pos;
+    }
+
+    /*************************************************************/
+    function & _writeIPTC() {
+        $data = " ";
+        $pos = 0;
+
+        $IPTCNames =& $this->_iptcNameTags();
+
+        foreach($this->_info['iptc'] as $label => $value) {
+            $value =& $this->_info['iptc'][$label];
+            $type = -1;
+
+            if (isset($IPTCNames[$label])) {
+                $type = $IPTCNames[$label];
+            }
+            elseif (substr($label, 0, 7) == "IPTC_0x") {
+                $type = hexdec(substr($label, 7, 2));
+            }
+
+            if ($type != -1) {
+                if (is_array($value)) {
+                    $vcnt = count($value);
+                    for ($i = 0; $i < $vcnt; $i++) {
+                        $pos = $this->_writeIPTCEntry($data, $pos, $type, $value[$i]);
+                    }
+                }
+                else {
+                    $pos = $this->_writeIPTCEntry($data, $pos, $type, $value);
+                }
+            }
+        }
+
+        return $data;
+    }
+
+    /*************************************************************/
+
+    /**
+     * @param mixed $data
+     * @param integer $pos
+     *
+     * @param string $type
+     * @param mixed $value
+     *
+     * @return int|mixed
+     */
+    function _writeIPTCEntry(&$data, $pos, $type, &$value) {
+        $pos = $this->_putShort($data, $pos, 0x1C02);
+        $pos = $this->_putByte($data, $pos, $type);
+        $pos = $this->_putShort($data, $pos, strlen($value));
+        $pos = $this->_putString($data, $pos, $value);
+
+        return $pos;
+    }
+
+    /*************************************************************/
+    function _exifTagNames($mode) {
+        $tags = array();
+
+        if ($mode == 'ifd0') {
+            $tags[0x010E] = 'ImageDescription';
+            $tags[0x010F] = 'Make';
+            $tags[0x0110] = 'Model';
+            $tags[0x0112] = 'Orientation';
+            $tags[0x011A] = 'XResolution';
+            $tags[0x011B] = 'YResolution';
+            $tags[0x0128] = 'ResolutionUnit';
+            $tags[0x0131] = 'Software';
+            $tags[0x0132] = 'DateTime';
+            $tags[0x013B] = 'Artist';
+            $tags[0x013E] = 'WhitePoint';
+            $tags[0x013F] = 'PrimaryChromaticities';
+            $tags[0x0211] = 'YCbCrCoefficients';
+            $tags[0x0212] = 'YCbCrSubSampling';
+            $tags[0x0213] = 'YCbCrPositioning';
+            $tags[0x0214] = 'ReferenceBlackWhite';
+            $tags[0x8298] = 'Copyright';
+            $tags[0x8769] = 'ExifIFDOffset';
+            $tags[0x8825] = 'GPSIFDOffset';
+        }
+        if ($mode == 'ifd1') {
+            $tags[0x00FE] = 'TIFFNewSubfileType';
+            $tags[0x00FF] = 'TIFFSubfileType';
+            $tags[0x0100] = 'TIFFImageWidth';
+            $tags[0x0101] = 'TIFFImageHeight';
+            $tags[0x0102] = 'TIFFBitsPerSample';
+            $tags[0x0103] = 'TIFFCompression';
+            $tags[0x0106] = 'TIFFPhotometricInterpretation';
+            $tags[0x0107] = 'TIFFThreshholding';
+            $tags[0x0108] = 'TIFFCellWidth';
+            $tags[0x0109] = 'TIFFCellLength';
+            $tags[0x010A] = 'TIFFFillOrder';
+            $tags[0x010E] = 'TIFFImageDescription';
+            $tags[0x010F] = 'TIFFMake';
+            $tags[0x0110] = 'TIFFModel';
+            $tags[0x0111] = 'TIFFStripOffsets';
+            $tags[0x0112] = 'TIFFOrientation';
+            $tags[0x0115] = 'TIFFSamplesPerPixel';
+            $tags[0x0116] = 'TIFFRowsPerStrip';
+            $tags[0x0117] = 'TIFFStripByteCounts';
+            $tags[0x0118] = 'TIFFMinSampleValue';
+            $tags[0x0119] = 'TIFFMaxSampleValue';
+            $tags[0x011A] = 'TIFFXResolution';
+            $tags[0x011B] = 'TIFFYResolution';
+            $tags[0x011C] = 'TIFFPlanarConfiguration';
+            $tags[0x0122] = 'TIFFGrayResponseUnit';
+            $tags[0x0123] = 'TIFFGrayResponseCurve';
+            $tags[0x0128] = 'TIFFResolutionUnit';
+            $tags[0x0131] = 'TIFFSoftware';
+            $tags[0x0132] = 'TIFFDateTime';
+            $tags[0x013B] = 'TIFFArtist';
+            $tags[0x013C] = 'TIFFHostComputer';
+            $tags[0x0140] = 'TIFFColorMap';
+            $tags[0x0152] = 'TIFFExtraSamples';
+            $tags[0x0201] = 'TIFFJFIFOffset';
+            $tags[0x0202] = 'TIFFJFIFLength';
+            $tags[0x0211] = 'TIFFYCbCrCoefficients';
+            $tags[0x0212] = 'TIFFYCbCrSubSampling';
+            $tags[0x0213] = 'TIFFYCbCrPositioning';
+            $tags[0x0214] = 'TIFFReferenceBlackWhite';
+            $tags[0x8298] = 'TIFFCopyright';
+            $tags[0x9286] = 'TIFFUserComment';
+        } elseif ($mode == 'exif') {
+            $tags[0x829A] = 'ExposureTime';
+            $tags[0x829D] = 'FNumber';
+            $tags[0x8822] = 'ExposureProgram';
+            $tags[0x8824] = 'SpectralSensitivity';
+            $tags[0x8827] = 'ISOSpeedRatings';
+            $tags[0x8828] = 'OECF';
+            $tags[0x9000] = 'EXIFVersion';
+            $tags[0x9003] = 'DatetimeOriginal';
+            $tags[0x9004] = 'DatetimeDigitized';
+            $tags[0x9101] = 'ComponentsConfiguration';
+            $tags[0x9102] = 'CompressedBitsPerPixel';
+            $tags[0x9201] = 'ShutterSpeedValue';
+            $tags[0x9202] = 'ApertureValue';
+            $tags[0x9203] = 'BrightnessValue';
+            $tags[0x9204] = 'ExposureBiasValue';
+            $tags[0x9205] = 'MaxApertureValue';
+            $tags[0x9206] = 'SubjectDistance';
+            $tags[0x9207] = 'MeteringMode';
+            $tags[0x9208] = 'LightSource';
+            $tags[0x9209] = 'Flash';
+            $tags[0x920A] = 'FocalLength';
+            $tags[0x927C] = 'MakerNote';
+            $tags[0x9286] = 'UserComment';
+            $tags[0x9290] = 'SubSecTime';
+            $tags[0x9291] = 'SubSecTimeOriginal';
+            $tags[0x9292] = 'SubSecTimeDigitized';
+            $tags[0xA000] = 'FlashPixVersion';
+            $tags[0xA001] = 'ColorSpace';
+            $tags[0xA002] = 'PixelXDimension';
+            $tags[0xA003] = 'PixelYDimension';
+            $tags[0xA004] = 'RelatedSoundFile';
+            $tags[0xA005] = 'InteropIFDOffset';
+            $tags[0xA20B] = 'FlashEnergy';
+            $tags[0xA20C] = 'SpatialFrequencyResponse';
+            $tags[0xA20E] = 'FocalPlaneXResolution';
+            $tags[0xA20F] = 'FocalPlaneYResolution';
+            $tags[0xA210] = 'FocalPlaneResolutionUnit';
+            $tags[0xA214] = 'SubjectLocation';
+            $tags[0xA215] = 'ExposureIndex';
+            $tags[0xA217] = 'SensingMethod';
+            $tags[0xA300] = 'FileSource';
+            $tags[0xA301] = 'SceneType';
+            $tags[0xA302] = 'CFAPattern';
+        } elseif ($mode == 'interop') {
+            $tags[0x0001] = 'InteroperabilityIndex';
+            $tags[0x0002] = 'InteroperabilityVersion';
+            $tags[0x1000] = 'RelatedImageFileFormat';
+            $tags[0x1001] = 'RelatedImageWidth';
+            $tags[0x1002] = 'RelatedImageLength';
+        } elseif ($mode == 'gps') {
+            $tags[0x0000] = 'GPSVersionID';
+            $tags[0x0001] = 'GPSLatitudeRef';
+            $tags[0x0002] = 'GPSLatitude';
+            $tags[0x0003] = 'GPSLongitudeRef';
+            $tags[0x0004] = 'GPSLongitude';
+            $tags[0x0005] = 'GPSAltitudeRef';
+            $tags[0x0006] = 'GPSAltitude';
+            $tags[0x0007] = 'GPSTimeStamp';
+            $tags[0x0008] = 'GPSSatellites';
+            $tags[0x0009] = 'GPSStatus';
+            $tags[0x000A] = 'GPSMeasureMode';
+            $tags[0x000B] = 'GPSDOP';
+            $tags[0x000C] = 'GPSSpeedRef';
+            $tags[0x000D] = 'GPSSpeed';
+            $tags[0x000E] = 'GPSTrackRef';
+            $tags[0x000F] = 'GPSTrack';
+            $tags[0x0010] = 'GPSImgDirectionRef';
+            $tags[0x0011] = 'GPSImgDirection';
+            $tags[0x0012] = 'GPSMapDatum';
+            $tags[0x0013] = 'GPSDestLatitudeRef';
+            $tags[0x0014] = 'GPSDestLatitude';
+            $tags[0x0015] = 'GPSDestLongitudeRef';
+            $tags[0x0016] = 'GPSDestLongitude';
+            $tags[0x0017] = 'GPSDestBearingRef';
+            $tags[0x0018] = 'GPSDestBearing';
+            $tags[0x0019] = 'GPSDestDistanceRef';
+            $tags[0x001A] = 'GPSDestDistance';
+        }
+
+        return $tags;
+    }
+
+    /*************************************************************/
+    function _exifTagTypes($mode) {
+        $tags = array();
+
+        if ($mode == 'ifd0') {
+            $tags[0x010E] = array(2, 0); // ImageDescription -> ASCII, Any
+            $tags[0x010F] = array(2, 0); // Make -> ASCII, Any
+            $tags[0x0110] = array(2, 0); // Model -> ASCII, Any
+            $tags[0x0112] = array(3, 1); // Orientation -> SHORT, 1
+            $tags[0x011A] = array(5, 1); // XResolution -> RATIONAL, 1
+            $tags[0x011B] = array(5, 1); // YResolution -> RATIONAL, 1
+            $tags[0x0128] = array(3, 1); // ResolutionUnit -> SHORT
+            $tags[0x0131] = array(2, 0); // Software -> ASCII, Any
+            $tags[0x0132] = array(2, 20); // DateTime -> ASCII, 20
+            $tags[0x013B] = array(2, 0); // Artist -> ASCII, Any
+            $tags[0x013E] = array(5, 2); // WhitePoint -> RATIONAL, 2
+            $tags[0x013F] = array(5, 6); // PrimaryChromaticities -> RATIONAL, 6
+            $tags[0x0211] = array(5, 3); // YCbCrCoefficients -> RATIONAL, 3
+            $tags[0x0212] = array(3, 2); // YCbCrSubSampling -> SHORT, 2
+            $tags[0x0213] = array(3, 1); // YCbCrPositioning -> SHORT, 1
+            $tags[0x0214] = array(5, 6); // ReferenceBlackWhite -> RATIONAL, 6
+            $tags[0x8298] = array(2, 0); // Copyright -> ASCII, Any
+            $tags[0x8769] = array(4, 1); // ExifIFDOffset -> LONG, 1
+            $tags[0x8825] = array(4, 1); // GPSIFDOffset -> LONG, 1
+        }
+        if ($mode == 'ifd1') {
+            $tags[0x00FE] = array(4, 1); // TIFFNewSubfileType -> LONG, 1
+            $tags[0x00FF] = array(3, 1); // TIFFSubfileType -> SHORT, 1
+            $tags[0x0100] = array(4, 1); // TIFFImageWidth -> LONG (or SHORT), 1
+            $tags[0x0101] = array(4, 1); // TIFFImageHeight -> LONG (or SHORT), 1
+            $tags[0x0102] = array(3, 3); // TIFFBitsPerSample -> SHORT, 3
+            $tags[0x0103] = array(3, 1); // TIFFCompression -> SHORT, 1
+            $tags[0x0106] = array(3, 1); // TIFFPhotometricInterpretation -> SHORT, 1
+            $tags[0x0107] = array(3, 1); // TIFFThreshholding -> SHORT, 1
+            $tags[0x0108] = array(3, 1); // TIFFCellWidth -> SHORT, 1
+            $tags[0x0109] = array(3, 1); // TIFFCellLength -> SHORT, 1
+            $tags[0x010A] = array(3, 1); // TIFFFillOrder -> SHORT, 1
+            $tags[0x010E] = array(2, 0); // TIFFImageDescription -> ASCII, Any
+            $tags[0x010F] = array(2, 0); // TIFFMake -> ASCII, Any
+            $tags[0x0110] = array(2, 0); // TIFFModel -> ASCII, Any
+            $tags[0x0111] = array(4, 0); // TIFFStripOffsets -> LONG (or SHORT), Any (one per strip)
+            $tags[0x0112] = array(3, 1); // TIFFOrientation -> SHORT, 1
+            $tags[0x0115] = array(3, 1); // TIFFSamplesPerPixel -> SHORT, 1
+            $tags[0x0116] = array(4, 1); // TIFFRowsPerStrip -> LONG (or SHORT), 1
+            $tags[0x0117] = array(4, 0); // TIFFStripByteCounts -> LONG (or SHORT), Any (one per strip)
+            $tags[0x0118] = array(3, 0); // TIFFMinSampleValue -> SHORT, Any (SamplesPerPixel)
+            $tags[0x0119] = array(3, 0); // TIFFMaxSampleValue -> SHORT, Any (SamplesPerPixel)
+            $tags[0x011A] = array(5, 1); // TIFFXResolution -> RATIONAL, 1
+            $tags[0x011B] = array(5, 1); // TIFFYResolution -> RATIONAL, 1
+            $tags[0x011C] = array(3, 1); // TIFFPlanarConfiguration -> SHORT, 1
+            $tags[0x0122] = array(3, 1); // TIFFGrayResponseUnit -> SHORT, 1
+            $tags[0x0123] = array(3, 0); // TIFFGrayResponseCurve -> SHORT, Any (2^BitsPerSample)
+            $tags[0x0128] = array(3, 1); // TIFFResolutionUnit -> SHORT, 1
+            $tags[0x0131] = array(2, 0); // TIFFSoftware -> ASCII, Any
+            $tags[0x0132] = array(2, 20); // TIFFDateTime -> ASCII, 20
+            $tags[0x013B] = array(2, 0); // TIFFArtist -> ASCII, Any
+            $tags[0x013C] = array(2, 0); // TIFFHostComputer -> ASCII, Any
+            $tags[0x0140] = array(3, 0); // TIFFColorMap -> SHORT, Any (3 * 2^BitsPerSample)
+            $tags[0x0152] = array(3, 0); // TIFFExtraSamples -> SHORT, Any (SamplesPerPixel - 3)
+            $tags[0x0201] = array(4, 1); // TIFFJFIFOffset -> LONG, 1
+            $tags[0x0202] = array(4, 1); // TIFFJFIFLength -> LONG, 1
+            $tags[0x0211] = array(5, 3); // TIFFYCbCrCoefficients -> RATIONAL, 3
+            $tags[0x0212] = array(3, 2); // TIFFYCbCrSubSampling -> SHORT, 2
+            $tags[0x0213] = array(3, 1); // TIFFYCbCrPositioning -> SHORT, 1
+            $tags[0x0214] = array(5, 6); // TIFFReferenceBlackWhite -> RATIONAL, 6
+            $tags[0x8298] = array(2, 0); // TIFFCopyright -> ASCII, Any
+            $tags[0x9286] = array(2, 0); // TIFFUserComment -> ASCII, Any
+        } elseif ($mode == 'exif') {
+            $tags[0x829A] = array(5, 1); // ExposureTime -> RATIONAL, 1
+            $tags[0x829D] = array(5, 1); // FNumber -> RATIONAL, 1
+            $tags[0x8822] = array(3, 1); // ExposureProgram -> SHORT, 1
+            $tags[0x8824] = array(2, 0); // SpectralSensitivity -> ASCII, Any
+            $tags[0x8827] = array(3, 0); // ISOSpeedRatings -> SHORT, Any
+            $tags[0x8828] = array(7, 0); // OECF -> UNDEFINED, Any
+            $tags[0x9000] = array(7, 4); // EXIFVersion -> UNDEFINED, 4
+            $tags[0x9003] = array(2, 20); // DatetimeOriginal -> ASCII, 20
+            $tags[0x9004] = array(2, 20); // DatetimeDigitized -> ASCII, 20
+            $tags[0x9101] = array(7, 4); // ComponentsConfiguration -> UNDEFINED, 4
+            $tags[0x9102] = array(5, 1); // CompressedBitsPerPixel -> RATIONAL, 1
+            $tags[0x9201] = array(10, 1); // ShutterSpeedValue -> SRATIONAL, 1
+            $tags[0x9202] = array(5, 1); // ApertureValue -> RATIONAL, 1
+            $tags[0x9203] = array(10, 1); // BrightnessValue -> SRATIONAL, 1
+            $tags[0x9204] = array(10, 1); // ExposureBiasValue -> SRATIONAL, 1
+            $tags[0x9205] = array(5, 1); // MaxApertureValue -> RATIONAL, 1
+            $tags[0x9206] = array(5, 1); // SubjectDistance -> RATIONAL, 1
+            $tags[0x9207] = array(3, 1); // MeteringMode -> SHORT, 1
+            $tags[0x9208] = array(3, 1); // LightSource -> SHORT, 1
+            $tags[0x9209] = array(3, 1); // Flash -> SHORT, 1
+            $tags[0x920A] = array(5, 1); // FocalLength -> RATIONAL, 1
+            $tags[0x927C] = array(7, 0); // MakerNote -> UNDEFINED, Any
+            $tags[0x9286] = array(7, 0); // UserComment -> UNDEFINED, Any
+            $tags[0x9290] = array(2, 0); // SubSecTime -> ASCII, Any
+            $tags[0x9291] = array(2, 0); // SubSecTimeOriginal -> ASCII, Any
+            $tags[0x9292] = array(2, 0); // SubSecTimeDigitized -> ASCII, Any
+            $tags[0xA000] = array(7, 4); // FlashPixVersion -> UNDEFINED, 4
+            $tags[0xA001] = array(3, 1); // ColorSpace -> SHORT, 1
+            $tags[0xA002] = array(4, 1); // PixelXDimension -> LONG (or SHORT), 1
+            $tags[0xA003] = array(4, 1); // PixelYDimension -> LONG (or SHORT), 1
+            $tags[0xA004] = array(2, 13); // RelatedSoundFile -> ASCII, 13
+            $tags[0xA005] = array(4, 1); // InteropIFDOffset -> LONG, 1
+            $tags[0xA20B] = array(5, 1); // FlashEnergy -> RATIONAL, 1
+            $tags[0xA20C] = array(7, 0); // SpatialFrequencyResponse -> UNDEFINED, Any
+            $tags[0xA20E] = array(5, 1); // FocalPlaneXResolution -> RATIONAL, 1
+            $tags[0xA20F] = array(5, 1); // FocalPlaneYResolution -> RATIONAL, 1
+            $tags[0xA210] = array(3, 1); // FocalPlaneResolutionUnit -> SHORT, 1
+            $tags[0xA214] = array(3, 2); // SubjectLocation -> SHORT, 2
+            $tags[0xA215] = array(5, 1); // ExposureIndex -> RATIONAL, 1
+            $tags[0xA217] = array(3, 1); // SensingMethod -> SHORT, 1
+            $tags[0xA300] = array(7, 1); // FileSource -> UNDEFINED, 1
+            $tags[0xA301] = array(7, 1); // SceneType -> UNDEFINED, 1
+            $tags[0xA302] = array(7, 0); // CFAPattern -> UNDEFINED, Any
+        } elseif ($mode == 'interop') {
+            $tags[0x0001] = array(2, 0); // InteroperabilityIndex -> ASCII, Any
+            $tags[0x0002] = array(7, 4); // InteroperabilityVersion -> UNKNOWN, 4
+            $tags[0x1000] = array(2, 0); // RelatedImageFileFormat -> ASCII, Any
+            $tags[0x1001] = array(4, 1); // RelatedImageWidth -> LONG (or SHORT), 1
+            $tags[0x1002] = array(4, 1); // RelatedImageLength -> LONG (or SHORT), 1
+        } elseif ($mode == 'gps') {
+            $tags[0x0000] = array(1, 4); // GPSVersionID -> BYTE, 4
+            $tags[0x0001] = array(2, 2); // GPSLatitudeRef -> ASCII, 2
+            $tags[0x0002] = array(5, 3); // GPSLatitude -> RATIONAL, 3
+            $tags[0x0003] = array(2, 2); // GPSLongitudeRef -> ASCII, 2
+            $tags[0x0004] = array(5, 3); // GPSLongitude -> RATIONAL, 3
+            $tags[0x0005] = array(2, 2); // GPSAltitudeRef -> ASCII, 2
+            $tags[0x0006] = array(5, 1); // GPSAltitude -> RATIONAL, 1
+            $tags[0x0007] = array(5, 3); // GPSTimeStamp -> RATIONAL, 3
+            $tags[0x0008] = array(2, 0); // GPSSatellites -> ASCII, Any
+            $tags[0x0009] = array(2, 2); // GPSStatus -> ASCII, 2
+            $tags[0x000A] = array(2, 2); // GPSMeasureMode -> ASCII, 2
+            $tags[0x000B] = array(5, 1); // GPSDOP -> RATIONAL, 1
+            $tags[0x000C] = array(2, 2); // GPSSpeedRef -> ASCII, 2
+            $tags[0x000D] = array(5, 1); // GPSSpeed -> RATIONAL, 1
+            $tags[0x000E] = array(2, 2); // GPSTrackRef -> ASCII, 2
+            $tags[0x000F] = array(5, 1); // GPSTrack -> RATIONAL, 1
+            $tags[0x0010] = array(2, 2); // GPSImgDirectionRef -> ASCII, 2
+            $tags[0x0011] = array(5, 1); // GPSImgDirection -> RATIONAL, 1
+            $tags[0x0012] = array(2, 0); // GPSMapDatum -> ASCII, Any
+            $tags[0x0013] = array(2, 2); // GPSDestLatitudeRef -> ASCII, 2
+            $tags[0x0014] = array(5, 3); // GPSDestLatitude -> RATIONAL, 3
+            $tags[0x0015] = array(2, 2); // GPSDestLongitudeRef -> ASCII, 2
+            $tags[0x0016] = array(5, 3); // GPSDestLongitude -> RATIONAL, 3
+            $tags[0x0017] = array(2, 2); // GPSDestBearingRef -> ASCII, 2
+            $tags[0x0018] = array(5, 1); // GPSDestBearing -> RATIONAL, 1
+            $tags[0x0019] = array(2, 2); // GPSDestDistanceRef -> ASCII, 2
+            $tags[0x001A] = array(5, 1); // GPSDestDistance -> RATIONAL, 1
+        }
+
+        return $tags;
+    }
+
+    /*************************************************************/
+    function _exifNameTags($mode) {
+        $tags = $this->_exifTagNames($mode);
+        return $this->_names2Tags($tags);
+    }
+
+    /*************************************************************/
+    function _iptcTagNames() {
+        $tags = array();
+        $tags[0x14] = 'SuplementalCategories';
+        $tags[0x19] = 'Keywords';
+        $tags[0x78] = 'Caption';
+        $tags[0x7A] = 'CaptionWriter';
+        $tags[0x69] = 'Headline';
+        $tags[0x28] = 'SpecialInstructions';
+        $tags[0x0F] = 'Category';
+        $tags[0x50] = 'Byline';
+        $tags[0x55] = 'BylineTitle';
+        $tags[0x6E] = 'Credit';
+        $tags[0x73] = 'Source';
+        $tags[0x74] = 'CopyrightNotice';
+        $tags[0x05] = 'ObjectName';
+        $tags[0x5A] = 'City';
+        $tags[0x5C] = 'Sublocation';
+        $tags[0x5F] = 'ProvinceState';
+        $tags[0x65] = 'CountryName';
+        $tags[0x67] = 'OriginalTransmissionReference';
+        $tags[0x37] = 'DateCreated';
+        $tags[0x0A] = 'CopyrightFlag';
+
+        return $tags;
+    }
+
+    /*************************************************************/
+    function & _iptcNameTags() {
+        $tags = $this->_iptcTagNames();
+        return $this->_names2Tags($tags);
+    }
+
+    /*************************************************************/
+    function _names2Tags($tags2Names) {
+        $names2Tags = array();
+
+        foreach($tags2Names as $tag => $name) {
+            $names2Tags[$name] = $tag;
+        }
+
+        return $names2Tags;
+    }
+
+    /*************************************************************/
+
+    /**
+     * @param $data
+     * @param integer $pos
+     *
+     * @return int
+     */
+    function _getByte(&$data, $pos) {
+        return ord($data{$pos});
+    }
+
+    /*************************************************************/
+
+    /**
+     * @param mixed $data
+     * @param integer $pos
+     *
+     * @param mixed $val
+     *
+     * @return int
+     */
+    function _putByte(&$data, $pos, $val) {
+        $val = intval($val);
+
+        $data{$pos} = chr($val);
+
+        return $pos + 1;
+    }
+
+    /*************************************************************/
+    function _getShort(&$data, $pos, $bigEndian = true) {
+        if ($bigEndian) {
+            return (ord($data{$pos}) << 8)
+                + ord($data{$pos + 1});
+        } else {
+            return ord($data{$pos})
+                + (ord($data{$pos + 1}) << 8);
+        }
+    }
+
+    /*************************************************************/
+    function _putShort(&$data, $pos = 0, $val = 0, $bigEndian = true) {
+        $val = intval($val);
+
+        if ($bigEndian) {
+            $data{$pos + 0} = chr(($val & 0x0000FF00) >> 8);
+            $data{$pos + 1} = chr(($val & 0x000000FF) >> 0);
+        } else {
+            $data{$pos + 0} = chr(($val & 0x00FF) >> 0);
+            $data{$pos + 1} = chr(($val & 0xFF00) >> 8);
+        }
+
+        return $pos + 2;
+    }
+
+    /*************************************************************/
+
+    /**
+     * @param mixed $data
+     * @param integer $pos
+     *
+     * @param bool $bigEndian
+     *
+     * @return int
+     */
+    function _getLong(&$data, $pos, $bigEndian = true) {
+        if ($bigEndian) {
+            return (ord($data{$pos}) << 24)
+                + (ord($data{$pos + 1}) << 16)
+                + (ord($data{$pos + 2}) << 8)
+                + ord($data{$pos + 3});
+        } else {
+            return ord($data{$pos})
+                + (ord($data{$pos + 1}) << 8)
+                + (ord($data{$pos + 2}) << 16)
+                + (ord($data{$pos + 3}) << 24);
+        }
+    }
+
+    /*************************************************************/
+
+    /**
+     * @param mixed $data
+     * @param integer $pos
+     *
+     * @param mixed $val
+     * @param bool $bigEndian
+     *
+     * @return int
+     */
+    function _putLong(&$data, $pos, $val, $bigEndian = true) {
+        $val = intval($val);
+
+        if ($bigEndian) {
+            $data{$pos + 0} = chr(($val & 0xFF000000) >> 24);
+            $data{$pos + 1} = chr(($val & 0x00FF0000) >> 16);
+            $data{$pos + 2} = chr(($val & 0x0000FF00) >> 8);
+            $data{$pos + 3} = chr(($val & 0x000000FF) >> 0);
+        } else {
+            $data{$pos + 0} = chr(($val & 0x000000FF) >> 0);
+            $data{$pos + 1} = chr(($val & 0x0000FF00) >> 8);
+            $data{$pos + 2} = chr(($val & 0x00FF0000) >> 16);
+            $data{$pos + 3} = chr(($val & 0xFF000000) >> 24);
+        }
+
+        return $pos + 4;
+    }
+
+    /*************************************************************/
+    function & _getNullString(&$data, $pos) {
+        $str = '';
+        $max = strlen($data);
+
+        while ($pos < $max) {
+            if (ord($data{$pos}) == 0) {
+                return $str;
+            } else {
+                $str .= $data{$pos};
+            }
+            $pos++;
+        }
+
+        return $str;
+    }
+
+    /*************************************************************/
+    function & _getFixedString(&$data, $pos, $length = -1) {
+        if ($length == -1) {
+            $length = strlen($data) - $pos;
+        }
+
+        $rv = substr($data, $pos, $length);
+        return $rv;
+    }
+
+    /*************************************************************/
+    function _putString(&$data, $pos, &$str) {
+        $len = strlen($str);
+        for ($i = 0; $i < $len; $i++) {
+            $data{$pos + $i} = $str{$i};
+        }
+
+        return $pos + $len;
+    }
+
+    /*************************************************************/
+    function _hexDump(&$data, $start = 0, $length = -1) {
+        if (($length == -1) || (($length + $start) > strlen($data))) {
+            $end = strlen($data);
+        } else {
+            $end = $start + $length;
+        }
+
+        $ascii = '';
+        $count = 0;
+
+        echo "<tt>\n";
+
+        while ($start < $end) {
+            if (($count % 16) == 0) {
+                echo sprintf('%04d', $count) . ': ';
+            }
+
+            $c = ord($data{$start});
+            $count++;
+            $start++;
+
+            $aux = dechex($c);
+            if (strlen($aux) == 1)
+                echo '0';
+            echo $aux . ' ';
+
+            if ($c == 60)
+                $ascii .= '&lt;';
+            elseif ($c == 62)
+                $ascii .= '&gt;';
+            elseif ($c == 32)
+                $ascii .= '&#160;';
+            elseif ($c > 32)
+                $ascii .= chr($c);
+            else
+                $ascii .= '.';
+
+            if (($count % 4) == 0) {
+                echo ' - ';
+            }
+
+            if (($count % 16) == 0) {
+                echo ': ' . $ascii . "<br>\n";
+                $ascii = '';
+            }
+        }
+
+        if ($ascii != '') {
+            while (($count % 16) != 0) {
+                echo '-- ';
+                $count++;
+                if (($count % 4) == 0) {
+                    echo ' - ';
+                }
+            }
+            echo ': ' . $ascii . "<br>\n";
+        }
+
+        echo "</tt>\n";
+    }
+
+    /*****************************************************************/
+}
+
+/* vim: set expandtab tabstop=4 shiftwidth=4: */
diff --git a/wiki/inc/Mailer.class.php b/wiki/inc/Mailer.class.php
new file mode 100644
index 0000000..7968ce9
--- /dev/null
+++ b/wiki/inc/Mailer.class.php
@@ -0,0 +1,730 @@
+<?php
+/**
+ * A class to build and send multi part mails (with HTML content and embedded
+ * attachments). All mails are assumed to be in UTF-8 encoding.
+ *
+ * Attachments are handled in memory so this shouldn't be used to send huge
+ * files, but then again mail shouldn't be used to send huge files either.
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+
+// end of line for mail lines - RFC822 says CRLF but postfix (and other MTAs?)
+// think different
+if(!defined('MAILHEADER_EOL')) define('MAILHEADER_EOL', "\n");
+#define('MAILHEADER_ASCIIONLY',1);
+
+/**
+ * Mail Handling
+ */
+class Mailer {
+
+    protected $headers   = array();
+    protected $attach    = array();
+    protected $html      = '';
+    protected $text      = '';
+
+    protected $boundary  = '';
+    protected $partid    = '';
+    protected $sendparam = null;
+
+    protected $allowhtml = true;
+
+    protected $replacements = array('text'=> array(), 'html' => array());
+
+    /**
+     * Constructor
+     *
+     * Initializes the boundary strings, part counters and token replacements
+     */
+    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';
+
+        $this->partid   = substr(md5(uniqid(rand(), true)),0, 8).'@'.$server;
+        $this->boundary = '__________'.md5(uniqid(rand(), true));
+
+        $listid = join('.', array_reverse(explode('/', DOKU_BASE))).$server;
+        $listid = strtolower(trim($listid, '.'));
+
+        $this->allowhtml = (bool)$conf['htmlmail'];
+
+        // add some default headers for mailfiltering FS#2247
+        if(!empty($conf['mailreturnpath'])) {
+            $this->setHeader('Return-Path', $conf['mailreturnpath']);
+        }
+        $this->setHeader('X-Mailer', 'DokuWiki');
+        $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');
+        $this->setHeader('List-Id', $conf['title'].' <'.$listid.'>');
+        $this->setHeader('Date', date('r'), false);
+
+        $this->prepareTokenReplacements();
+    }
+
+    /**
+     * Attach a file
+     *
+     * @param string $path  Path to the file to attach
+     * @param string $mime  Mimetype of the attached file
+     * @param string $name The filename to use
+     * @param string $embed Unique key to reference this file from the HTML part
+     */
+    public function attachFile($path, $mime, $name = '', $embed = '') {
+        if(!$name) {
+            $name = utf8_basename($path);
+        }
+
+        $this->attach[] = array(
+            'data'  => file_get_contents($path),
+            'mime'  => $mime,
+            'name'  => $name,
+            'embed' => $embed
+        );
+    }
+
+    /**
+     * Attach a file
+     *
+     * @param string $data  The file contents to attach
+     * @param string $mime  Mimetype of the attached file
+     * @param string $name  The filename to use
+     * @param string $embed Unique key to reference this file from the HTML part
+     */
+    public function attachContent($data, $mime, $name = '', $embed = '') {
+        if(!$name) {
+            list(, $ext) = explode('/', $mime);
+            $name = count($this->attach).".$ext";
+        }
+
+        $this->attach[] = array(
+            'data'  => $data,
+            'mime'  => $mime,
+            'name'  => $name,
+            'embed' => $embed
+        );
+    }
+
+    /**
+     * Callback function to automatically embed images referenced in HTML templates
+     *
+     * @param array $matches
+     * @return string placeholder
+     */
+    protected function autoembed_cb($matches) {
+        static $embeds = 0;
+        $embeds++;
+
+        // get file and mime type
+        $media = cleanID($matches[1]);
+        list(, $mime) = mimetype($media);
+        $file = mediaFN($media);
+        if(!file_exists($file)) return $matches[0]; //bad reference, keep as is
+
+        // attach it and set placeholder
+        $this->attachFile($file, $mime, '', 'autoembed'.$embeds);
+        return '%%autoembed'.$embeds.'%%';
+    }
+
+    /**
+     * Add an arbitrary header to the mail
+     *
+     * If an empy value is passed, the header is removed
+     *
+     * @param string $header the header name (no trailing colon!)
+     * @param string|string[] $value  the value of the header
+     * @param bool   $clean  remove all non-ASCII chars and line feeds?
+     */
+    public function setHeader($header, $value, $clean = true) {
+        $header = str_replace(' ', '-', ucwords(strtolower(str_replace('-', ' ', $header)))); // streamline casing
+        if($clean) {
+            $header = preg_replace('/[^a-zA-Z0-9_ \-\.\+\@]+/', '', $header);
+            $value  = preg_replace('/[^a-zA-Z0-9_ \-\.\+\@<>]+/', '', $value);
+        }
+
+        // empty value deletes
+        if(is_array($value)){
+            $value = array_map('trim', $value);
+            $value = array_filter($value);
+            if(!$value) $value = '';
+        }else{
+            $value = trim($value);
+        }
+        if($value === '') {
+            if(isset($this->headers[$header])) unset($this->headers[$header]);
+        } else {
+            $this->headers[$header] = $value;
+        }
+    }
+
+    /**
+     * Set additional parameters to be passed to sendmail
+     *
+     * Whatever is set here is directly passed to PHP's mail() command as last
+     * parameter. Depending on the PHP setup this might break mailing alltogether
+     *
+     * @param string $param
+     */
+    public function setParameters($param) {
+        $this->sendparam = $param;
+    }
+
+    /**
+     * Set the text and HTML body and apply replacements
+     *
+     * This function applies a whole bunch of default replacements in addition
+     * to the ones specified as parameters
+     *
+     * If you pass the HTML part or HTML replacements yourself you have to make
+     * sure you encode all HTML special chars correctly
+     *
+     * @param string $text     plain text body
+     * @param array  $textrep  replacements to apply on the text part
+     * @param array  $htmlrep  replacements to apply on the HTML part, null to use $textrep (with urls wrapped in <a> tags)
+     * @param string $html     the HTML body, leave null to create it from $text
+     * @param bool   $wrap     wrap the HTML in the default header/Footer
+     */
+    public function setBody($text, $textrep = null, $htmlrep = null, $html = null, $wrap = true) {
+
+        $htmlrep = (array)$htmlrep;
+        $textrep = (array)$textrep;
+
+        // create HTML from text if not given
+        if(is_null($html)) {
+            $html = $text;
+            $html = hsc($html);
+            $html = preg_replace('/^----+$/m', '<hr >', $html);
+            $html = nl2br($html);
+        }
+        if($wrap) {
+            $wrap = rawLocale('mailwrap', 'html');
+            $html = preg_replace('/\n-- <br \/>.*$/s', '', $html); //strip signature
+            $html = str_replace('@EMAILSIGNATURE@', '', $html); //strip @EMAILSIGNATURE@
+            $html = str_replace('@HTMLBODY@', $html, $wrap);
+        }
+
+        if(strpos($text, '@EMAILSIGNATURE@') === false) {
+            $text .= '@EMAILSIGNATURE@';
+        }
+
+        // copy over all replacements missing for HTML (autolink URLs)
+        foreach($textrep as $key => $value) {
+            if(isset($htmlrep[$key])) continue;
+            if(media_isexternal($value)) {
+                $htmlrep[$key] = '<a href="'.hsc($value).'">'.hsc($value).'</a>';
+            } else {
+                $htmlrep[$key] = hsc($value);
+            }
+        }
+
+        // embed media from templates
+        $html = preg_replace_callback(
+            '/@MEDIA\(([^\)]+)\)@/',
+            array($this, 'autoembed_cb'), $html
+        );
+
+        // add default token replacements
+        $trep = array_merge($this->replacements['text'], (array)$textrep);
+        $hrep = array_merge($this->replacements['html'], (array)$htmlrep);
+
+        // Apply replacements
+        foreach($trep as $key => $substitution) {
+            $text = str_replace('@'.strtoupper($key).'@', $substitution, $text);
+        }
+        foreach($hrep as $key => $substitution) {
+            $html = str_replace('@'.strtoupper($key).'@', $substitution, $html);
+        }
+
+        $this->setHTML($html);
+        $this->setText($text);
+    }
+
+    /**
+     * Set the HTML part of the mail
+     *
+     * Placeholders can be used to reference embedded attachments
+     *
+     * You probably want to use setBody() instead
+     *
+     * @param string $html
+     */
+    public function setHTML($html) {
+        $this->html = $html;
+    }
+
+    /**
+     * Set the plain text part of the mail
+     *
+     * You probably want to use setBody() instead
+     *
+     * @param string $text
+     */
+    public function setText($text) {
+        $this->text = $text;
+    }
+
+    /**
+     * Add the To: recipients
+     *
+     * @see cleanAddress
+     * @param string|string[]  $address Multiple adresses separated by commas or as array
+     */
+    public function to($address) {
+        $this->setHeader('To', $address, false);
+    }
+
+    /**
+     * Add the Cc: recipients
+     *
+     * @see cleanAddress
+     * @param string|string[]  $address Multiple adresses separated by commas or as array
+     */
+    public function cc($address) {
+        $this->setHeader('Cc', $address, false);
+    }
+
+    /**
+     * Add the Bcc: recipients
+     *
+     * @see cleanAddress
+     * @param string|string[]  $address Multiple adresses separated by commas or as array
+     */
+    public function bcc($address) {
+        $this->setHeader('Bcc', $address, false);
+    }
+
+    /**
+     * Add the From: address
+     *
+     * This is set to $conf['mailfrom'] when not specified so you shouldn't need
+     * to call this function
+     *
+     * @see cleanAddress
+     * @param string  $address from address
+     */
+    public function from($address) {
+        $this->setHeader('From', $address, false);
+    }
+
+    /**
+     * Add the mail's Subject: header
+     *
+     * @param string $subject the mail subject
+     */
+    public function subject($subject) {
+        $this->headers['Subject'] = $subject;
+    }
+
+    /**
+     * Sets an email address header with correct encoding
+     *
+     * Unicode characters will be deaccented and encoded base64
+     * for headers. Addresses may not contain Non-ASCII data!
+     *
+     * Example:
+     *   cc("föö <foo@bar.com>, me@somewhere.com","TBcc");
+     *
+     * @param string|string[]  $addresses Multiple adresses separated by commas or as array
+     * @return false|string  the prepared header (can contain multiple lines)
+     */
+    public function cleanAddress($addresses) {
+        $headers = '';
+        if(!is_array($addresses)){
+            $addresses = explode(',', $addresses);
+        }
+
+        foreach($addresses as $part) {
+            $part = preg_replace('/[\r\n\0]+/', ' ', $part); // remove attack vectors
+            $part = trim($part);
+
+            // parse address
+            if(preg_match('#(.*?)<(.*?)>#', $part, $matches)) {
+                $text = trim($matches[1]);
+                $addr = $matches[2];
+            } else {
+                $addr = $part;
+            }
+            // skip empty ones
+            if(empty($addr)) {
+                continue;
+            }
+
+            // FIXME: is there a way to encode the localpart of a emailaddress?
+            if(!utf8_isASCII($addr)) {
+                msg(hsc("E-Mail address <$addr> is not ASCII"), -1);
+                continue;
+            }
+
+            if(!mail_isvalid($addr)) {
+                msg(hsc("E-Mail address <$addr> is not valid"), -1);
+                continue;
+            }
+
+            // text was given
+            if(!empty($text) && !isWindows()) { // No named recipients for To: in Windows (see FS#652)
+                // add address quotes
+                $addr = "<$addr>";
+
+                if(defined('MAILHEADER_ASCIIONLY')) {
+                    $text = utf8_deaccent($text);
+                    $text = utf8_strip($text);
+                }
+
+                if(strpos($text, ',') !== false || !utf8_isASCII($text)) {
+                    $text = '=?UTF-8?B?'.base64_encode($text).'?=';
+                }
+            } else {
+                $text = '';
+            }
+
+            // add to header comma seperated
+            if($headers != '') {
+                $headers .= ', ';
+            }
+            $headers .= $text.' '.$addr;
+        }
+
+        $headers = trim($headers);
+        if(empty($headers)) return false;
+
+        return $headers;
+    }
+
+
+    /**
+     * Prepare the mime multiparts for all attachments
+     *
+     * Replaces placeholders in the HTML with the correct CIDs
+     *
+     * @return string mime multiparts
+     */
+    protected function prepareAttachments() {
+        $mime = '';
+        $part = 1;
+        // embedded attachments
+        foreach($this->attach as $media) {
+            $media['name'] = str_replace(':', '_', cleanID($media['name'], true));
+
+            // create content id
+            $cid = 'part'.$part.'.'.$this->partid;
+
+            // replace wildcards
+            if($media['embed']) {
+                $this->html = str_replace('%%'.$media['embed'].'%%', 'cid:'.$cid, $this->html);
+            }
+
+            $mime .= '--'.$this->boundary.MAILHEADER_EOL;
+            $mime .= $this->wrappedHeaderLine('Content-Type', $media['mime'].'; id="'.$cid.'"');
+            $mime .= $this->wrappedHeaderLine('Content-Transfer-Encoding', 'base64');
+            $mime .= $this->wrappedHeaderLine('Content-ID',"<$cid>");
+            if($media['embed']) {
+                $mime .= $this->wrappedHeaderLine('Content-Disposition', 'inline; filename='.$media['name']);
+            } else {
+                $mime .= $this->wrappedHeaderLine('Content-Disposition', 'attachment; filename='.$media['name']);
+            }
+            $mime .= MAILHEADER_EOL; //end of headers
+            $mime .= chunk_split(base64_encode($media['data']), 74, MAILHEADER_EOL);
+
+            $part++;
+        }
+        return $mime;
+    }
+
+    /**
+     * Build the body and handles multi part mails
+     *
+     * Needs to be called before prepareHeaders!
+     *
+     * @return string the prepared mail body, false on errors
+     */
+    protected function prepareBody() {
+
+        // no HTML mails allowed? remove HTML body
+        if(!$this->allowhtml) {
+            $this->html = '';
+        }
+
+        // check for body
+        if(!$this->text && !$this->html) {
+            return false;
+        }
+
+        // add general headers
+        $this->headers['MIME-Version'] = '1.0';
+
+        $body = '';
+
+        if(!$this->html && !count($this->attach)) { // we can send a simple single part message
+            $this->headers['Content-Type']              = 'text/plain; charset=UTF-8';
+            $this->headers['Content-Transfer-Encoding'] = 'base64';
+            $body .= chunk_split(base64_encode($this->text), 72, MAILHEADER_EOL);
+        } else { // multi part it is
+            $body .= "This is a multi-part message in MIME format.".MAILHEADER_EOL;
+
+            // prepare the attachments
+            $attachments = $this->prepareAttachments();
+
+            // do we have alternative text content?
+            if($this->text && $this->html) {
+                $this->headers['Content-Type'] = 'multipart/alternative;'.MAILHEADER_EOL.
+                    '  boundary="'.$this->boundary.'XX"';
+                $body .= '--'.$this->boundary.'XX'.MAILHEADER_EOL;
+                $body .= 'Content-Type: text/plain; charset=UTF-8'.MAILHEADER_EOL;
+                $body .= 'Content-Transfer-Encoding: base64'.MAILHEADER_EOL;
+                $body .= MAILHEADER_EOL;
+                $body .= chunk_split(base64_encode($this->text), 72, MAILHEADER_EOL);
+                $body .= '--'.$this->boundary.'XX'.MAILHEADER_EOL;
+                $body .= 'Content-Type: multipart/related;'.MAILHEADER_EOL.
+                    '  boundary="'.$this->boundary.'";'.MAILHEADER_EOL.
+                    '  type="text/html"'.MAILHEADER_EOL;
+                $body .= MAILHEADER_EOL;
+            }
+
+            $body .= '--'.$this->boundary.MAILHEADER_EOL;
+            $body .= 'Content-Type: text/html; charset=UTF-8'.MAILHEADER_EOL;
+            $body .= 'Content-Transfer-Encoding: base64'.MAILHEADER_EOL;
+            $body .= MAILHEADER_EOL;
+            $body .= chunk_split(base64_encode($this->html), 72, MAILHEADER_EOL);
+            $body .= MAILHEADER_EOL;
+            $body .= $attachments;
+            $body .= '--'.$this->boundary.'--'.MAILHEADER_EOL;
+
+            // close open multipart/alternative boundary
+            if($this->text && $this->html) {
+                $body .= '--'.$this->boundary.'XX--'.MAILHEADER_EOL;
+            }
+        }
+
+        return $body;
+    }
+
+    /**
+     * Cleanup and encode the headers array
+     */
+    protected function cleanHeaders() {
+        global $conf;
+
+        // clean up addresses
+        if(empty($this->headers['From'])) $this->from($conf['mailfrom']);
+        $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]);
+            }
+        }
+
+        if(isset($this->headers['Subject'])) {
+            // add prefix to subject
+            if(empty($conf['mailprefix'])) {
+                if(utf8_strlen($conf['title']) < 20) {
+                    $prefix = '['.$conf['title'].']';
+                } else {
+                    $prefix = '['.utf8_substr($conf['title'], 0, 20).'...]';
+                }
+            } else {
+                $prefix = '['.$conf['mailprefix'].']';
+            }
+            $len = strlen($prefix);
+            if(substr($this->headers['Subject'], 0, $len) != $prefix) {
+                $this->headers['Subject'] = $prefix.' '.$this->headers['Subject'];
+            }
+
+            // encode subject
+            if(defined('MAILHEADER_ASCIIONLY')) {
+                $this->headers['Subject'] = utf8_deaccent($this->headers['Subject']);
+                $this->headers['Subject'] = utf8_strip($this->headers['Subject']);
+            }
+            if(!utf8_isASCII($this->headers['Subject'])) {
+                $this->headers['Subject'] = '=?UTF-8?B?'.base64_encode($this->headers['Subject']).'?=';
+            }
+        }
+
+    }
+
+    /**
+     * Returns a complete, EOL terminated header line, wraps it if necessary
+     *
+     * @param string $key
+     * @param string $val
+     * @return string line
+     */
+    protected function wrappedHeaderLine($key, $val){
+        return wordwrap("$key: $val", 78, MAILHEADER_EOL.'  ').MAILHEADER_EOL;
+    }
+
+    /**
+     * Create a string from the headers array
+     *
+     * @returns string the headers
+     */
+    protected function prepareHeaders() {
+        $headers = '';
+        foreach($this->headers as $key => $val) {
+            if ($val === '' || is_null($val)) continue;
+            $headers .= $this->wrappedHeaderLine($key, $val);
+        }
+        return $headers;
+    }
+
+    /**
+     * return a full email with all headers
+     *
+     * This is mainly intended for debugging and testing but could also be
+     * used for MHT exports
+     *
+     * @return string the mail, false on errors
+     */
+    public function dump() {
+        $this->cleanHeaders();
+        $body = $this->prepareBody();
+        if($body === false) return false;
+        $headers = $this->prepareHeaders();
+
+        return $headers.MAILHEADER_EOL.$body;
+    }
+
+    /**
+     * Prepare default token replacement strings
+     *
+     * Populates the '$replacements' property.
+     * Should be called by the class constructor
+     */
+    protected function prepareTokenReplacements() {
+        global $INFO;
+        global $conf;
+        /* @var Input $INPUT */
+        global $INPUT;
+        global $lang;
+
+        $ip   = clientIP();
+        $cip  = gethostsbyaddrs($ip);
+
+        $this->replacements['text'] = array(
+            'DATE' => dformat(),
+            'BROWSER' => $INPUT->server->str('HTTP_USER_AGENT'),
+            'IPADDRESS' => $ip,
+            'HOSTNAME' => $cip,
+            'TITLE' => $conf['title'],
+            'DOKUWIKIURL' => DOKU_URL,
+            'USER' => $INPUT->server->str('REMOTE_USER'),
+            'NAME' => $INFO['userinfo']['name'],
+            'MAIL' => $INFO['userinfo']['mail']
+        );
+        $signature = str_replace('@DOKUWIKIURL@', $this->replacements['text']['DOKUWIKIURL'], $lang['email_signature_text']);
+        $this->replacements['text']['EMAILSIGNATURE'] = "\n-- \n" . $signature . "\n";
+
+        $this->replacements['html'] = array(
+            'DATE' => '<i>' . hsc(dformat()) . '</i>',
+            'BROWSER' => hsc($INPUT->server->str('HTTP_USER_AGENT')),
+            'IPADDRESS' => '<code>' . hsc($ip) . '</code>',
+            'HOSTNAME' => '<code>' . hsc($cip) . '</code>',
+            'TITLE' => hsc($conf['title']),
+            'DOKUWIKIURL' => '<a href="' . DOKU_URL . '">' . DOKU_URL . '</a>',
+            'USER' => hsc($INPUT->server->str('REMOTE_USER')),
+            'NAME' => hsc($INFO['userinfo']['name']),
+            'MAIL' => '<a href="mailto:"' . hsc($INFO['userinfo']['mail']) . '">' .
+                hsc($INFO['userinfo']['mail']) . '</a>'
+        );
+        $signature = $lang['email_signature_text'];
+        if(!empty($lang['email_signature_html'])) {
+            $signature = $lang['email_signature_html'];
+        }
+        $signature = str_replace(
+            array(
+                '@DOKUWIKIURL@',
+                "\n"
+            ),
+            array(
+                $this->replacements['html']['DOKUWIKIURL'],
+                '<br />'
+            ),
+            $signature
+        );
+        $this->replacements['html']['EMAILSIGNATURE'] = $signature;
+    }
+
+    /**
+     * Send the mail
+     *
+     * Call this after all data was set
+     *
+     * @triggers MAIL_MESSAGE_SEND
+     * @return bool true if the mail was successfully passed to the MTA
+     */
+    public function send() {
+        $success = false;
+
+        // prepare hook data
+        $data = array(
+            // pass the whole mail class to plugin
+            'mail'    => $this,
+            // pass references for backward compatibility
+            'to'      => &$this->headers['To'],
+            'cc'      => &$this->headers['Cc'],
+            'bcc'     => &$this->headers['Bcc'],
+            'from'    => &$this->headers['From'],
+            'subject' => &$this->headers['Subject'],
+            'body'    => &$this->text,
+            'params'  => &$this->sendparam,
+            'headers' => '', // plugins shouldn't use this
+            // signal if we mailed successfully to AFTER event
+            'success' => &$success,
+        );
+
+        // do our thing if BEFORE hook approves
+        $evt = new Doku_Event('MAIL_MESSAGE_SEND', $data);
+        if($evt->advise_before(true)) {
+            // clean up before using the headers
+            $this->cleanHeaders();
+
+            // any recipients?
+            if(trim($this->headers['To']) === '' &&
+                trim($this->headers['Cc']) === '' &&
+                trim($this->headers['Bcc']) === ''
+            ) return false;
+
+            // The To: header is special
+            if(array_key_exists('To', $this->headers)) {
+                $to = (string)$this->headers['To'];
+                unset($this->headers['To']);
+            } else {
+                $to = '';
+            }
+
+            // so is the subject
+            if(array_key_exists('Subject', $this->headers)) {
+                $subject = (string)$this->headers['Subject'];
+                unset($this->headers['Subject']);
+            } else {
+                $subject = '';
+            }
+
+            // make the body
+            $body = $this->prepareBody();
+            if($body === false) return false;
+
+            // cook the headers
+            $headers = $this->prepareHeaders();
+            // add any headers set by legacy plugins
+            if(trim($data['headers'])) {
+                $headers .= MAILHEADER_EOL.trim($data['headers']);
+            }
+
+            // send the thing
+            if(is_null($this->sendparam)) {
+                $success = @mail($to, $subject, $body, $headers);
+            } else {
+                $success = @mail($to, $subject, $body, $headers, $this->sendparam);
+            }
+        }
+        // any AFTER actions?
+        $evt->advise_after();
+        return $success;
+    }
+}
diff --git a/wiki/inc/Manifest.php b/wiki/inc/Manifest.php
new file mode 100644
index 0000000..0df9c2b
--- /dev/null
+++ b/wiki/inc/Manifest.php
@@ -0,0 +1,80 @@
+<?php
+
+namespace dokuwiki;
+
+class Manifest
+{
+    public function sendManifest()
+    {
+        $manifest = retrieveConfig('manifest', 'jsonToArray');
+
+        global $conf;
+
+        $manifest['scope'] = DOKU_REL;
+
+        if (empty($manifest['name'])) {
+            $manifest['name'] = $conf['title'];
+        }
+
+        if (empty($manifest['short_name'])) {
+            $manifest['short_name'] = $conf['title'];
+        }
+
+        if (empty($manifest['description'])) {
+            $manifest['description'] = $conf['tagline'];
+        }
+
+        if (empty($manifest['start_url'])) {
+            $manifest['start_url'] = DOKU_REL;
+        }
+
+        $styleUtil = new \dokuwiki\StyleUtils();
+        $styleIni = $styleUtil->cssStyleini($conf['template']);
+        $replacements = $styleIni['replacements'];
+
+        if (empty($manifest['background_color'])) {
+            $manifest['background_color'] = $replacements['__background__'];
+        }
+
+        if (empty($manifest['theme_color'])) {
+            $manifest['theme_color'] = !empty($replacements['__theme_color__']) ? $replacements['__theme_color__'] : $replacements['__background_alt__'];
+        }
+
+        if (empty($manifest['icons'])) {
+            $manifest['icons'] = [];
+            if (file_exists(mediaFN(':wiki:favicon.ico'))) {
+                $url = ml(':wiki:favicon.ico', '', true, '', true);
+                $manifest['icons'][] = [
+                    'src' => $url,
+                    'sizes' => '16x16',
+                ];
+            }
+
+            $look = [
+                ':wiki:logo.svg',
+                ':logo.svg',
+                ':wiki:dokuwiki.svg'
+            ];
+
+            foreach ($look as $svgLogo) {
+
+                $svgLogoFN = mediaFN($svgLogo);
+
+                if (file_exists($svgLogoFN)) {
+                    $url = ml($svgLogo, '', true, '', true);
+                    $manifest['icons'][] = [
+                        'src' => $url,
+                        'sizes' => '17x17 512x512',
+                        'type' => 'image/svg+xml',
+                    ];
+                    break;
+                };
+            }
+        }
+
+        trigger_event('MANIFEST_SEND', $manifest);
+
+        header('Content-Type: application/manifest+json');
+        echo json_encode($manifest);
+    }
+}
diff --git a/wiki/inc/Menu/AbstractMenu.php b/wiki/inc/Menu/AbstractMenu.php
new file mode 100644
index 0000000..ce021ab
--- /dev/null
+++ b/wiki/inc/Menu/AbstractMenu.php
@@ -0,0 +1,95 @@
+<?php
+
+namespace dokuwiki\Menu;
+
+use dokuwiki\Menu\Item\AbstractItem;
+
+/**
+ * Class AbstractMenu
+ *
+ * Basic menu functionality. A menu defines a list of AbstractItem that shall be shown.
+ * It contains convenience functions to display the menu in HTML, but template authors can also
+ * just accesst the items via getItems() and create the HTML as however they see fit.
+ */
+abstract class AbstractMenu implements MenuInterface {
+
+    /** @var string[] list of Item classes to load */
+    protected $types = array();
+
+    /** @var int the context this menu is used in */
+    protected $context = AbstractItem::CTX_DESKTOP;
+
+    /** @var string view identifier to be set in the event */
+    protected $view = '';
+
+    /**
+     * AbstractMenu constructor.
+     *
+     * @param int $context the context this menu is used in
+     */
+    public function __construct($context = AbstractItem::CTX_DESKTOP) {
+        $this->context = $context;
+    }
+
+    /**
+     * Get the list of action items in this menu
+     *
+     * @return AbstractItem[]
+     * @triggers MENU_ITEMS_ASSEMBLY
+     */
+    public function getItems() {
+        $data = array(
+            'view' => $this->view,
+            'items' => array(),
+        );
+        trigger_event('MENU_ITEMS_ASSEMBLY', $data, array($this, 'loadItems'));
+        return $data['items'];
+    }
+
+    /**
+     * Default action for the MENU_ITEMS_ASSEMBLY event
+     *
+     * @see getItems()
+     * @param array $data The plugin data
+     */
+    public function loadItems(&$data) {
+        foreach($this->types as $class) {
+            try {
+                $class = "\\dokuwiki\\Menu\\Item\\$class";
+                /** @var AbstractItem $item */
+                $item = new $class();
+                if(!$item->visibleInContext($this->context)) continue;
+                $data['items'][] = $item;
+            } catch(\RuntimeException $ignored) {
+                // item not available
+            }
+        }
+    }
+
+    /**
+     * Generate HTML list items for this menu
+     *
+     * This is a convenience method for template authors. If you need more fine control over the
+     * output, use getItems() and build the HTML yourself
+     *
+     * @param string|false $classprefix create a class from type with this prefix, false for no class
+     * @param bool $svg add the SVG link
+     * @return string
+     */
+    public function getListItems($classprefix = '', $svg = true) {
+        $html = '';
+        foreach($this->getItems() as $item) {
+            if($classprefix !== false) {
+                $class = ' class="' . $classprefix . $item->getType() . '"';
+            } else {
+                $class = '';
+            }
+
+            $html .= "<li$class>";
+            $html .= $item->asHtmlLink(false, $svg);
+            $html .= '</li>';
+        }
+        return $html;
+    }
+
+}
diff --git a/wiki/inc/Menu/DetailMenu.php b/wiki/inc/Menu/DetailMenu.php
new file mode 100644
index 0000000..27c0c6f
--- /dev/null
+++ b/wiki/inc/Menu/DetailMenu.php
@@ -0,0 +1,21 @@
+<?php
+
+namespace dokuwiki\Menu;
+
+/**
+ * Class DetailMenu
+ *
+ * This menu offers options on an image detail view. It usually displayed similar to
+ * the PageMenu.
+ */
+class DetailMenu extends AbstractMenu {
+
+    protected $view = 'detail';
+
+    protected $types = array(
+        'MediaManager',
+        'ImgBackto',
+        'Top',
+    );
+
+}
diff --git a/wiki/inc/Menu/Item/AbstractItem.php b/wiki/inc/Menu/Item/AbstractItem.php
new file mode 100644
index 0000000..45ead55
--- /dev/null
+++ b/wiki/inc/Menu/Item/AbstractItem.php
@@ -0,0 +1,253 @@
+<?php
+
+namespace dokuwiki\Menu\Item;
+
+/**
+ * Class AbstractItem
+ *
+ * This class defines a single Item to be displayed in one of DokuWiki's menus. Plugins
+ * can extend those menus through action plugins and add their own instances of this class,
+ * overwriting some of its properties.
+ *
+ * Items may be shown multiple times in different contexts. Eg. for the default template
+ * all menus are shown in a Dropdown list on mobile, but are split into several places on
+ * desktop. The item's $context property can be used to hide the item depending on the current
+ * context.
+ *
+ * Children usually just need to overwrite the different properties, but for complex things
+ * the accessors may be overwritten instead.
+ */
+abstract class AbstractItem {
+
+    /** menu item is to be shown on desktop screens only */
+    const CTX_DESKTOP = 1;
+    /** menu item is to be shown on mobile screens only */
+    const CTX_MOBILE = 2;
+    /** menu item is to be shown in all contexts */
+    const CTX_ALL = 3;
+
+    /** @var string name of the action, usually the lowercase class name */
+    protected $type = '';
+    /** @var string optional keyboard shortcut */
+    protected $accesskey = '';
+    /** @var string the page id this action links to */
+    protected $id = '';
+    /** @var string the method to be used when this action is used in a form */
+    protected $method = 'get';
+    /** @var array parameters for the action (should contain the do parameter) */
+    protected $params = array();
+    /** @var bool when true, a rel=nofollow should be used */
+    protected $nofollow = true;
+    /** @var string this item's label may contain a placeholder, which is replaced with this */
+    protected $replacement = '';
+    /** @var string the full path to the SVG icon of this menu item */
+    protected $svg = DOKU_INC . 'lib/images/menu/00-default_checkbox-blank-circle-outline.svg';
+    /** @var string can be set to overwrite the default lookup in $lang.btn_* */
+    protected $label = '';
+    /** @var string the tooltip title, defaults to $label */
+    protected $title = '';
+    /** @var int the context this titme is shown in */
+    protected $context = self::CTX_ALL;
+
+    /**
+     * AbstractItem constructor.
+     *
+     * Sets the dynamic properties
+     *
+     * Children should always call the parent constructor!
+     *
+     * @throws \RuntimeException when the action is disabled
+     */
+    public function __construct() {
+        global $ID;
+        $this->id = $ID;
+        $this->type = $this->getType();
+        $this->params['do'] = $this->type;
+
+        if(!actionOK($this->type)) throw new \RuntimeException("action disabled: {$this->type}");
+    }
+
+    /**
+     * Return this item's label
+     *
+     * When the label property was set, it is simply returned. Otherwise, the action's type
+     * is used to look up the translation in the main language file and, if used, the replacement
+     * is applied.
+     *
+     * @return string
+     */
+    public function getLabel() {
+        if($this->label !== '') return $this->label;
+
+        /** @var array $lang */
+        global $lang;
+        $label = $lang['btn_' . $this->type];
+        if(strpos($label, '%s')) {
+            $label = sprintf($label, $this->replacement);
+        }
+        if($label === '') $label = '[' . $this->type . ']';
+        return $label;
+    }
+
+    /**
+     * Return this item's title
+     *
+     * This title should be used to display a tooltip (using the HTML title attribute). If
+     * a title property was not explicitly set, the label will be returned.
+     *
+     * @return string
+     */
+    public function getTitle() {
+        if($this->title === '') return $this->getLabel();
+        return $this->title;
+    }
+
+    /**
+     * Return the link this item links to
+     *
+     * Basically runs wl() on $id and $params. However if the ID is a hash it is used directly
+     * as the link
+     *
+     * Please note that the generated URL is *not* XML escaped.
+     *
+     * @see wl()
+     * @return string
+     */
+    public function getLink() {
+        if($this->id[0] == '#') {
+            return $this->id;
+        } else {
+            return wl($this->id, $this->params, false, '&');
+        }
+    }
+
+    /**
+     * Convenience method to get the attributes for constructing an <a> element
+     *
+     * @see buildAttributes()
+     * @param string|false $classprefix create a class from type with this prefix, false for no class
+     * @return array
+     */
+    public function getLinkAttributes($classprefix = 'menuitem ') {
+        $attr = array(
+            'href' => $this->getLink(),
+            'title' => $this->getTitle(),
+        );
+        if($this->isNofollow()) $attr['rel'] = 'nofollow';
+        if($this->getAccesskey()) {
+            $attr['accesskey'] = $this->getAccesskey();
+            $attr['title'] .= ' [' . $this->getAccesskey() . ']';
+        }
+        if($classprefix !== false) $attr['class'] = $classprefix . $this->getType();
+
+        return $attr;
+    }
+
+    /**
+     * Convenience method to create a full <a> element
+     *
+     * Wraps around the label and SVG image
+     *
+     * @param string|false $classprefix create a class from type with this prefix, false for no class
+     * @param bool $svg add SVG icon to the link
+     * @return string
+     */
+    public function asHtmlLink($classprefix = 'menuitem ', $svg = true) {
+        $attr = buildAttributes($this->getLinkAttributes($classprefix));
+        $html = "<a $attr>";
+        if($svg) {
+            $html .= '<span>' . hsc($this->getLabel()) . '</span>';
+            $html .= inlineSVG($this->getSvg());
+        } else {
+            $html .= hsc($this->getLabel());
+        }
+        $html .= "</a>";
+
+        return $html;
+    }
+
+    /**
+     * Convenience method to create a <button> element inside it's own form element
+     *
+     * Uses html_btn()
+     *
+     * @return string
+     */
+    public function asHtmlButton() {
+        return html_btn(
+            $this->getType(),
+            $this->id,
+            $this->getAccesskey(),
+            $this->getParams(),
+            $this->method,
+            $this->getTitle(),
+            $this->getLabel(),
+            $this->getSvg()
+        );
+    }
+
+    /**
+     * Should this item be shown in the given context
+     *
+     * @param int $ctx the current context
+     * @return bool
+     */
+    public function visibleInContext($ctx) {
+        return (bool) ($ctx & $this->context);
+    }
+
+    /**
+     * @return string the name of this item
+     */
+    public function getType() {
+        if($this->type === '') {
+            $this->type = strtolower(substr(strrchr(get_class($this), '\\'), 1));
+        }
+        return $this->type;
+    }
+
+    /**
+     * @return string
+     */
+    public function getAccesskey() {
+        return $this->accesskey;
+    }
+
+    /**
+     * @return array
+     */
+    public function getParams() {
+        return $this->params;
+    }
+
+    /**
+     * @return bool
+     */
+    public function isNofollow() {
+        return $this->nofollow;
+    }
+
+    /**
+     * @return string
+     */
+    public function getSvg() {
+        return $this->svg;
+    }
+
+    /**
+     * Return this Item's settings as an array as used in tpl_get_action()
+     *
+     * @return array
+     */
+    public function getLegacyData() {
+        return array(
+            'accesskey' => $this->accesskey ?: null,
+            'type' => $this->type,
+            'id' => $this->id,
+            'method' => $this->method,
+            'params' => $this->params,
+            'nofollow' => $this->nofollow,
+            'replacement' => $this->replacement
+        );
+    }
+}
diff --git a/wiki/inc/Menu/Item/Admin.php b/wiki/inc/Menu/Item/Admin.php
new file mode 100644
index 0000000..7302f0f
--- /dev/null
+++ b/wiki/inc/Menu/Item/Admin.php
@@ -0,0 +1,24 @@
+<?php
+
+namespace dokuwiki\Menu\Item;
+
+/**
+ * Class Admin
+ *
+ * Opens the Admin screen. Only shown to managers or above
+ */
+class Admin extends AbstractItem {
+
+    /** @inheritdoc */
+    public function __construct() {
+        global $INFO;
+        parent::__construct();
+
+        $this->svg = DOKU_INC . 'lib/images/menu/settings.svg';
+
+        if(!$INFO['ismanager']) {
+            throw new \RuntimeException("admin is for managers only");
+        }
+    }
+
+}
diff --git a/wiki/inc/Menu/Item/Back.php b/wiki/inc/Menu/Item/Back.php
new file mode 100644
index 0000000..a7cc1d9
--- /dev/null
+++ b/wiki/inc/Menu/Item/Back.php
@@ -0,0 +1,29 @@
+<?php
+
+namespace dokuwiki\Menu\Item;
+
+/**
+ * Class Back
+ *
+ * Navigates back up one namepspace. This is currently not used in any menu. Templates
+ * would need to add this item manually.
+ */
+class Back extends AbstractItem {
+
+    /** @inheritdoc */
+    public function __construct() {
+        global $ID;
+        parent::__construct();
+
+        $parent = tpl_getparent($ID);
+        if(!$parent) {
+            throw new \RuntimeException("No parent for back action");
+        }
+
+        $this->id = $parent;
+        $this->params = array('do' => '');
+        $this->accesskey = 'b';
+        $this->svg = DOKU_INC . 'lib/images/menu/12-back_arrow-left.svg';
+    }
+
+}
diff --git a/wiki/inc/Menu/Item/Backlink.php b/wiki/inc/Menu/Item/Backlink.php
new file mode 100644
index 0000000..6dc242b
--- /dev/null
+++ b/wiki/inc/Menu/Item/Backlink.php
@@ -0,0 +1,18 @@
+<?php
+
+namespace dokuwiki\Menu\Item;
+
+/**
+ * Class Backlink
+ *
+ * Shows the backlinks for the current page
+ */
+class Backlink extends AbstractItem {
+
+    /** @inheritdoc */
+    public function __construct() {
+        parent::__construct();
+        $this->svg = DOKU_INC . 'lib/images/menu/08-backlink_link-variant.svg';
+    }
+
+}
diff --git a/wiki/inc/Menu/Item/Edit.php b/wiki/inc/Menu/Item/Edit.php
new file mode 100644
index 0000000..5de1778
--- /dev/null
+++ b/wiki/inc/Menu/Item/Edit.php
@@ -0,0 +1,65 @@
+<?php
+
+namespace dokuwiki\Menu\Item;
+
+/**
+ * Class Edit
+ *
+ * Most complex item. Shows the edit button but mutates to show, draft and create based on
+ * current state.
+ */
+class Edit extends AbstractItem {
+
+    /** @inheritdoc */
+    public function __construct() {
+        global $ACT;
+        global $INFO;
+        global $REV;
+
+        parent::__construct();
+
+        if($ACT === 'show') {
+            $this->method = 'post';
+            if($INFO['writable']) {
+                $this->accesskey = 'e';
+                if(!empty($INFO['draft'])) {
+                    $this->type = 'draft';
+                    $this->params['do'] = 'draft';
+                } else {
+                    $this->params['rev'] = $REV;
+                    if(!$INFO['exists']) {
+                        $this->type = 'create';
+                    }
+                }
+            } else {
+                if(!actionOK($this->type)) throw new \RuntimeException("action disabled: source");
+                $params['rev'] = $REV;
+                $this->type = 'source';
+                $this->accesskey = 'v';
+            }
+        } else {
+            $this->params = array('do' => '');
+            $this->type = 'show';
+            $this->accesskey = 'v';
+        }
+
+        $this->setIcon();
+    }
+
+    /**
+     * change the icon according to what type the edit button has
+     */
+    protected function setIcon() {
+        $icons = array(
+            'edit' => '01-edit_pencil.svg',
+            'create' => '02-create_pencil.svg',
+            'draft' => '03-draft_android-studio.svg',
+            'show' => '04-show_file-document.svg',
+            'source' => '05-source_file-xml.svg',
+        );
+        if(isset($icons[$this->type])) {
+            $this->svg = DOKU_INC . 'lib/images/menu/' . $icons[$this->type];
+        }
+    }
+
+}
diff --git a/wiki/inc/Menu/Item/ImgBackto.php b/wiki/inc/Menu/Item/ImgBackto.php
new file mode 100644
index 0000000..72820a5
--- /dev/null
+++ b/wiki/inc/Menu/Item/ImgBackto.php
@@ -0,0 +1,24 @@
+<?php
+
+namespace dokuwiki\Menu\Item;
+
+/**
+ * Class ImgBackto
+ *
+ * Links back to the originating page from a detail image view
+ */
+class ImgBackto extends AbstractItem {
+
+    /** @inheritdoc */
+    public function __construct() {
+        global $ID;
+        parent::__construct();
+
+        $this->svg = DOKU_INC . 'lib/images/menu/12-back_arrow-left.svg';
+        $this->type = 'img_backto';
+        $this->params = array();
+        $this->accesskey = 'b';
+        $this->replacement = $ID;
+    }
+
+}
diff --git a/wiki/inc/Menu/Item/Index.php b/wiki/inc/Menu/Item/Index.php
new file mode 100644
index 0000000..4132673
--- /dev/null
+++ b/wiki/inc/Menu/Item/Index.php
@@ -0,0 +1,27 @@
+<?php
+
+namespace dokuwiki\Menu\Item;
+
+/**
+ * Class Index
+ *
+ * Shows the sitemap
+ */
+class Index extends AbstractItem {
+
+    /** @inheritdoc */
+    public function __construct() {
+        global $conf;
+        global $ID;
+        parent::__construct();
+
+        $this->accesskey = 'x';
+        $this->svg = DOKU_INC . 'lib/images/menu/file-tree.svg';
+
+        // allow searchbots to get to the sitemap from the homepage (when dokuwiki isn't providing a sitemap.xml)
+        if($conf['start'] == $ID && !$conf['sitemap']) {
+            $this->nofollow = false;
+        }
+    }
+
+}
diff --git a/wiki/inc/Menu/Item/Login.php b/wiki/inc/Menu/Item/Login.php
new file mode 100644
index 0000000..671f6a7
--- /dev/null
+++ b/wiki/inc/Menu/Item/Login.php
@@ -0,0 +1,29 @@
+<?php
+
+namespace dokuwiki\Menu\Item;
+
+/**
+ * Class Login
+ *
+ * Show a login or logout item, based on the current state
+ */
+class Login extends AbstractItem {
+
+    /** @inheritdoc */
+    public function __construct() {
+        global $INPUT;
+        parent::__construct();
+
+        $this->svg = DOKU_INC . 'lib/images/menu/login.svg';
+        $this->params['sectok'] = getSecurityToken();
+        if($INPUT->server->has('REMOTE_USER')) {
+            if(!actionOK('logout')) {
+                throw new \RuntimeException("logout disabled");
+            }
+            $this->params['do'] = 'logout';
+            $this->type = 'logout';
+            $this->svg = DOKU_INC . 'lib/images/menu/logout.svg';
+        }
+    }
+
+}
diff --git a/wiki/inc/Menu/Item/Media.php b/wiki/inc/Menu/Item/Media.php
new file mode 100644
index 0000000..0e5f47b
--- /dev/null
+++ b/wiki/inc/Menu/Item/Media.php
@@ -0,0 +1,21 @@
+<?php
+
+namespace dokuwiki\Menu\Item;
+
+/**
+ * Class Media
+ *
+ * Opens the media manager
+ */
+class Media extends AbstractItem {
+
+    /** @inheritdoc */
+    public function __construct() {
+        global $ID;
+        parent::__construct();
+
+        $this->svg = DOKU_INC . 'lib/images/menu/folder-multiple-image.svg';
+        $this->params['ns'] = getNS($ID);
+    }
+
+}
diff --git a/wiki/inc/Menu/Item/MediaManager.php b/wiki/inc/Menu/Item/MediaManager.php
new file mode 100644
index 0000000..8549d20
--- /dev/null
+++ b/wiki/inc/Menu/Item/MediaManager.php
@@ -0,0 +1,32 @@
+<?php
+
+namespace dokuwiki\Menu\Item;
+
+/**
+ * Class MediaManager
+ *
+ * Opens the current image in the media manager. Used on image detail view.
+ */
+class MediaManager extends AbstractItem {
+
+    /** @inheritdoc */
+    public function __construct() {
+        global $IMG;
+        parent::__construct();
+
+        $imgNS = getNS($IMG);
+        $authNS = auth_quickaclcheck("$imgNS:*");
+        if($authNS < AUTH_UPLOAD) {
+            throw new \RuntimeException("media manager link only with upload permissions");
+        }
+
+        $this->svg = DOKU_INC . 'lib/images/menu/11-mediamanager_folder-image.svg';
+        $this->type = 'mediaManager';
+        $this->params = array(
+            'ns' => $imgNS,
+            'image' => $IMG,
+            'do' => 'media'
+        );
+    }
+
+}
diff --git a/wiki/inc/Menu/Item/Profile.php b/wiki/inc/Menu/Item/Profile.php
new file mode 100644
index 0000000..2b4ceeb
--- /dev/null
+++ b/wiki/inc/Menu/Item/Profile.php
@@ -0,0 +1,24 @@
+<?php
+
+namespace dokuwiki\Menu\Item;
+
+/**
+ * Class Profile
+ *
+ * Open the user's profile
+ */
+class Profile extends AbstractItem {
+
+    /** @inheritdoc */
+    public function __construct() {
+        global $INPUT;
+        parent::__construct();
+
+        if(!$INPUT->server->str('REMOTE_USER')) {
+            throw new \RuntimeException("profile is only for logged in users");
+        }
+
+        $this->svg = DOKU_INC . 'lib/images/menu/account-card-details.svg';
+    }
+
+}
diff --git a/wiki/inc/Menu/Item/Recent.php b/wiki/inc/Menu/Item/Recent.php
new file mode 100644
index 0000000..ff90ce6
--- /dev/null
+++ b/wiki/inc/Menu/Item/Recent.php
@@ -0,0 +1,20 @@
+<?php
+
+namespace dokuwiki\Menu\Item;
+
+/**
+ * Class Recent
+ *
+ * Show the site wide recent changes
+ */
+class Recent extends AbstractItem {
+
+    /** @inheritdoc */
+    public function __construct() {
+        parent::__construct();
+
+        $this->accesskey = 'r';
+        $this->svg = DOKU_INC . 'lib/images/menu/calendar-clock.svg';
+    }
+
+}
diff --git a/wiki/inc/Menu/Item/Register.php b/wiki/inc/Menu/Item/Register.php
new file mode 100644
index 0000000..615146e
--- /dev/null
+++ b/wiki/inc/Menu/Item/Register.php
@@ -0,0 +1,24 @@
+<?php
+
+namespace dokuwiki\Menu\Item;
+
+/**
+ * Class Register
+ *
+ * Open the view to register a new account
+ */
+class Register extends AbstractItem {
+
+    /** @inheritdoc */
+    public function __construct() {
+        global $INPUT;
+        parent::__construct();
+
+        if($INPUT->server->str('REMOTE_USER')) {
+            throw new \RuntimeException("no register when already logged in");
+        }
+
+        $this->svg = DOKU_INC . 'lib/images/menu/account-plus.svg';
+    }
+
+}
diff --git a/wiki/inc/Menu/Item/Resendpwd.php b/wiki/inc/Menu/Item/Resendpwd.php
new file mode 100644
index 0000000..7ddc6b0
--- /dev/null
+++ b/wiki/inc/Menu/Item/Resendpwd.php
@@ -0,0 +1,24 @@
+<?php
+
+namespace dokuwiki\Menu\Item;
+
+/**
+ * Class Resendpwd
+ *
+ * Access the "forgot password" dialog
+ */
+class Resendpwd extends AbstractItem {
+
+    /** @inheritdoc */
+    public function __construct() {
+        global $INPUT;
+        parent::__construct();
+
+        if($INPUT->server->str('REMOTE_USER')) {
+            throw new \RuntimeException("no resendpwd when already logged in");
+        }
+
+        $this->svg = DOKU_INC . 'lib/images/menu/lock-reset.svg';
+    }
+
+}
diff --git a/wiki/inc/Menu/Item/Revert.php b/wiki/inc/Menu/Item/Revert.php
new file mode 100644
index 0000000..a360c68
--- /dev/null
+++ b/wiki/inc/Menu/Item/Revert.php
@@ -0,0 +1,26 @@
+<?php
+
+namespace dokuwiki\Menu\Item;
+
+/**
+ * Class Revert
+ *
+ * Quick revert to the currently shown page revision
+ */
+class Revert extends AbstractItem {
+
+    /** @inheritdoc */
+    public function __construct() {
+        global $REV;
+        global $INFO;
+        parent::__construct();
+
+        if(!$INFO['ismanager'] || !$REV || !$INFO['writable']) {
+            throw new \RuntimeException('revert not available');
+        }
+        $this->params['rev'] = $REV;
+        $this->params['sectok'] = getSecurityToken();
+        $this->svg = DOKU_INC . 'lib/images/menu/06-revert_replay.svg';
+    }
+
+}
diff --git a/wiki/inc/Menu/Item/Revisions.php b/wiki/inc/Menu/Item/Revisions.php
new file mode 100644
index 0000000..3009a79
--- /dev/null
+++ b/wiki/inc/Menu/Item/Revisions.php
@@ -0,0 +1,21 @@
+<?php
+
+namespace dokuwiki\Menu\Item;
+
+/**
+ * Class Revisions
+ *
+ * Access the old revisions of the current page
+ */
+class Revisions extends AbstractItem {
+
+    /** @inheritdoc */
+    public function __construct() {
+        parent::__construct();
+
+        $this->accesskey = 'o';
+        $this->type = 'revs';
+        $this->svg = DOKU_INC . 'lib/images/menu/07-revisions_history.svg';
+    }
+
+}
diff --git a/wiki/inc/Menu/Item/Subscribe.php b/wiki/inc/Menu/Item/Subscribe.php
new file mode 100644
index 0000000..1c9d335
--- /dev/null
+++ b/wiki/inc/Menu/Item/Subscribe.php
@@ -0,0 +1,24 @@
+<?php
+
+namespace dokuwiki\Menu\Item;
+
+/**
+ * Class Subscribe
+ *
+ * Access the subscription management view
+ */
+class Subscribe extends AbstractItem {
+
+    /** @inheritdoc */
+    public function __construct() {
+        global $INPUT;
+        parent::__construct();
+
+        if(!$INPUT->server->str('REMOTE_USER')) {
+            throw new \RuntimeException("subscribe is only for logged in users");
+        }
+
+        $this->svg = DOKU_INC . 'lib/images/menu/09-subscribe_email-outline.svg';
+    }
+
+}
diff --git a/wiki/inc/Menu/Item/Top.php b/wiki/inc/Menu/Item/Top.php
new file mode 100644
index 0000000..a05c4f1
--- /dev/null
+++ b/wiki/inc/Menu/Item/Top.php
@@ -0,0 +1,36 @@
+<?php
+
+namespace dokuwiki\Menu\Item;
+
+/**
+ * Class Top
+ *
+ * Scroll back to the top. Uses a hash as $id which is handled special in getLink().
+ * Not shown in mobile context
+ */
+class Top extends AbstractItem {
+
+    /** @inheritdoc */
+    public function __construct() {
+        parent::__construct();
+
+        $this->svg = DOKU_INC . 'lib/images/menu/10-top_arrow-up.svg';
+        $this->accesskey = 't';
+        $this->params = array('do' => '');
+        $this->id = '#dokuwiki__top';
+        $this->context = self::CTX_DESKTOP;
+    }
+
+    /**
+     * Convenience method to create a <button> element
+     *
+     * Uses html_topbtn()
+     *
+     * @todo this does currently not support the SVG icon
+     * @return string
+     */
+    public function asHtmlButton() {
+        return html_topbtn();
+    }
+
+}
diff --git a/wiki/inc/Menu/MenuInterface.php b/wiki/inc/Menu/MenuInterface.php
new file mode 100644
index 0000000..91dde9d
--- /dev/null
+++ b/wiki/inc/Menu/MenuInterface.php
@@ -0,0 +1,20 @@
+<?php
+
+namespace dokuwiki\Menu;
+
+use dokuwiki\Menu\Item\AbstractItem;
+
+/**
+ * Interface MenuInterface
+ *
+ * Defines what a Menu provides
+ */
+Interface MenuInterface {
+
+    /**
+     * Get the list of action items in this menu
+     *
+     * @return AbstractItem[]
+     */
+    public function getItems();
+}
diff --git a/wiki/inc/Menu/MobileMenu.php b/wiki/inc/Menu/MobileMenu.php
new file mode 100644
index 0000000..29e17d1
--- /dev/null
+++ b/wiki/inc/Menu/MobileMenu.php
@@ -0,0 +1,91 @@
+<?php
+
+namespace dokuwiki\Menu;
+
+use dokuwiki\Menu\Item\AbstractItem;
+
+/**
+ * Class MobileMenu
+ *
+ * Note: this does not inherit from AbstractMenu because it is not working like the other
+ * menus. This is a meta menu, aggregating the items from the other menus and offering a combined
+ * view. The idea is to use this on mobile devices, thus the context is fixed to CTX_MOBILE
+ */
+class MobileMenu implements MenuInterface {
+
+    /**
+     * Returns all items grouped by view
+     *
+     * @return AbstractItem[][]
+     */
+    public function getGroupedItems() {
+        $pagemenu = new PageMenu(AbstractItem::CTX_MOBILE);
+        $sitemenu = new SiteMenu(AbstractItem::CTX_MOBILE);
+        $usermenu = new UserMenu(AbstractItem::CTX_MOBILE);
+
+        return array(
+            'page' => $pagemenu->getItems(),
+            'site' => $sitemenu->getItems(),
+            'user' => $usermenu->getItems()
+        );
+    }
+
+    /**
+     * Get all items in a flat array
+     *
+     * This returns the same format as AbstractMenu::getItems()
+     *
+     * @return AbstractItem[]
+     */
+    public function getItems() {
+        $menu = $this->getGroupedItems();
+        return call_user_func_array('array_merge', array_values($menu));
+    }
+
+    /**
+     * Print a dropdown menu with all DokuWiki actions
+     *
+     * Note: this will not use any pretty URLs
+     *
+     * @param string $empty empty option label
+     * @param string $button submit button label
+     * @return string
+     */
+    public function getDropdown($empty = '', $button = '&gt;') {
+        global $ID;
+        global $REV;
+        /** @var string[] $lang */
+        global $lang;
+        global $INPUT;
+
+        $html = '<form action="' . script() . '" method="get" accept-charset="utf-8">';
+        $html .= '<div class="no">';
+        $html .= '<input type="hidden" name="id" value="' . $ID . '" />';
+        if($REV) $html .= '<input type="hidden" name="rev" value="' . $REV . '" />';
+        if($INPUT->server->str('REMOTE_USER')) {
+            $html .= '<input type="hidden" name="sectok" value="' . getSecurityToken() . '" />';
+        }
+
+        $html .= '<select name="do" class="edit quickselect" title="' . $lang['tools'] . '">';
+        $html .= '<option value="">' . $empty . '</option>';
+
+        foreach($this->getGroupedItems() as $tools => $items) {
+            $html .= '<optgroup label="' . $lang[$tools . '_tools'] . '">';
+            foreach($items as $item) {
+                $params = $item->getParams();
+                $html .= '<option value="' . $params['do'] . '">';
+                $html .= hsc($item->getLabel());
+                $html .= '</option>';
+            }
+            $html .= '</optgroup>';
+        }
+
+        $html .= '</select>';
+        $html .= '<button type="submit">' . $button . '</button>';
+        $html .= '</div>';
+        $html .= '</form>';
+
+        return $html;
+    }
+
+}
diff --git a/wiki/inc/Menu/PageMenu.php b/wiki/inc/Menu/PageMenu.php
new file mode 100644
index 0000000..9c0a55e
--- /dev/null
+++ b/wiki/inc/Menu/PageMenu.php
@@ -0,0 +1,23 @@
+<?php
+
+namespace dokuwiki\Menu;
+
+/**
+ * Class PageMenu
+ *
+ * Actions manipulating the current page. Shown as a floating menu in the dokuwiki template
+ */
+class PageMenu extends AbstractMenu {
+
+    protected $view = 'page';
+
+    protected $types = array(
+        'Edit',
+        'Revert',
+        'Revisions',
+        'Backlink',
+        'Subscribe',
+        'Top',
+    );
+
+}
diff --git a/wiki/inc/Menu/SiteMenu.php b/wiki/inc/Menu/SiteMenu.php
new file mode 100644
index 0000000..dba6888
--- /dev/null
+++ b/wiki/inc/Menu/SiteMenu.php
@@ -0,0 +1,20 @@
+<?php
+
+namespace dokuwiki\Menu;
+
+/**
+ * Class SiteMenu
+ *
+ * Actions that are not bound to an individual page but provide toolsfor the whole wiki.
+ */
+class SiteMenu extends AbstractMenu {
+
+    protected $view = 'site';
+
+    protected $types = array(
+        'Recent',
+        'Media',
+        'Index'
+    );
+
+}
diff --git a/wiki/inc/Menu/UserMenu.php b/wiki/inc/Menu/UserMenu.php
new file mode 100644
index 0000000..01028d3
--- /dev/null
+++ b/wiki/inc/Menu/UserMenu.php
@@ -0,0 +1,21 @@
+<?php
+
+namespace dokuwiki\Menu;
+
+/**
+ * Class UserMenu
+ *
+ * Actions related to the current user
+ */
+class UserMenu extends AbstractMenu {
+
+    protected $view = 'user';
+
+    protected $types = array(
+        'Profile',
+        'Admin',
+        'Register',
+        'Login',
+    );
+
+}
diff --git a/wiki/inc/PassHash.class.php b/wiki/inc/PassHash.class.php
new file mode 100644
index 0000000..3d03c1e
--- /dev/null
+++ b/wiki/inc/PassHash.class.php
@@ -0,0 +1,639 @@
+<?php
+/**
+ * Password Hashing Class
+ *
+ * This class implements various mechanisms used to hash passwords
+ *
+ * @author  Andreas Gohr <andi@splitbrain.org>
+ * @license LGPL2
+ */
+class PassHash {
+    /**
+     * Verifies a cleartext password against a crypted hash
+     *
+     * The method and salt used for the crypted hash is determined automatically,
+     * then the clear text password is crypted using the same method. If both hashs
+     * match true is is returned else false
+     *
+     * @author  Andreas Gohr <andi@splitbrain.org>
+     *
+     * @param string $clear Clear-Text password
+     * @param string $hash  Hash to compare against
+     * @return  bool
+     */
+    function verify_hash($clear, $hash) {
+        $method = '';
+        $salt   = '';
+        $magic  = '';
+
+        //determine the used method and salt
+        $len = strlen($hash);
+        if(preg_match('/^\$1\$([^\$]{0,8})\$/', $hash, $m)) {
+            $method = 'smd5';
+            $salt   = $m[1];
+            $magic  = '1';
+        } elseif(preg_match('/^\$apr1\$([^\$]{0,8})\$/', $hash, $m)) {
+            $method = 'apr1';
+            $salt   = $m[1];
+            $magic  = 'apr1';
+        } elseif(preg_match('/^\$P\$(.{31})$/', $hash, $m)) {
+            $method = 'pmd5';
+            $salt   = $m[1];
+            $magic  = 'P';
+        } elseif(preg_match('/^\$H\$(.{31})$/', $hash, $m)) {
+            $method = 'pmd5';
+            $salt = $m[1];
+            $magic = 'H';
+        } elseif(preg_match('/^pbkdf2_(\w+?)\$(\d+)\$(.{12})\$/', $hash, $m)) {
+            $method = 'djangopbkdf2';
+            $magic = array(
+                'algo' => $m[1],
+                'iter' => $m[2],
+            );
+            $salt = $m[3];
+        } elseif(preg_match('/^sha1\$(.{5})\$/', $hash, $m)) {
+            $method = 'djangosha1';
+            $salt   = $m[1];
+        } elseif(preg_match('/^md5\$(.{5})\$/', $hash, $m)) {
+            $method = 'djangomd5';
+            $salt   = $m[1];
+        } elseif(preg_match('/^\$2(a|y)\$(.{2})\$/', $hash, $m)) {
+            $method = 'bcrypt';
+            $salt   = $hash;
+        } elseif(substr($hash, 0, 6) == '{SSHA}') {
+            $method = 'ssha';
+            $salt   = substr(base64_decode(substr($hash, 6)), 20);
+        } elseif(substr($hash, 0, 6) == '{SMD5}') {
+            $method = 'lsmd5';
+            $salt   = substr(base64_decode(substr($hash, 6)), 16);
+        } elseif(preg_match('/^:B:(.+?):.{32}$/', $hash, $m)) {
+            $method = 'mediawiki';
+            $salt   = $m[1];
+        } elseif(preg_match('/^\$6\$(.+?)\$/', $hash, $m)) {
+            $method = 'sha512';
+            $salt   = $m[1];
+        } elseif($len == 32) {
+            $method = 'md5';
+        } elseif($len == 40) {
+            $method = 'sha1';
+        } elseif($len == 16) {
+            $method = 'mysql';
+        } elseif($len == 41 && $hash[0] == '*') {
+            $method = 'my411';
+        } elseif($len == 34) {
+            $method = 'kmd5';
+            $salt   = $hash;
+        } else {
+            $method = 'crypt';
+            $salt   = substr($hash, 0, 2);
+        }
+
+        //crypt and compare
+        $call = 'hash_'.$method;
+        $newhash = $this->$call($clear, $salt, $magic);
+        if(\hash_equals($newhash, $hash)) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * Create a random salt
+     *
+     * @param int $len The length of the salt
+     * @return string
+     */
+    public function gen_salt($len = 32) {
+        $salt  = '';
+        $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
+        for($i = 0; $i < $len; $i++) {
+            $salt .= $chars[$this->random(0, 61)];
+        }
+        return $salt;
+    }
+
+    /**
+     * Initialize the passed variable with a salt if needed.
+     *
+     * If $salt is not null, the value is kept, but the lenght restriction is
+     * applied (unless, $cut is false).
+     *
+     * @param string|null &$salt  The salt, pass null if you want one generated
+     * @param int          $len   The length of the salt
+     * @param bool         $cut   Apply length restriction to existing salt?
+     */
+    public function init_salt(&$salt, $len = 32, $cut = true) {
+        if(is_null($salt)) {
+            $salt = $this->gen_salt($len);
+            $cut  = true; // for new hashes we alway apply length restriction
+        }
+        if(strlen($salt) > $len && $cut) $salt = substr($salt, 0, $len);
+    }
+
+    // Password hashing methods follow below
+
+    /**
+     * Password hashing method 'smd5'
+     *
+     * Uses salted MD5 hashs. Salt is 8 bytes long.
+     *
+     * The same mechanism is used by Apache's 'apr1' method. This will
+     * fallback to a implementation in pure PHP if MD5 support is not
+     * available in crypt()
+     *
+     * @author Andreas Gohr <andi@splitbrain.org>
+     * @author <mikey_nich at hotmail dot com>
+     * @link   http://php.net/manual/en/function.crypt.php#73619
+     *
+     * @param string $clear The clear text to hash
+     * @param string $salt  The salt to use, null for random
+     * @return string Hashed password
+     */
+    public function hash_smd5($clear, $salt = null) {
+        $this->init_salt($salt, 8);
+
+        if(defined('CRYPT_MD5') && CRYPT_MD5 && $salt !== '') {
+            return crypt($clear, '$1$'.$salt.'$');
+        } else {
+            // Fall back to PHP-only implementation
+            return $this->hash_apr1($clear, $salt, '1');
+        }
+    }
+
+    /**
+     * Password hashing method 'lsmd5'
+     *
+     * Uses salted MD5 hashs. Salt is 8 bytes long.
+     *
+     * This is the format used by LDAP.
+     *
+     * @param string $clear The clear text to hash
+     * @param string $salt  The salt to use, null for random
+     * @return string Hashed password
+     */
+    public function hash_lsmd5($clear, $salt = null) {
+        $this->init_salt($salt, 8);
+        return "{SMD5}".base64_encode(md5($clear.$salt, true).$salt);
+    }
+
+    /**
+     * Password hashing method 'apr1'
+     *
+     * Uses salted MD5 hashs. Salt is 8 bytes long.
+     *
+     * This is basically the same as smd1 above, but as used by Apache.
+     *
+     * @author <mikey_nich at hotmail dot com>
+     * @link   http://php.net/manual/en/function.crypt.php#73619
+     *
+     * @param string $clear The clear text to hash
+     * @param string $salt  The salt to use, null for random
+     * @param string $magic The hash identifier (apr1 or 1)
+     * @return string Hashed password
+     */
+    public function hash_apr1($clear, $salt = null, $magic = 'apr1') {
+        $this->init_salt($salt, 8);
+
+        $len  = strlen($clear);
+        $text = $clear.'$'.$magic.'$'.$salt;
+        $bin  = pack("H32", md5($clear.$salt.$clear));
+        for($i = $len; $i > 0; $i -= 16) {
+            $text .= substr($bin, 0, min(16, $i));
+        }
+        for($i = $len; $i > 0; $i >>= 1) {
+            $text .= ($i & 1) ? chr(0) : $clear{0};
+        }
+        $bin = pack("H32", md5($text));
+        for($i = 0; $i < 1000; $i++) {
+            $new = ($i & 1) ? $clear : $bin;
+            if($i % 3) $new .= $salt;
+            if($i % 7) $new .= $clear;
+            $new .= ($i & 1) ? $bin : $clear;
+            $bin = pack("H32", md5($new));
+        }
+        $tmp = '';
+        for($i = 0; $i < 5; $i++) {
+            $k = $i + 6;
+            $j = $i + 12;
+            if($j == 16) $j = 5;
+            $tmp = $bin[$i].$bin[$k].$bin[$j].$tmp;
+        }
+        $tmp = chr(0).chr(0).$bin[11].$tmp;
+        $tmp = strtr(
+            strrev(substr(base64_encode($tmp), 2)),
+            "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
+            "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
+        );
+        return '$'.$magic.'$'.$salt.'$'.$tmp;
+    }
+
+    /**
+     * Password hashing method 'md5'
+     *
+     * Uses MD5 hashs.
+     *
+     * @param string $clear The clear text to hash
+     * @return string Hashed password
+     */
+    public function hash_md5($clear) {
+        return md5($clear);
+    }
+
+    /**
+     * Password hashing method 'sha1'
+     *
+     * Uses SHA1 hashs.
+     *
+     * @param string $clear The clear text to hash
+     * @return string Hashed password
+     */
+    public function hash_sha1($clear) {
+        return sha1($clear);
+    }
+
+    /**
+     * Password hashing method 'ssha' as used by LDAP
+     *
+     * Uses salted SHA1 hashs. Salt is 4 bytes long.
+     *
+     * @param string $clear The clear text to hash
+     * @param string $salt  The salt to use, null for random
+     * @return string Hashed password
+     */
+    public function hash_ssha($clear, $salt = null) {
+        $this->init_salt($salt, 4);
+        return '{SSHA}'.base64_encode(pack("H*", sha1($clear.$salt)).$salt);
+    }
+
+    /**
+     * Password hashing method 'crypt'
+     *
+     * Uses salted crypt hashs. Salt is 2 bytes long.
+     *
+     * @param string $clear The clear text to hash
+     * @param string $salt  The salt to use, null for random
+     * @return string Hashed password
+     */
+    public function hash_crypt($clear, $salt = null) {
+        $this->init_salt($salt, 2);
+        return crypt($clear, $salt);
+    }
+
+    /**
+     * Password hashing method 'mysql'
+     *
+     * This method was used by old MySQL systems
+     *
+     * @link   http://php.net/mysql
+     * @author <soren at byu dot edu>
+     * @param string $clear The clear text to hash
+     * @return string Hashed password
+     */
+    public function hash_mysql($clear) {
+        $nr      = 0x50305735;
+        $nr2     = 0x12345671;
+        $add     = 7;
+        $charArr = preg_split("//", $clear);
+        foreach($charArr as $char) {
+            if(($char == '') || ($char == ' ') || ($char == '\t')) continue;
+            $charVal = ord($char);
+            $nr ^= ((($nr & 63) + $add) * $charVal) + ($nr << 8);
+            $nr2 += ($nr2 << 8) ^ $nr;
+            $add += $charVal;
+        }
+        return sprintf("%08x%08x", ($nr & 0x7fffffff), ($nr2 & 0x7fffffff));
+    }
+
+    /**
+     * Password hashing method 'my411'
+     *
+     * Uses SHA1 hashs. This method is used by MySQL 4.11 and above
+     *
+     * @param string $clear The clear text to hash
+     * @return string Hashed password
+     */
+    public function hash_my411($clear) {
+        return '*'.strtoupper(sha1(pack("H*", sha1($clear))));
+    }
+
+    /**
+     * Password hashing method 'kmd5'
+     *
+     * Uses salted MD5 hashs.
+     *
+     * Salt is 2 bytes long, but stored at position 16, so you need to pass at
+     * least 18 bytes. You can pass the crypted hash as salt.
+     *
+     * @param string $clear The clear text to hash
+     * @param string $salt  The salt to use, null for random
+     * @return string Hashed password
+     */
+    public function hash_kmd5($clear, $salt = null) {
+        $this->init_salt($salt);
+
+        $key   = substr($salt, 16, 2);
+        $hash1 = strtolower(md5($key.md5($clear)));
+        $hash2 = substr($hash1, 0, 16).$key.substr($hash1, 16);
+        return $hash2;
+    }
+
+    /**
+     * Password hashing method 'pmd5'
+     *
+     * Uses salted MD5 hashs. Salt is 1+8 bytes long, 1st byte is the
+     * iteration count when given, for null salts $compute is used.
+     *
+     * The actual iteration count is the given count squared, maximum is
+     * 30 (-> 1073741824). If a higher one is given, the function throws
+     * an exception.
+     *
+     * @link  http://www.openwall.com/phpass/
+     *
+     * @param string $clear   The clear text to hash
+     * @param string $salt    The salt to use, null for random
+     * @param string $magic   The hash identifier (P or H)
+     * @param int    $compute The iteration count for new passwords
+     * @throws Exception
+     * @return string Hashed password
+     */
+    public function hash_pmd5($clear, $salt = null, $magic = 'P', $compute = 8) {
+        $itoa64 = './0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
+        if(is_null($salt)) {
+            $this->init_salt($salt);
+            $salt = $itoa64[$compute].$salt; // prefix iteration count
+        }
+        $iterc = $salt[0]; // pos 0 of salt is iteration count
+        $iter  = strpos($itoa64, $iterc);
+
+        if($iter > 30) {
+            throw new Exception("Too high iteration count ($iter) in ".
+                                    __CLASS__.'::'.__FUNCTION__);
+        }
+
+        $iter = 1 << $iter;
+        $salt = substr($salt, 1, 8);
+
+        // iterate
+        $hash = md5($salt.$clear, true);
+        do {
+            $hash = md5($hash.$clear, true);
+        } while(--$iter);
+
+        // encode
+        $output = '';
+        $count  = 16;
+        $i      = 0;
+        do {
+            $value = ord($hash[$i++]);
+            $output .= $itoa64[$value & 0x3f];
+            if($i < $count)
+                $value |= ord($hash[$i]) << 8;
+            $output .= $itoa64[($value >> 6) & 0x3f];
+            if($i++ >= $count)
+                break;
+            if($i < $count)
+                $value |= ord($hash[$i]) << 16;
+            $output .= $itoa64[($value >> 12) & 0x3f];
+            if($i++ >= $count)
+                break;
+            $output .= $itoa64[($value >> 18) & 0x3f];
+        } while($i < $count);
+
+        return '$'.$magic.'$'.$iterc.$salt.$output;
+    }
+
+    /**
+     * Alias for hash_pmd5
+     *
+     * @param string $clear
+     * @param null|string $salt
+     * @param string $magic
+     * @param int $compute
+     *
+     * @return string
+     */
+    public function hash_hmd5($clear, $salt = null, $magic = 'H', $compute = 8) {
+        return $this->hash_pmd5($clear, $salt, $magic, $compute);
+    }
+
+    /**
+     * Password hashing method 'djangosha1'
+     *
+     * Uses salted SHA1 hashs. Salt is 5 bytes long.
+     * This is used by the Django Python framework
+     *
+     * @link http://docs.djangoproject.com/en/dev/topics/auth/#passwords
+     *
+     * @param string $clear The clear text to hash
+     * @param string $salt  The salt to use, null for random
+     * @return string Hashed password
+     */
+    public function hash_djangosha1($clear, $salt = null) {
+        $this->init_salt($salt, 5);
+        return 'sha1$'.$salt.'$'.sha1($salt.$clear);
+    }
+
+    /**
+     * Password hashing method 'djangomd5'
+     *
+     * Uses salted MD5 hashs. Salt is 5 bytes long.
+     * This is used by the Django Python framework
+     *
+     * @link http://docs.djangoproject.com/en/dev/topics/auth/#passwords
+     *
+     * @param string $clear The clear text to hash
+     * @param string $salt  The salt to use, null for random
+     * @return string Hashed password
+     */
+    public function hash_djangomd5($clear, $salt = null) {
+        $this->init_salt($salt, 5);
+        return 'md5$'.$salt.'$'.md5($salt.$clear);
+    }
+
+    /**
+     * Password hashing method 'djangopbkdf2'
+     *
+     * An algorithm and iteration count should be given in the opts array.
+     * Defaults to sha256 and 24000 iterations
+     *
+     * @param string $clear The clear text to hash
+     * @param string $salt  The salt to use, null for random
+     * @param array $opts ('algo' => hash algorithm, 'iter' => iterations)
+     * @return string Hashed password
+     * @throws Exception when PHP is missing support for the method/algo
+     */
+    public function hash_djangopbkdf2($clear, $salt=null, $opts=array()) {
+        $this->init_salt($salt, 12);
+        if(empty($opts['algo'])) {
+            $algo = 'sha256';
+        } else {
+            $algo = $opts['algo'];
+        }
+        if(empty($opts['iter'])) {
+            $iter = 24000;
+        } else {
+            $iter = (int) $opts['iter'];
+        }
+        if(!function_exists('hash_pbkdf2')) {
+            throw new Exception('This PHP installation has no PBKDF2 support');
+        }
+        if(!in_array($algo, hash_algos())) {
+            throw new Exception("This PHP installation has no $algo support");
+        }
+
+        $hash = base64_encode(hash_pbkdf2($algo, $clear, $salt, $iter, 0, true));
+        return "pbkdf2_$algo\$$iter\$$salt\$$hash";
+    }
+
+    /**
+     * Alias for djangopbkdf2 defaulting to sha256 as hash algorithm
+     *
+     * @param string $clear The clear text to hash
+     * @param string $salt  The salt to use, null for random
+     * @param array $opts ('iter' => iterations)
+     * @return string Hashed password
+     * @throws Exception when PHP is missing support for the method/algo
+     */
+    public function hash_djangopbkdf2_sha256($clear, $salt=null, $opts=array()) {
+        $opts['algo'] = 'sha256';
+        return $this->hash_djangopbkdf2($clear, $salt, $opts);
+    }
+
+    /**
+     * Alias for djangopbkdf2 defaulting to sha1 as hash algorithm
+     *
+     * @param string $clear The clear text to hash
+     * @param string $salt  The salt to use, null for random
+     * @param array $opts ('iter' => iterations)
+     * @return string Hashed password
+     * @throws Exception when PHP is missing support for the method/algo
+     */
+    public function hash_djangopbkdf2_sha1($clear, $salt=null, $opts=array()) {
+        $opts['algo'] = 'sha1';
+        return $this->hash_djangopbkdf2($clear, $salt, $opts);
+    }
+
+    /**
+     * Passwordhashing method 'bcrypt'
+     *
+     * Uses a modified blowfish algorithm called eksblowfish
+     * This method works on PHP 5.3+ only and will throw an exception
+     * if the needed crypt support isn't available
+     *
+     * A full hash should be given as salt (starting with $a2$) or this
+     * will break. When no salt is given, the iteration count can be set
+     * through the $compute variable.
+     *
+     * @param string $clear   The clear text to hash
+     * @param string $salt    The salt to use, null for random
+     * @param int    $compute The iteration count (between 4 and 31)
+     * @throws Exception
+     * @return string Hashed password
+     */
+    public function hash_bcrypt($clear, $salt = null, $compute = 10) {
+        if(!defined('CRYPT_BLOWFISH') || CRYPT_BLOWFISH != 1) {
+            throw new Exception('This PHP installation has no bcrypt support');
+        }
+
+        if(is_null($salt)) {
+            if($compute < 4 || $compute > 31) $compute = 8;
+            $salt = '$2y$'.str_pad($compute, 2, '0', STR_PAD_LEFT).'$'.
+                $this->gen_salt(22);
+        }
+
+        return crypt($clear, $salt);
+    }
+
+    /**
+     * Password hashing method SHA512
+     *
+     * This is only supported on PHP 5.3.2 or higher and will throw an exception if
+     * the needed crypt support is not available
+     *
+     * @param string $clear The clear text to hash
+     * @param string $salt  The salt to use, null for random
+     * @return string Hashed password
+     * @throws Exception
+     */
+    public function hash_sha512($clear, $salt = null) {
+        if(!defined('CRYPT_SHA512') || CRYPT_SHA512 != 1) {
+            throw new Exception('This PHP installation has no SHA512 support');
+        }
+        $this->init_salt($salt, 8, false);
+        return crypt($clear, '$6$'.$salt.'$');
+    }
+
+    /**
+     * Password hashing method 'mediawiki'
+     *
+     * Uses salted MD5, this is referred to as Method B in MediaWiki docs. Unsalted md5
+     * method 'A' is not supported.
+     *
+     * @link  http://www.mediawiki.org/wiki/Manual_talk:User_table#user_password_column
+     *
+     * @param string $clear The clear text to hash
+     * @param string $salt  The salt to use, null for random
+     * @return string Hashed password
+     */
+    public function hash_mediawiki($clear, $salt = null) {
+        $this->init_salt($salt, 8, false);
+        return ':B:'.$salt.':'.md5($salt.'-'.md5($clear));
+    }
+
+    /**
+     * Wraps around native hash_hmac() or reimplents it
+     *
+     * This is not directly used as password hashing method, and thus isn't callable via the
+     * verify_hash() method. It should be used to create signatures and might be used in other
+     * password hashing methods.
+     *
+     * @see hash_hmac()
+     * @author KC Cloyd
+     * @link http://php.net/manual/en/function.hash-hmac.php#93440
+     *
+     * @param string $algo Name of selected hashing algorithm (i.e. "md5", "sha256", "haval160,4",
+     *                     etc..) See hash_algos() for a list of supported algorithms.
+     * @param string $data Message to be hashed.
+     * @param string $key  Shared secret key used for generating the HMAC variant of the message digest.
+     * @param bool $raw_output When set to TRUE, outputs raw binary data. FALSE outputs lowercase hexits.
+     * @return string
+     */
+    public static function hmac($algo, $data, $key, $raw_output = false) {
+        // use native function if available and not in unit test
+        if(function_exists('hash_hmac') && !defined('SIMPLE_TEST')){
+            return hash_hmac($algo, $data, $key, $raw_output);
+        }
+
+        $algo = strtolower($algo);
+        $pack = 'H' . strlen($algo('test'));
+        $size = 64;
+        $opad = str_repeat(chr(0x5C), $size);
+        $ipad = str_repeat(chr(0x36), $size);
+
+        if(strlen($key) > $size) {
+            $key = str_pad(pack($pack, $algo($key)), $size, chr(0x00));
+        } else {
+            $key = str_pad($key, $size, chr(0x00));
+        }
+
+        for($i = 0; $i < strlen($key) - 1; $i++) {
+            $opad[$i] = $opad[$i] ^ $key[$i];
+            $ipad[$i] = $ipad[$i] ^ $key[$i];
+        }
+
+        $output = $algo($opad . pack($pack, $algo($ipad . $data)));
+
+        return ($raw_output) ? pack($pack, $output) : $output;
+    }
+
+    /**
+     * Use DokuWiki's secure random generator if available
+     *
+     * @param int $min
+     * @param int $max
+     * @return int
+     */
+    protected function random($min, $max){
+        return random_int($min, $max);
+    }
+}
diff --git a/wiki/inc/Plugin.php b/wiki/inc/Plugin.php
new file mode 100644
index 0000000..9cd0ae8
--- /dev/null
+++ b/wiki/inc/Plugin.php
@@ -0,0 +1,11 @@
+<?php
+
+/**
+ * DokuWiki Plugin
+ *
+ * Most of DokuWiki's plugin types simply inherit from this. All it does is
+ * add the DokuWiki_PluginTrait to the class.
+ */
+class DokuWiki_Plugin implements DokuWiki_PluginInterface {
+    use DokuWiki_PluginTrait;
+}
diff --git a/wiki/inc/PluginInterface.php b/wiki/inc/PluginInterface.php
new file mode 100644
index 0000000..6089890
--- /dev/null
+++ b/wiki/inc/PluginInterface.php
@@ -0,0 +1,158 @@
+<?php
+/**
+ * DokuWiki Plugin Interface
+ *
+ * Defines the public contract all DokuWiki plugins will adhere to. The actual code
+ * to do so is defined in DokuWiki_PluginTrait
+ *
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author     Christopher Smith <chris@jalakai.co.uk>
+ */
+interface DokuWiki_PluginInterface {
+    /**
+     * General Info
+     *
+     * Needs to return a associative array with the following values:
+     *
+     * base   - the plugin's base name (eg. the directory it needs to be installed in)
+     * 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)
+     */
+    public function getInfo();
+
+    /**
+     * The type of the plugin inferred from the class name
+     *
+     * @return string  plugin type
+     */
+    public function getPluginType();
+
+    /**
+     * The name of the plugin inferred from the class name
+     *
+     * @return string  plugin name
+     */
+    public function getPluginName();
+
+    /**
+     * The component part of the plugin inferred from the class name
+     *
+     * @return string component name
+     */
+    public function getPluginComponent();
+
+    /**
+     * 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 in appropriate language or english if not available
+     */
+    public function getLang($id);
+
+    /**
+     * retrieve a language dependent file 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
+     */
+    public function locale_xhtml($id);
+
+    /**
+     * Prepends appropriate path for a language dependent filename
+     * plugin equivalent of localFN()
+     *
+     * @param string $id id of localization file
+     * @param  string $ext The file extension (usually txt)
+     * @return string wiki text
+     */
+    public function localFN($id, $ext = 'txt');
+
+    /**
+     * Reads all the plugins language dependent strings into $this->lang
+     * this function is automatically called by getLang()
+     *
+     * @todo this could be made protected and be moved to the trait only
+     */
+    public function setupLocale();
+
+    /**
+     * use this function to access plugin configuration variables
+     *
+     * @param string $setting the setting to access
+     * @param mixed $notset what to return if the setting is not available
+     * @return mixed
+     */
+    public function getConf($setting, $notset = false);
+
+    /**
+     * merges the plugin's default settings with any local settings
+     * this function is automatically called through getConf()
+     *
+     * @todo this could be made protected and be moved to the trait only
+     */
+    public function loadConfig();
+
+    /**
+     * Loads a given helper plugin (if enabled)
+     *
+     * @author  Esther Brunner <wikidesign@gmail.com>
+     *
+     * @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  DokuWiki_PluginInterface|null helper plugin object
+     */
+    public function loadHelper($name, $msg = true);
+
+    /**
+     * email
+     * standardised function to generate an email link according to obfuscation settings
+     *
+     * @param string $email
+     * @param string $name
+     * @param string $class
+     * @param string $more
+     * @return string html
+     */
+    public function email($email, $name = '', $class = '', $more = '');
+
+    /**
+     * external_link
+     * standardised function to generate an external link according to conf settings
+     *
+     * @param string $link
+     * @param string $title
+     * @param string $class
+     * @param string $target
+     * @param string $more
+     * @return string
+     */
+    public function external_link($link, $title = '', $class = '', $target = '', $more = '');
+
+    /**
+     * output text string through the parser, allows dokuwiki markup to be used
+     * very ineffecient for small pieces of data - try not to use
+     *
+     * @param string $text wiki markup to parse
+     * @param string $format output format
+     * @return null|string
+     */
+    public function render_text($text, $format = 'xhtml');
+
+    /**
+     * Allow the plugin to prevent DokuWiki from reusing an instance
+     *
+     * @return bool   false if the plugin has to be instantiated
+     */
+    public function isSingleton();
+}
+
+
+
diff --git a/wiki/inc/PluginTrait.php b/wiki/inc/PluginTrait.php
new file mode 100644
index 0000000..57b735e
--- /dev/null
+++ b/wiki/inc/PluginTrait.php
@@ -0,0 +1,238 @@
+<?php
+
+/**
+ * Do not inherit directly from this class, instead inherit from the specialized
+ * ones in lib/plugin
+ */
+trait DokuWiki_PluginTrait {
+
+    protected $localised = false;        // set to true by setupLocale() after loading language dependent strings
+    protected $lang = array();           // array to hold language dependent strings, best accessed via ->getLang()
+    protected $configloaded = false;     // set to true by loadConfig() after loading plugin configuration variables
+    protected $conf = array();           // array to hold plugin settings, best accessed via ->getConf()
+
+    /**
+     * @see DokuWiki_PluginInterface::getInfo()
+     */
+    public function getInfo() {
+        $parts = explode('_', get_class($this));
+        $info = DOKU_PLUGIN . '/' . $parts[2] . '/plugin.info.txt';
+        if(file_exists($info)) return confToHash($info);
+
+        msg(
+            'getInfo() not implemented in ' . get_class($this) . ' and ' . $info . ' not found.<br />' .
+            'Verify you\'re running the latest version of the plugin. If the problem persists, send a ' .
+            'bug report to the author of the ' . $parts[2] . ' plugin.', -1
+        );
+        return array(
+            'date' => '0000-00-00',
+            'name' => $parts[2] . ' plugin',
+        );
+    }
+
+    /**
+     * @see DokuWiki_PluginInterface::isSingleton()
+     */
+    public function isSingleton() {
+        return true;
+    }
+
+    /**
+     * @see DokuWiki_PluginInterface::loadHelper()
+     */
+    public function loadHelper($name, $msg = true) {
+        $obj = plugin_load('helper', $name);
+        if(is_null($obj) && $msg) msg("Helper plugin $name is not available or invalid.", -1);
+        return $obj;
+    }
+
+    // region introspection methods
+
+    /**
+     * @see DokuWiki_PluginInterface::getPluginType()
+     */
+    public function getPluginType() {
+        list($t) = explode('_', get_class($this), 2);
+        return $t;
+    }
+
+    /**
+     * @see DokuWiki_PluginInterface::getPluginName()
+     */
+    public function getPluginName() {
+        list(/* $t */, /* $p */, $n) = explode('_', get_class($this), 4);
+        return $n;
+    }
+
+    /**
+     * @see DokuWiki_PluginInterface::getPluginComponent()
+     */
+    public function getPluginComponent() {
+        list(/* $t */, /* $p */, /* $n */, $c) = explode('_', get_class($this), 4);
+        return (isset($c) ? $c : '');
+    }
+
+    // endregion
+    // region localization methods
+
+    /**
+     * @see DokuWiki_PluginInterface::getLang()
+     */
+    public function getLang($id) {
+        if(!$this->localised) $this->setupLocale();
+
+        return (isset($this->lang[$id]) ? $this->lang[$id] : '');
+    }
+
+    /**
+     * @see DokuWiki_PluginInterface::locale_xhtml()
+     */
+    public function locale_xhtml($id) {
+        return p_cached_output($this->localFN($id));
+    }
+
+    /**
+     * @see DokuWiki_PluginInterface::localFN()
+     */
+    public function localFN($id, $ext = 'txt') {
+        global $conf;
+        $plugin = $this->getPluginName();
+        $file = DOKU_CONF . 'plugin_lang/' . $plugin . '/' . $conf['lang'] . '/' . $id . '.' . $ext;
+        if(!file_exists($file)) {
+            $file = DOKU_PLUGIN . $plugin . '/lang/' . $conf['lang'] . '/' . $id . '.' . $ext;
+            if(!file_exists($file)) {
+                //fall back to english
+                $file = DOKU_PLUGIN . $plugin . '/lang/en/' . $id . '.' . $ext;
+            }
+        }
+        return $file;
+    }
+
+    /**
+     * @see DokuWiki_PluginInterface::setupLocale()
+     */
+    public function setupLocale() {
+        if($this->localised) return;
+
+        global $conf, $config_cascade; // 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');
+        foreach($config_cascade['lang']['plugin'] as $config_file) {
+            if(file_exists($config_file . $this->getPluginName() . '/en/lang.php')) {
+                include($config_file . $this->getPluginName() . '/en/lang.php');
+            }
+        }
+
+        if($conf['lang'] != 'en') {
+            @include($path . $conf['lang'] . '/lang.php');
+            foreach($config_cascade['lang']['plugin'] as $config_file) {
+                if(file_exists($config_file . $this->getPluginName() . '/' . $conf['lang'] . '/lang.php')) {
+                    include($config_file . $this->getPluginName() . '/' . $conf['lang'] . '/lang.php');
+                }
+            }
+        }
+
+        $this->lang = $lang;
+        $this->localised = true;
+    }
+
+    // endregion
+    // region configuration methods
+
+    /**
+     * @see DokuWiki_PluginInterface::getConf()
+     */
+    public function getConf($setting, $notset = false) {
+
+        if(!$this->configloaded) {
+            $this->loadConfig();
+        }
+
+        if(isset($this->conf[$setting])) {
+            return $this->conf[$setting];
+        } else {
+            return $notset;
+        }
+    }
+
+    /**
+     * @see DokuWiki_PluginInterface::loadConfig()
+     */
+    public 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
+     */
+    protected function readDefaultSettings() {
+
+        $path = DOKU_PLUGIN . $this->getPluginName() . '/conf/';
+        $conf = array();
+
+        if(file_exists($path . 'default.php')) {
+            include($path . 'default.php');
+        }
+
+        return $conf;
+    }
+
+    // endregion
+    // region output methods
+
+    /**
+     * @see DokuWiki_PluginInterface::email()
+     */
+    public function email($email, $name = '', $class = '', $more = '') {
+        if(!$email) return $name;
+        $email = obfuscate($email);
+        if(!$name) $name = $email;
+        $class = "class='" . ($class ? $class : 'mail') . "'";
+        return "<a href='mailto:$email' $class title='$email' $more>$name</a>";
+    }
+
+    /**
+     * @see DokuWiki_PluginInterface::external_link()
+     */
+    public function external_link($link, $title = '', $class = '', $target = '', $more = '') {
+        global $conf;
+
+        $link = htmlentities($link);
+        if(!$title) $title = $link;
+        if(!$target) $target = $conf['target']['extern'];
+        if($conf['relnofollow']) $more .= ' rel="nofollow"';
+
+        if($class) $class = " class='$class'";
+        if($target) $target = " target='$target'";
+        if($more) $more = " " . trim($more);
+
+        return "<a href='$link'$class$target$more>$title</a>";
+    }
+
+    /**
+     * @see DokuWiki_PluginInterface::render_text()
+     */
+    public function render_text($text, $format = 'xhtml') {
+        return p_render($format, p_get_instructions($text), $info);
+    }
+
+    // endregion
+}
diff --git a/wiki/inc/RemoteAPICore.php b/wiki/inc/RemoteAPICore.php
new file mode 100644
index 0000000..0ff358c
--- /dev/null
+++ b/wiki/inc/RemoteAPICore.php
@@ -0,0 +1,960 @@
+<?php
+
+/**
+ * Increased whenever the API is changed
+ */
+define('DOKU_API_VERSION', 10);
+
+/**
+ * Provides the core methods for the remote API.
+ * The methods are ordered in 'wiki.<method>' and 'dokuwiki.<method>' namespaces
+ */
+class RemoteAPICore {
+
+    private $api;
+
+    /**
+     * @param RemoteAPI $api
+     */
+    public function __construct(RemoteAPI $api) {
+        $this->api = $api;
+    }
+
+    /**
+     * Returns details about the core methods
+     *
+     * @return array
+     */
+    public function __getRemoteInfo() {
+        return array(
+            'dokuwiki.getVersion' => array(
+                'args' => array(),
+                'return' => 'string',
+                'doc' => 'Returns the running DokuWiki version.'
+            ), 'dokuwiki.login' => array(
+                'args' => array('string', 'string'),
+                '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',
+                'doc' => 'List all pages within the given namespace.',
+                'name' => 'readNamespace'
+            ), 'dokuwiki.search' => array(
+                'args' => array('string'),
+                'return' => 'array',
+                'doc' => 'Perform a fulltext search and return a list of matching pages'
+            ), 'dokuwiki.getTime' => array(
+                'args' => array(),
+                'return' => 'int',
+                'doc' =>  'Returns the current time at the remote wiki server as Unix timestamp.',
+            ), 'dokuwiki.setLocks' => array(
+                'args' => array('array'),
+                'return' => 'array',
+                'doc' => 'Lock or unlock pages.'
+            ), 'dokuwiki.getTitle' => array(
+                'args' => array(),
+                'return' => 'string',
+                'doc' => 'Returns the wiki title.',
+                'public' => '1'
+            ), 'dokuwiki.appendPage' => array(
+                'args' => array('string', 'string', 'array'),
+                'return' => 'bool',
+                'doc' => 'Append text to a wiki page.'
+            ),  'wiki.getPage' => array(
+                'args' => array('string'),
+                'return' => 'string',
+                'doc' => 'Get the raw Wiki text of page, latest version.',
+                'name' => 'rawPage',
+            ), 'wiki.getPageVersion' => array(
+                'args' => array('string', 'int'),
+                'name' => 'rawPage',
+                'return' => 'string',
+                'doc' => 'Return a raw wiki page'
+            ), 'wiki.getPageHTML' => array(
+                'args' => array('string'),
+                'return' => 'string',
+                'doc' => 'Return page in rendered HTML, latest version.',
+                'name' => 'htmlPage'
+            ), 'wiki.getPageHTMLVersion' => array(
+                'args' => array('string', 'int'),
+                'return' => 'string',
+                'doc' => 'Return page in rendered HTML.',
+                'name' => 'htmlPage'
+            ), 'wiki.getAllPages' => array(
+                'args' => array(),
+                'return' => 'array',
+                'doc' => 'Returns a list of all pages. The result is an array of utf8 pagenames.',
+                'name' => 'listPages'
+            ), 'wiki.getAttachments' => array(
+                'args' => array('string', 'array'),
+                'return' => 'array',
+                'doc' => 'Returns a list of all media files.',
+                'name' => 'listAttachments'
+            ), 'wiki.getBackLinks' => array(
+                'args' => array('string'),
+                'return' => 'array',
+                'doc' => 'Returns the pages that link to this page.',
+                'name' => 'listBackLinks'
+            ), 'wiki.getPageInfo' => array(
+                'args' => array('string'),
+                'return' => 'array',
+                'doc' => 'Returns a struct with info about the page, latest version.',
+                'name' => 'pageInfo'
+            ), 'wiki.getPageInfoVersion' => array(
+                'args' => array('string', 'int'),
+                'return' => 'array',
+                'doc' => 'Returns a struct with info about the page.',
+                'name' => 'pageInfo'
+            ), 'wiki.getPageVersions' => array(
+                'args' => array('string', 'int'),
+                'return' => 'array',
+                'doc' => 'Returns the available revisions of the page.',
+                'name' => 'pageVersions'
+            ), 'wiki.putPage' => array(
+                'args' => array('string', 'string', 'array'),
+                'return' => 'bool',
+                'doc' => 'Saves a wiki page.'
+            ), 'wiki.listLinks' => array(
+                'args' => array('string'),
+                'return' => 'array',
+                'doc' => 'Lists all links contained in a wiki page.'
+            ), 'wiki.getRecentChanges' => array(
+                'args' => array('int'),
+                'return' => 'array',
+                'Returns a struct about all recent changes since given timestamp.'
+            ), 'wiki.getRecentMediaChanges' => array(
+                'args' => array('int'),
+                'return' => 'array',
+                'Returns a struct about all recent media changes since given timestamp.'
+            ), 'wiki.aclCheck' => array(
+                'args' => array('string', 'string', 'array'),
+                'return' => 'int',
+                'doc' => 'Returns the permissions of a given wiki page. By default, for current user/groups'
+            ), 'wiki.putAttachment' => array(
+                'args' => array('string', 'file', 'array'),
+                'return' => 'array',
+                'doc' => 'Upload a file to the wiki.'
+            ), 'wiki.deleteAttachment' => array(
+                'args' => array('string'),
+                'return' => 'int',
+                'doc' => 'Delete a file from the wiki.'
+            ), 'wiki.getAttachment' => array(
+                'args' => array('string'),
+                'doc' => 'Return a media file',
+                'return' => 'file',
+                'name' => 'getAttachment',
+            ), 'wiki.getAttachmentInfo' => array(
+                'args' => array('string'),
+                'return' => 'array',
+                'doc' => 'Returns a struct with info about the attachment.'
+            ), 'dokuwiki.getXMLRPCAPIVersion' => array(
+                'args' => array(),
+                'name' => 'getAPIVersion',
+                'return' => 'int',
+                'doc' => 'Returns the XMLRPC API version.',
+                'public' => '1',
+            ), 'wiki.getRPCVersionSupported' => array(
+                'args' => array(),
+                'name' => 'wiki_RPCVersion',
+                'return' => 'int',
+                'doc' => 'Returns 2 with the supported RPC API version.',
+                'public' => '1'
+            ),
+
+        );
+    }
+
+    /**
+     * @return string
+     */
+    public function getVersion() {
+        return getVersion();
+    }
+
+    /**
+     * @return int unix timestamp
+     */
+    public function getTime() {
+        return time();
+    }
+
+    /**
+     * Return a raw wiki page
+     *
+     * @param string $id wiki page id
+     * @param int|string $rev revision timestamp of the page or empty string
+     * @return string page text.
+     * @throws RemoteAccessDeniedException if no permission for page
+     */
+    public function rawPage($id,$rev=''){
+        $id = $this->resolvePageId($id);
+        if(auth_quickaclcheck($id) < AUTH_READ){
+            throw new RemoteAccessDeniedException('You are not allowed to read this file', 111);
+        }
+        $text = rawWiki($id,$rev);
+        if(!$text) {
+            return pageTemplate($id);
+        } else {
+            return $text;
+        }
+    }
+
+    /**
+     * Return a media file
+     *
+     * @author Gina Haeussge <osd@foosel.net>
+     *
+     * @param string $id file id
+     * @return mixed media file
+     * @throws RemoteAccessDeniedException no permission for media
+     * @throws RemoteException not exist
+     */
+    public function getAttachment($id){
+        $id = cleanID($id);
+        if (auth_quickaclcheck(getNS($id).':*') < AUTH_READ) {
+            throw new RemoteAccessDeniedException('You are not allowed to read this file', 211);
+        }
+
+        $file = mediaFN($id);
+        if (!@ file_exists($file)) {
+            throw new RemoteException('The requested file does not exist', 221);
+        }
+
+        $data = io_readFile($file, false);
+        return $this->api->toFile($data);
+    }
+
+    /**
+     * Return info about a media file
+     *
+     * @author Gina Haeussge <osd@foosel.net>
+     *
+     * @param string $id page id
+     * @return array
+     */
+    public function getAttachmentInfo($id){
+        $id = cleanID($id);
+        $info = array(
+            'lastModified' => $this->api->toDate(0),
+            'size' => 0,
+        );
+
+        $file = mediaFN($id);
+        if(auth_quickaclcheck(getNS($id) . ':*') >= AUTH_READ) {
+            if(file_exists($file)) {
+                $info['lastModified'] = $this->api->toDate(filemtime($file));
+                $info['size'] = filesize($file);
+            } else {
+                //Is it deleted media with changelog?
+                $medialog = new MediaChangeLog($id);
+                $revisions = $medialog->getRevisions(0, 1);
+                if(!empty($revisions)) {
+                    $info['lastModified'] = $this->api->toDate($revisions[0]);
+                }
+            }
+        }
+
+        return $info;
+    }
+
+    /**
+     * Return a wiki page rendered to html
+     *
+     * @param string     $id  page id
+     * @param string|int $rev revision timestamp or empty string
+     * @return null|string html
+     * @throws RemoteAccessDeniedException no access to page
+     */
+    public function htmlPage($id,$rev=''){
+        $id = $this->resolvePageId($id);
+        if(auth_quickaclcheck($id) < AUTH_READ){
+            throw new RemoteAccessDeniedException('You are not allowed to read this page', 111);
+        }
+        return p_wiki_xhtml($id,$rev,false);
+    }
+
+    /**
+     * List all pages - we use the indexer list here
+     *
+     * @return array
+     */
+    public function listPages(){
+        $list  = array();
+        $pages = idx_get_indexer()->getPages();
+        $pages = array_filter(array_filter($pages,'isVisiblePage'),'page_exists');
+
+        foreach(array_keys($pages) as $idx) {
+            $perm = auth_quickaclcheck($pages[$idx]);
+            if($perm < AUTH_READ) {
+                continue;
+            }
+            $page = array();
+            $page['id'] = trim($pages[$idx]);
+            $page['perms'] = $perm;
+            $page['size'] = @filesize(wikiFN($pages[$idx]));
+            $page['lastModified'] = $this->api->toDate(@filemtime(wikiFN($pages[$idx])));
+            $list[] = $page;
+        }
+
+        return $list;
+    }
+
+    /**
+     * List all pages in the given namespace (and below)
+     *
+     * @param string $ns
+     * @param array  $opts
+     *    $opts['depth']   recursion level, 0 for all
+     *    $opts['hash']    do md5 sum of content?
+     * @return array
+     */
+    public function readNamespace($ns,$opts){
+        global $conf;
+
+        if(!is_array($opts)) $opts=array();
+
+        $ns = cleanID($ns);
+        $dir = utf8_encodeFN(str_replace(':', '/', $ns));
+        $data = array();
+        $opts['skipacl'] = 0; // no ACL skipping for XMLRPC
+        search($data, $conf['datadir'], 'search_allpages', $opts, $dir);
+        return $data;
+    }
+
+    /**
+     * List all pages in the given namespace (and below)
+     *
+     * @param string $query
+     * @return array
+     */
+    public function search($query){
+        $regex = array();
+        $data  = ft_pageSearch($query,$regex);
+        $pages = array();
+
+        // prepare additional data
+        $idx = 0;
+        foreach($data as $id => $score){
+            $file = wikiFN($id);
+
+            if($idx < FT_SNIPPET_NUMBER){
+                $snippet = ft_snippet($id,$regex);
+                $idx++;
+            }else{
+                $snippet = '';
+            }
+
+            $pages[] = array(
+                'id'      => $id,
+                'score'   => intval($score),
+                'rev'     => filemtime($file),
+                'mtime'   => filemtime($file),
+                'size'    => filesize($file),
+                'snippet' => $snippet,
+                'title' => useHeading('navigation') ? p_get_first_heading($id) : $id
+            );
+        }
+        return $pages;
+    }
+
+    /**
+     * Returns the wiki title.
+     *
+     * @return string
+     */
+    public function getTitle(){
+        global $conf;
+        return $conf['title'];
+    }
+
+    /**
+     * List all media files.
+     *
+     * Available options are 'recursive' for also including the subnamespaces
+     * in the listing, and 'pattern' for filtering the returned files against
+     * a regular expression matching their name.
+     *
+     * @author Gina Haeussge <osd@foosel.net>
+     *
+     * @param string $ns
+     * @param array  $options
+     *   $options['depth']     recursion level, 0 for all
+     *   $options['showmsg']   shows message if invalid media id is used
+     *   $options['pattern']   check given pattern
+     *   $options['hash']      add hashes to result list
+     * @return array
+     * @throws RemoteAccessDeniedException no access to the media files
+     */
+    public function listAttachments($ns, $options = array()) {
+        global $conf;
+
+        $ns = cleanID($ns);
+
+        if (!is_array($options)) $options = array();
+        $options['skipacl'] = 0; // no ACL skipping for XMLRPC
+
+        if(auth_quickaclcheck($ns.':*') >= AUTH_READ) {
+            $dir = utf8_encodeFN(str_replace(':', '/', $ns));
+
+            $data = array();
+            search($data, $conf['mediadir'], 'search_media', $options, $dir);
+            $len = count($data);
+            if(!$len) return array();
+
+            for($i=0; $i<$len; $i++) {
+                unset($data[$i]['meta']);
+                $data[$i]['perms'] = $data[$i]['perm'];
+                unset($data[$i]['perm']);
+                $data[$i]['lastModified'] = $this->api->toDate($data[$i]['mtime']);
+            }
+            return $data;
+        } else {
+            throw new RemoteAccessDeniedException('You are not allowed to list media files.', 215);
+        }
+    }
+
+    /**
+     * Return a list of backlinks
+     *
+     * @param string $id page id
+     * @return array
+     */
+    function listBackLinks($id){
+        return ft_backlinks($this->resolvePageId($id));
+    }
+
+    /**
+     * Return some basic data about a page
+     *
+     * @param string     $id page id
+     * @param string|int $rev revision timestamp or empty string
+     * @return array
+     * @throws RemoteAccessDeniedException no access for page
+     * @throws RemoteException page not exist
+     */
+    public function pageInfo($id,$rev=''){
+        $id = $this->resolvePageId($id);
+        if(auth_quickaclcheck($id) < AUTH_READ){
+            throw new RemoteAccessDeniedException('You are not allowed to read this page', 111);
+        }
+        $file = wikiFN($id,$rev);
+        $time = @filemtime($file);
+        if(!$time){
+            throw new RemoteException('The requested page does not exist', 121);
+        }
+
+        // set revision to current version if empty, use revision otherwise
+        // as the timestamps of old files are not necessarily correct
+        if($rev === '') {
+            $rev = $time;
+        }
+
+        $pagelog = new PageChangeLog($id, 1024);
+        $info = $pagelog->getRevisionInfo($rev);
+
+        $data = array(
+            'name'         => $id,
+            'lastModified' => $this->api->toDate($rev),
+            'author'       => (($info['user']) ? $info['user'] : $info['ip']),
+            'version'      => $rev
+        );
+
+        return ($data);
+    }
+
+    /**
+     * Save a wiki page
+     *
+     * @author Michael Klier <chi@chimeric.de>
+     *
+     * @param string $id page id
+     * @param string $text wiki text
+     * @param array $params parameters: summary, minor edit
+     * @return bool
+     * @throws RemoteAccessDeniedException no write access for page
+     * @throws RemoteException no id, empty new page or locked
+     */
+    public function putPage($id, $text, $params) {
+        global $TEXT;
+        global $lang;
+
+        $id    = $this->resolvePageId($id);
+        $TEXT  = cleanText($text);
+        $sum   = $params['sum'];
+        $minor = $params['minor'];
+
+        if(empty($id)) {
+            throw new RemoteException('Empty page ID', 131);
+        }
+
+        if(!page_exists($id) && trim($TEXT) == '' ) {
+            throw new RemoteException('Refusing to write an empty new wiki page', 132);
+        }
+
+        if(auth_quickaclcheck($id) < AUTH_EDIT) {
+            throw new RemoteAccessDeniedException('You are not allowed to edit this page', 112);
+        }
+
+        // Check, if page is locked
+        if(checklock($id)) {
+            throw new RemoteException('The page is currently locked', 133);
+        }
+
+        // SPAM check
+        if(checkwordblock()) {
+            throw new RemoteException('Positive wordblock check', 134);
+        }
+
+        // autoset summary on new pages
+        if(!page_exists($id) && empty($sum)) {
+            $sum = $lang['created'];
+        }
+
+        // autoset summary on deleted pages
+        if(page_exists($id) && empty($TEXT) && empty($sum)) {
+            $sum = $lang['deleted'];
+        }
+
+        lock($id);
+
+        saveWikiText($id,$TEXT,$sum,$minor);
+
+        unlock($id);
+
+        // run the indexer if page wasn't indexed yet
+        idx_addPage($id);
+
+        return true;
+    }
+
+    /**
+     * Appends text to a wiki page.
+     *
+     * @param string $id page id
+     * @param string $text wiki text
+     * @param array $params such as summary,minor
+     * @return bool|string
+     */
+    public function appendPage($id, $text, $params) {
+        $currentpage = $this->rawPage($id);
+        if (!is_string($currentpage)) {
+            return $currentpage;
+        }
+        return $this->putPage($id, $currentpage.$text, $params);
+    }
+
+    /**
+     * Uploads a file to the wiki.
+     *
+     * Michael Klier <chi@chimeric.de>
+     *
+     * @param string $id page id
+     * @param string $file
+     * @param array $params such as overwrite
+     * @return false|string
+     * @throws RemoteException
+     */
+    public function putAttachment($id, $file, $params) {
+        $id = cleanID($id);
+        $auth = auth_quickaclcheck(getNS($id).':*');
+
+        if(!isset($id)) {
+            throw new RemoteException('Filename not given.', 231);
+        }
+
+        global $conf;
+
+        $ftmp = $conf['tmpdir'] . '/' . md5($id.clientIP());
+
+        // save temporary file
+        @unlink($ftmp);
+        io_saveFile($ftmp, $file);
+
+        $res = media_save(array('name' => $ftmp), $id, $params['ow'], $auth, 'rename');
+        if (is_array($res)) {
+            throw new RemoteException($res[0], -$res[1]);
+        } else {
+            return $res;
+        }
+    }
+
+    /**
+     * Deletes a file from the wiki.
+     *
+     * @author Gina Haeussge <osd@foosel.net>
+     *
+     * @param string $id page id
+     * @return int
+     * @throws RemoteAccessDeniedException no permissions
+     * @throws RemoteException file in use or not deleted
+     */
+    public function deleteAttachment($id){
+        $id = cleanID($id);
+        $auth = auth_quickaclcheck(getNS($id).':*');
+        $res = media_delete($id, $auth);
+        if ($res & DOKU_MEDIA_DELETED) {
+            return 0;
+        } elseif ($res & DOKU_MEDIA_NOT_AUTH) {
+            throw new RemoteAccessDeniedException('You don\'t have permissions to delete files.', 212);
+        } elseif ($res & DOKU_MEDIA_INUSE) {
+            throw new RemoteException('File is still referenced', 232);
+        } else {
+            throw new RemoteException('Could not delete file', 233);
+        }
+    }
+
+    /**
+     * Returns the permissions of a given wiki page for the current user or another user
+     *
+     * @param string $id page id
+     * @param string|null $user username
+     * @param array|null $groups array of groups
+     * @return int permission level
+     */
+    public function aclCheck($id, $user = null, $groups = null) {
+        /** @var DokuWiki_Auth_Plugin $auth */
+        global $auth;
+
+        $id = $this->resolvePageId($id);
+        if($user === null) {
+            return auth_quickaclcheck($id);
+        } else {
+            if($groups === null) {
+                $userinfo = $auth->getUserData($user);
+                if($userinfo === false) {
+                    $groups = array();
+                } else {
+                    $groups = $userinfo['grps'];
+                }
+            }
+            return auth_aclcheck($id, $user, $groups);
+        }
+    }
+
+    /**
+     * Lists all links contained in a wiki page
+     *
+     * @author Michael Klier <chi@chimeric.de>
+     *
+     * @param string $id page id
+     * @return array
+     * @throws RemoteAccessDeniedException  no read access for page
+     */
+    public function listLinks($id) {
+        $id = $this->resolvePageId($id);
+        if(auth_quickaclcheck($id) < AUTH_READ){
+            throw new RemoteAccessDeniedException('You are not allowed to read this page', 111);
+        }
+        $links = array();
+
+        // resolve page instructions
+        $ins   = p_cached_instructions(wikiFN($id));
+
+        // instantiate new Renderer - needed for interwiki links
+        $Renderer = new Doku_Renderer_xhtml();
+        $Renderer->interwiki = getInterwiki();
+
+        // parse parse instructions
+        foreach($ins as $in) {
+            $link = array();
+            switch($in[0]) {
+                case 'internallink':
+                    $link['type'] = 'local';
+                    $link['page'] = $in[1][0];
+                    $link['href'] = wl($in[1][0]);
+                    array_push($links,$link);
+                    break;
+                case 'externallink':
+                    $link['type'] = 'extern';
+                    $link['page'] = $in[1][0];
+                    $link['href'] = $in[1][0];
+                    array_push($links,$link);
+                    break;
+                case 'interwikilink':
+                    $url = $Renderer->_resolveInterWiki($in[1][2],$in[1][3]);
+                    $link['type'] = 'extern';
+                    $link['page'] = $url;
+                    $link['href'] = $url;
+                    array_push($links,$link);
+                    break;
+            }
+        }
+
+        return ($links);
+    }
+
+    /**
+     * Returns a list of recent changes since give timestamp
+     *
+     * @author Michael Hamann <michael@content-space.de>
+     * @author Michael Klier <chi@chimeric.de>
+     *
+     * @param int $timestamp unix timestamp
+     * @return array
+     * @throws RemoteException no valid timestamp
+     */
+    public function getRecentChanges($timestamp) {
+        if(strlen($timestamp) != 10) {
+            throw new RemoteException('The provided value is not a valid timestamp', 311);
+        }
+
+        $recents = getRecentsSince($timestamp);
+
+        $changes = array();
+
+        foreach ($recents as $recent) {
+            $change = array();
+            $change['name']         = $recent['id'];
+            $change['lastModified'] = $this->api->toDate($recent['date']);
+            $change['author']       = $recent['user'];
+            $change['version']      = $recent['date'];
+            $change['perms']        = $recent['perms'];
+            $change['size']         = @filesize(wikiFN($recent['id']));
+            array_push($changes, $change);
+        }
+
+        if (!empty($changes)) {
+            return $changes;
+        } else {
+            // in case we still have nothing at this point
+            throw new RemoteException('There are no changes in the specified timeframe', 321);
+        }
+    }
+
+    /**
+     * Returns a list of recent media changes since give timestamp
+     *
+     * @author Michael Hamann <michael@content-space.de>
+     * @author Michael Klier <chi@chimeric.de>
+     *
+     * @param int $timestamp unix timestamp
+     * @return array
+     * @throws RemoteException no valid timestamp
+     */
+    public function getRecentMediaChanges($timestamp) {
+        if(strlen($timestamp) != 10)
+            throw new RemoteException('The provided value is not a valid timestamp', 311);
+
+        $recents = getRecentsSince($timestamp, null, '', RECENTS_MEDIA_CHANGES);
+
+        $changes = array();
+
+        foreach ($recents as $recent) {
+            $change = array();
+            $change['name']         = $recent['id'];
+            $change['lastModified'] = $this->api->toDate($recent['date']);
+            $change['author']       = $recent['user'];
+            $change['version']      = $recent['date'];
+            $change['perms']        = $recent['perms'];
+            $change['size']         = @filesize(mediaFN($recent['id']));
+            array_push($changes, $change);
+        }
+
+        if (!empty($changes)) {
+            return $changes;
+        } else {
+            // in case we still have nothing at this point
+            throw new RemoteException('There are no changes in the specified timeframe', 321);
+        }
+    }
+
+    /**
+     * Returns a list of available revisions of a given wiki page
+     * Number of returned pages is set by $conf['recent']
+     * However not accessible pages are skipped, so less than $conf['recent'] could be returned
+     *
+     * @author Michael Klier <chi@chimeric.de>
+     *
+     * @param string $id    page id
+     * @param int    $first skip the first n changelog lines (0 = from current(if exists), 1 = from 1st old rev, 2 = from 2nd old rev, etc)
+     * @return array
+     * @throws RemoteAccessDeniedException no read access for page
+     * @throws RemoteException empty id
+     */
+    public function pageVersions($id, $first) {
+        $id = $this->resolvePageId($id);
+        if(auth_quickaclcheck($id) < AUTH_READ) {
+            throw new RemoteAccessDeniedException('You are not allowed to read this page', 111);
+        }
+        global $conf;
+
+        $versions = array();
+
+        if(empty($id)) {
+            throw new RemoteException('Empty page ID', 131);
+        }
+
+        $first = (int) $first;
+        $first_rev = $first - 1;
+        $first_rev = $first_rev < 0 ? 0 : $first_rev;
+        $pagelog = new PageChangeLog($id);
+        $revisions = $pagelog->getRevisions($first_rev, $conf['recent']);
+
+        if($first == 0) {
+            array_unshift($revisions, '');  // include current revision
+            if ( count($revisions) > $conf['recent'] ){
+                array_pop($revisions);          // remove extra log entry
+            }
+        }
+
+        if(!empty($revisions)) {
+            foreach($revisions as $rev) {
+                $file = wikiFN($id,$rev);
+                $time = @filemtime($file);
+                // we check if the page actually exists, if this is not the
+                // case this can lead to less pages being returned than
+                // specified via $conf['recent']
+                if($time){
+                    $pagelog->setChunkSize(1024);
+                    $info = $pagelog->getRevisionInfo($rev ? $rev : $time);
+                    if(!empty($info)) {
+                        $data = array();
+                        $data['user'] = $info['user'];
+                        $data['ip']   = $info['ip'];
+                        $data['type'] = $info['type'];
+                        $data['sum']  = $info['sum'];
+                        $data['modified'] = $this->api->toDate($info['date']);
+                        $data['version'] = $info['date'];
+                        array_push($versions, $data);
+                    }
+                }
+            }
+            return $versions;
+        } else {
+            return array();
+        }
+    }
+
+    /**
+     * The version of Wiki RPC API supported
+     */
+    public function wiki_RPCVersion(){
+        return 2;
+    }
+
+
+    /**
+     * Locks or unlocks a given batch of pages
+     *
+     * Give an associative array with two keys: lock and unlock. Both should contain a
+     * list of pages to lock or unlock
+     *
+     * Returns an associative array with the keys locked, lockfail, unlocked and
+     * unlockfail, each containing lists of pages.
+     *
+     * @param array[] $set list pages with array('lock' => array, 'unlock' => array)
+     * @return array
+     */
+    public function setLocks($set){
+        $locked     = array();
+        $lockfail   = array();
+        $unlocked   = array();
+        $unlockfail = array();
+
+        foreach((array) $set['lock'] as $id){
+            $id = $this->resolvePageId($id);
+            if(auth_quickaclcheck($id) < AUTH_EDIT || checklock($id)){
+                $lockfail[] = $id;
+            }else{
+                lock($id);
+                $locked[] = $id;
+            }
+        }
+
+        foreach((array) $set['unlock'] as $id){
+            $id = $this->resolvePageId($id);
+            if(auth_quickaclcheck($id) < AUTH_EDIT || !unlock($id)){
+                $unlockfail[] = $id;
+            }else{
+                $unlocked[] = $id;
+            }
+        }
+
+        return array(
+            'locked'     => $locked,
+            'lockfail'   => $lockfail,
+            'unlocked'   => $unlocked,
+            'unlockfail' => $unlockfail,
+        );
+    }
+
+    /**
+     * Return API version
+     *
+     * @return int
+     */
+    public function getAPIVersion(){
+        return DOKU_API_VERSION;
+    }
+
+    /**
+     * Login
+     *
+     * @param string $user
+     * @param string $pass
+     * @return int
+     */
+    public function login($user,$pass){
+        global $conf;
+        /** @var DokuWiki_Auth_Plugin $auth */
+        global $auth;
+
+        if(!$conf['useacl']) return 0;
+        if(!$auth) return 0;
+
+        @session_start(); // reopen session for login
+        if($auth->canDo('external')){
+            $ok = $auth->trustExternal($user,$pass,false);
+        }else{
+            $evdata = array(
+                'user'     => $user,
+                'password' => $pass,
+                'sticky'   => false,
+                'silent'   => true,
+            );
+            $ok = trigger_event('AUTH_LOGIN_CHECK', $evdata, 'auth_login_wrapper');
+        }
+        session_write_close(); // we're done with the session
+
+        return $ok;
+    }
+
+    /**
+     * Log off
+     *
+     * @return int
+     */
+    public function logoff(){
+        global $conf;
+        global $auth;
+        if(!$conf['useacl']) return 0;
+        if(!$auth) return 0;
+
+        auth_logoff();
+
+        return 1;
+    }
+
+    /**
+     * Resolve page id
+     *
+     * @param string $id page id
+     * @return string
+     */
+    private function resolvePageId($id) {
+        $id = cleanID($id);
+        if(empty($id)) {
+            global $conf;
+            $id = cleanID($conf['start']);
+        }
+        return $id;
+    }
+
+}
+
diff --git a/wiki/inc/SafeFN.class.php b/wiki/inc/SafeFN.class.php
new file mode 100644
index 0000000..b9e4a2b
--- /dev/null
+++ b/wiki/inc/SafeFN.class.php
@@ -0,0 +1,158 @@
+<?php
+
+/**
+ * Class to safely store UTF-8 in a Filename
+ *
+ * Encodes a utf8 string using only the following characters 0-9a-z_.-%
+ * characters 0-9a-z in the original string are preserved, "plain".
+ * all other characters are represented in a substring that starts
+ * with '%' are "converted".
+ * The transition from converted substrings to plain characters is
+ * marked with a '.'
+ *
+ * @author   Christopher Smith <chris@jalakai.co.uk>
+ * @date     2010-04-02
+ */
+class SafeFN {
+
+    // 'safe' characters are a superset of $plain, $pre_indicator and $post_indicator
+    private static $plain = '-./[_0123456789abcdefghijklmnopqrstuvwxyz'; // these characters aren't converted
+    private static $pre_indicator = '%';
+    private static $post_indicator = ']';
+
+    /**
+     * Convert an UTF-8 string to a safe ASCII String
+     *
+     *  conversion process
+     *    - if codepoint is a plain or post_indicator character,
+     *      - if previous character was "converted", append post_indicator to output, clear "converted" flag
+     *      - append ascii byte for character to output
+     *      (continue to next character)
+     *
+     *    - if codepoint is a pre_indicator character,
+     *      - append ascii byte for character to output, set "converted" flag
+     *      (continue to next character)
+     *
+     *    (all remaining characters)
+     *    - reduce codepoint value for non-printable ASCII characters (0x00 - 0x1f).  Space becomes our zero.
+     *    - convert reduced value to base36 (0-9a-z)
+     *    - append $pre_indicator characater followed by base36 string to output, set converted flag
+     *    (continue to next character)
+     *
+     * @param    string    $filename     a utf8 string, should only include printable characters - not 0x00-0x1f
+     * @return   string    an encoded representation of $filename using only 'safe' ASCII characters
+     *
+     * @author   Christopher Smith <chris@jalakai.co.uk>
+     */
+    public static function encode($filename) {
+        return self::unicode_to_safe(utf8_to_unicode($filename));
+    }
+
+    /**
+     *  decoding process
+     *    - split the string into substrings at any occurrence of pre or post indicator characters
+     *    - check the first character of the substring
+     *      - if its not a pre_indicator character
+     *        - if previous character was converted, skip over post_indicator character
+     *        - copy codepoint values of remaining characters to the output array
+     *        - clear any converted flag
+     *      (continue to next substring)
+     *
+     *     _ else (its a pre_indicator character)
+     *       - if string length is 1, copy the post_indicator character to the output array
+     *       (continue to next substring)
+     *
+     *       - else (string length > 1)
+     *         - skip the pre-indicator character and convert remaining string from base36 to base10
+     *         - increase codepoint value for non-printable ASCII characters (add 0x20)
+     *         - append codepoint to output array
+     *       (continue to next substring)
+     *
+     * @param    string    $filename     a 'safe' encoded ASCII string,
+     * @return   string    decoded utf8 representation of $filename
+     *
+     * @author   Christopher Smith <chris@jalakai.co.uk>
+     */
+    public static function decode($filename) {
+        return unicode_to_utf8(self::safe_to_unicode(strtolower($filename)));
+    }
+
+    public static function validate_printable_utf8($printable_utf8) {
+        return !preg_match('#[\x01-\x1f]#',$printable_utf8);
+    }
+
+    public static function validate_safe($safe) {
+        return !preg_match('#[^'.self::$plain.self::$post_indicator.self::$pre_indicator.']#',$safe);
+    }
+
+    /**
+     * convert an array of unicode codepoints into 'safe_filename' format
+     *
+     * @param    array  int    $unicode    an array of unicode codepoints
+     * @return   string        the unicode represented in 'safe_filename' format
+     *
+     * @author   Christopher Smith <chris@jalakai.co.uk>
+     */
+    private static function unicode_to_safe($unicode) {
+
+        $safe = '';
+        $converted = false;
+
+        foreach ($unicode as $codepoint) {
+            if ($codepoint < 127 && (strpos(self::$plain.self::$post_indicator,chr($codepoint))!==false)) {
+                if ($converted) {
+                    $safe .= self::$post_indicator;
+                    $converted = false;
+                }
+                $safe .= chr($codepoint);
+
+            } else if ($codepoint == ord(self::$pre_indicator)) {
+                $safe .= self::$pre_indicator;
+                $converted = true;
+            } else {
+                $safe .= self::$pre_indicator.base_convert((string)($codepoint-32),10,36);
+                $converted = true;
+            }
+        }
+        if($converted) $safe .= self::$post_indicator;
+        return $safe;
+    }
+
+    /**
+     * convert a 'safe_filename' string into an array of unicode codepoints
+     *
+     * @param   string         $safe     a filename in 'safe_filename' format
+     * @return  array   int    an array of unicode codepoints
+     *
+     * @author   Christopher Smith <chris@jalakai.co.uk>
+     */
+    private static function safe_to_unicode($safe) {
+
+        $unicode = array();
+        $split = preg_split('#(?=['.self::$post_indicator.self::$pre_indicator.'])#',$safe,-1,PREG_SPLIT_NO_EMPTY);
+
+        $converted = false;
+        foreach ($split as $sub) {
+            $len = strlen($sub);
+            if ($sub[0] != self::$pre_indicator) {
+                // plain (unconverted) characters, optionally starting with a post_indicator
+                // set initial value to skip any post_indicator
+                for ($i=($converted?1:0); $i < $len; $i++) {
+                    $unicode[] = ord($sub[$i]);
+                }
+                $converted = false;
+            } else if ($len==1) {
+                // a pre_indicator character in the real data
+                $unicode[] = ord($sub);
+                $converted = true;
+            } else {
+                // a single codepoint in base36, adjusted for initial 32 non-printable chars
+                $unicode[] = 32 + (int)base_convert(substr($sub,1),36,10);
+                $converted = true;
+            }
+        }
+
+        return $unicode;
+    }
+
+}
diff --git a/wiki/inc/Sitemapper.php b/wiki/inc/Sitemapper.php
new file mode 100644
index 0000000..037990e
--- /dev/null
+++ b/wiki/inc/Sitemapper.php
@@ -0,0 +1,220 @@
+<?php
+/**
+ * Sitemap handling functions
+ *
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author     Michael Hamann <michael@content-space.de>
+ */
+
+if(!defined('DOKU_INC')) die('meh.');
+
+/**
+ * A class for building sitemaps and pinging search engines with the sitemap URL.
+ *
+ * @author Michael Hamann
+ */
+class Sitemapper {
+    /**
+     * Builds a Google Sitemap of all public pages known to the indexer
+     *
+     * The map is placed in the cache directory named sitemap.xml.gz - This
+     * file needs to be writable!
+     *
+     * @author Michael Hamann
+     * @author Andreas Gohr
+     * @link   https://www.google.com/webmasters/sitemaps/docs/en/about.html
+     * @link   http://www.sitemaps.org/
+     *
+     * @return bool
+     */
+    public static function generate(){
+        global $conf;
+        if($conf['sitemap'] < 1 || !is_numeric($conf['sitemap'])) return false;
+
+        $sitemap = Sitemapper::getFilePath();
+
+        if(file_exists($sitemap)){
+            if(!is_writable($sitemap)) return false;
+        }else{
+            if(!is_writable(dirname($sitemap))) return false;
+        }
+
+        if(@filesize($sitemap) &&
+           @filemtime($sitemap) > (time()-($conf['sitemap']*86400))){ // 60*60*24=86400
+            dbglog('Sitemapper::generate(): Sitemap up to date');
+            return false;
+        }
+
+        dbglog("Sitemapper::generate(): using $sitemap");
+
+        $pages = idx_get_indexer()->getPages();
+        dbglog('Sitemapper::generate(): creating sitemap using '.count($pages).' pages');
+        $items = array();
+
+        // build the sitemap items
+        foreach($pages as $id){
+            //skip hidden, non existing and restricted files
+            if(isHiddenPage($id)) continue;
+            if(auth_aclcheck($id,'',array()) < AUTH_READ) continue;
+            $item = SitemapItem::createFromID($id);
+            if ($item !== null)
+                $items[] = $item;
+        }
+
+        $eventData = array('items' => &$items, 'sitemap' => &$sitemap);
+        $event = new Doku_Event('SITEMAP_GENERATE', $eventData);
+        if ($event->advise_before(true)) {
+            //save the new sitemap
+            $event->result = io_saveFile($sitemap, Sitemapper::getXML($items));
+        }
+        $event->advise_after();
+
+        return $event->result;
+    }
+
+    /**
+     * Builds the sitemap XML string from the given array auf SitemapItems.
+     *
+     * @param $items array The SitemapItems that shall be included in the sitemap.
+     * @return string The sitemap XML.
+     *
+     * @author Michael Hamann
+     */
+    private static function getXML($items) {
+        ob_start();
+        echo '<?xml version="1.0" encoding="UTF-8"?>'.NL;
+        echo '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">'.NL;
+        foreach ($items as $item) {
+            /** @var SitemapItem $item */
+            echo $item->toXML();
+        }
+        echo '</urlset>'.NL;
+        $result = ob_get_contents();
+        ob_end_clean();
+        return $result;
+    }
+
+    /**
+     * Helper function for getting the path to the sitemap file.
+     *
+     * @return string The path to the sitemap file.
+     *
+     * @author Michael Hamann
+     */
+    public static function getFilePath() {
+        global $conf;
+
+        $sitemap = $conf['cachedir'].'/sitemap.xml';
+        if (self::sitemapIsCompressed()) {
+            $sitemap .= '.gz';
+        }
+
+        return $sitemap;
+    }
+
+    /**
+     * Helper function for checking if the sitemap is compressed
+     *
+     * @return bool If the sitemap file is compressed
+     */
+    public static function sitemapIsCompressed() {
+        global $conf;
+        return $conf['compression'] === 'bz2' || $conf['compression'] === 'gz';
+    }
+
+    /**
+     * Pings search engines with the sitemap url. Plugins can add or remove
+     * urls to ping using the SITEMAP_PING event.
+     *
+     * @author Michael Hamann
+     *
+     * @return bool
+     */
+    public static function pingSearchEngines() {
+        //ping search engines...
+        $http = new DokuHTTPClient();
+        $http->timeout = 8;
+
+        $encoded_sitemap_url = urlencode(wl('', array('do' => 'sitemap'), true, '&'));
+        $ping_urls = array(
+            '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,
+                            'encoded_sitemap_url' => $encoded_sitemap_url
+        );
+        $event = new Doku_Event('SITEMAP_PING', $data);
+        if ($event->advise_before(true)) {
+            foreach ($data['ping_urls'] as $name => $url) {
+                dbglog("Sitemapper::PingSearchEngines(): pinging $name");
+                $resp = $http->get($url);
+                if($http->error) dbglog("Sitemapper:pingSearchengines(): $http->error");
+                dbglog('Sitemapper:pingSearchengines(): '.preg_replace('/[\n\r]/',' ',strip_tags($resp)));
+            }
+        }
+        $event->advise_after();
+
+        return true;
+    }
+}
+
+/**
+ * An item of a sitemap.
+ *
+ * @author Michael Hamann
+ */
+class SitemapItem {
+    public $url;
+    public $lastmod;
+    public $changefreq;
+    public $priority;
+
+    /**
+     * Create a new item.
+     *
+     * @param string $url        The url of the item
+     * @param int    $lastmod    Timestamp of the last modification
+     * @param string $changefreq How frequently the item is likely to change. Valid values: always, hourly, daily, weekly, monthly, yearly, never.
+     * @param $priority float|string The priority of the item relative to other URLs on your site. Valid values range from 0.0 to 1.0.
+     */
+    public function __construct($url, $lastmod, $changefreq = null, $priority = null) {
+        $this->url = $url;
+        $this->lastmod = $lastmod;
+        $this->changefreq = $changefreq;
+        $this->priority = $priority;
+    }
+
+    /**
+     * Helper function for creating an item for a wikipage id.
+     *
+     * @param string       $id         A wikipage id.
+     * @param string       $changefreq How frequently the item is likely to change. Valid values: always, hourly, daily, weekly, monthly, yearly, never.
+     * @param float|string $priority   The priority of the item relative to other URLs on your site. Valid values     range from 0.0 to 1.0.
+     * @return SitemapItem The sitemap item.
+     */
+    public static function createFromID($id, $changefreq = null, $priority = null) {
+        $id = trim($id);
+        $date = @filemtime(wikiFN($id));
+        if(!$date) return null;
+        return new SitemapItem(wl($id, '', true), $date, $changefreq, $priority);
+    }
+
+    /**
+     * Get the XML representation of the sitemap item.
+     *
+     * @return string The XML representation.
+     */
+    public function toXML() {
+        $result = '  <url>'.NL
+                 .'    <loc>'.hsc($this->url).'</loc>'.NL
+                 .'    <lastmod>'.date_iso8601($this->lastmod).'</lastmod>'.NL;
+        if ($this->changefreq !== null)
+            $result .= '    <changefreq>'.hsc($this->changefreq).'</changefreq>'.NL;
+        if ($this->priority !== null)
+            $result .= '    <priority>'.hsc($this->priority).'</priority>'.NL;
+        $result .= '  </url>'.NL;
+        return $result;
+    }
+}
diff --git a/wiki/inc/StyleUtils.php b/wiki/inc/StyleUtils.php
new file mode 100644
index 0000000..e584942
--- /dev/null
+++ b/wiki/inc/StyleUtils.php
@@ -0,0 +1,118 @@
+<?php
+
+namespace dokuwiki;
+
+class StyleUtils
+{
+    /**
+     * Load style ini contents
+     *
+     * Loads and merges style.ini files from template and config and prepares
+     * the stylesheet modes
+     *
+     * @author Andreas Gohr <andi@splitbrain.org>
+     *
+     * @param string $tpl the used template
+     * @param bool   $preview load preview replacements
+     * @return array with keys 'stylesheets' and 'replacements'
+     */
+    public function cssStyleini($tpl, $preview=false) {
+        global $conf;
+
+        $stylesheets = array(); // mode, file => base
+        // guaranteed placeholder => value
+        $replacements = array(
+            '__text__' => "#000",
+            '__background__' => "#fff",
+            '__text_alt__' => "#999",
+            '__background_alt__' => "#eee",
+            '__text_neu__' => "#666",
+            '__background_neu__' => "#ddd",
+            '__border__' => "#ccc",
+            '__highlight__' => "#ff9",
+            '__link__' => "#00f",
+        );
+
+        // load template's style.ini
+        $incbase = tpl_incdir($tpl);
+        $webbase = tpl_basedir($tpl);
+        $ini = $incbase.'style.ini';
+        if(file_exists($ini)){
+            $data = parse_ini_file($ini, true);
+
+            // stylesheets
+            if(is_array($data['stylesheets'])) foreach($data['stylesheets'] as $file => $mode){
+                if (!file_exists($incbase . $file)) {
+                    list($extension, $basename) = array_map('strrev', explode('.', strrev($file), 2));
+                    $newExtension = $extension === 'css' ? 'less' : 'css';
+                    if (file_exists($incbase . $basename . '.' . $newExtension)) {
+                        $stylesheets[$mode][$incbase . $basename . '.' . $newExtension] = $webbase;
+                        if ($conf['allowdebug']) {
+                            msg("Stylesheet $file not found, using $basename.$newExtension instead. Please contact developer of \"{$conf['template']}\" template.", 2);
+                        }
+                        continue;
+                    }
+                }
+                $stylesheets[$mode][$incbase . $file] = $webbase;
+            }
+
+            // replacements
+            if(is_array($data['replacements'])){
+                $replacements = array_merge($replacements, $this->cssFixreplacementurls($data['replacements'],$webbase));
+            }
+        }
+
+        // load configs's style.ini
+        $webbase = DOKU_BASE;
+        $ini = DOKU_CONF."tpl/$tpl/style.ini";
+        $incbase = dirname($ini).'/';
+        if(file_exists($ini)){
+            $data = parse_ini_file($ini, true);
+
+            // stylesheets
+            if(isset($data['stylesheets']) && is_array($data['stylesheets'])) foreach($data['stylesheets'] as $file => $mode){
+                $stylesheets[$mode][$incbase.$file] = $webbase;
+            }
+
+            // replacements
+            if(isset($data['replacements']) && is_array($data['replacements'])){
+                $replacements = array_merge($replacements, $this->cssFixreplacementurls($data['replacements'],$webbase));
+            }
+        }
+
+        // allow replacement overwrites in preview mode
+        if($preview) {
+            $webbase = DOKU_BASE;
+            $ini     = $conf['cachedir'].'/preview.ini';
+            if(file_exists($ini)) {
+                $data = parse_ini_file($ini, true);
+                // replacements
+                if(is_array($data['replacements'])) {
+                    $replacements = array_merge($replacements, $this->cssFixreplacementurls($data['replacements'], $webbase));
+                }
+            }
+        }
+
+        return array(
+            'stylesheets' => $stylesheets,
+            'replacements' => $replacements
+        );
+    }
+
+
+    /**
+     * Amend paths used in replacement relative urls, refer FS#2879
+     *
+     * @author Chris Smith <chris@jalakai.co.uk>
+     *
+     * @param array $replacements with key-value pairs
+     * @param string $location
+     * @return array
+     */
+    protected function cssFixreplacementurls($replacements, $location) {
+        foreach($replacements as $key => $value) {
+            $replacements[$key] = preg_replace('#(url\([ \'"]*)(?!/|data:|http://|https://| |\'|")#','\\1'.$location,$value);
+        }
+        return $replacements;
+    }
+}
diff --git a/wiki/inc/Ui/Admin.php b/wiki/inc/Ui/Admin.php
new file mode 100644
index 0000000..aa3b8b9
--- /dev/null
+++ b/wiki/inc/Ui/Admin.php
@@ -0,0 +1,173 @@
+<?php
+namespace dokuwiki\Ui;
+
+/**
+ * Class Admin
+ *
+ * Displays the Admin screen
+ *
+ * @package dokuwiki\Ui
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @author Håkan Sandell <hakan.sandell@home.se>
+ */
+class Admin extends Ui {
+
+    protected $menu;
+
+    /**
+     * Display the UI element
+     *
+     * @return void
+     */
+    public function show() {
+        $this->menu = $this->getPluginList();
+        echo '<div class="ui-admin">';
+        echo p_locale_xhtml('admin');
+        $this->showSecurityCheck();
+        $this->showAdminMenu();
+        $this->showManagerMenu();
+        $this->showVersion();
+        $this->showPluginMenu();
+        echo '</div>';
+    }
+
+    /**
+     * Display the standard admin tasks
+     */
+    protected function showAdminMenu() {
+        /** @var \DokuWiki_Auth_Plugin $auth */
+        global $auth;
+        global $INFO;
+
+        if(!$INFO['isadmin']) return;
+
+        // user manager only if the auth backend supports it
+        if(!$auth || !$auth->canDo('getUsers') ) {
+            if(isset($this->menu['usermanager'])) unset($this->menu['usermanager']);
+        }
+
+        echo '<ul class="admin_tasks">';
+        foreach(array('usermanager','acl', 'extension', 'config', 'styling') as $plugin) {
+            if(!isset($this->menu[$plugin])) continue;
+            $this->showMenuItem($this->menu[$plugin]);
+            unset($this->menu[$plugin]);
+        }
+        echo '</ul>';
+    }
+
+    /**
+     * Display the standard manager tasks
+     */
+    protected function showManagerMenu() {
+        echo '<ul class="admin_tasks">';
+        foreach(array('revert','popularity') as $plugin) {
+            if(!isset($this->menu[$plugin])) continue;
+            $this->showMenuItem($this->menu[$plugin]);
+            unset($this->menu[$plugin]);
+        }
+        echo '</ul>';
+    }
+
+    /**
+     * Display all the remaining plugins
+     */
+    protected function showPluginMenu() {
+        if(!count($this->menu)) return;
+        echo p_locale_xhtml('adminplugins');
+        echo '<ul class="admin_plugins">';
+        foreach ($this->menu as $item) {
+            $this->showMenuItem($item);
+        }
+        echo '</ul>';
+    }
+
+    /**
+     * Display the DokuWiki version
+     */
+    protected function showVersion() {
+        echo '<div id="admin__version">';
+        echo getVersion();
+        echo '</div>';
+    }
+
+    /**
+     * data security check
+     *
+     * simple check if the 'savedir' is relative and accessible when appended to DOKU_URL
+     *
+     * it verifies either:
+     *   'savedir' has been moved elsewhere, or
+     *   has protection to prevent the webserver serving files from it
+     */
+    protected function showSecurityCheck() {
+        global $conf;
+        if(substr($conf['savedir'], 0, 2) !== './') return;
+        echo '<a style="border:none; float:right;"
+                href="http://www.dokuwiki.org/security#web_access_security">
+                <img src="' . DOKU_URL . $conf['savedir'] . '/dont-panic-if-you-see-this-in-your-logs-it-means-your-directory-permissions-are-correct.png" alt="Your data directory seems to be protected properly."
+                onerror="this.parentNode.style.display=\'none\'" /></a>';
+    }
+
+    /**
+     * Display a single Admin menu item
+     *
+     * @param array $item
+     */
+    protected function showMenuItem($item) {
+        global $ID;
+        if(blank($item['prompt'])) return;
+        echo '<li><div class="li">';
+        echo '<a href="' . wl($ID, 'do=admin&amp;page=' . $item['plugin']) . '">';
+        echo '<span class="icon">';
+        echo inlineSVG($item['icon']);
+        echo '</span>';
+        echo '<span class="prompt">';
+        echo $item['prompt'];
+        echo '</span>';
+        echo '</a>';
+        echo '</div></li>';
+    }
+
+    /**
+     * Build  list of admin functions from the plugins that handle them
+     *
+     * Checks the current permissions to decide on manager or admin plugins
+     *
+     * @return array list of plugins with their properties
+     */
+    protected function getPluginList() {
+        global $INFO;
+        global $conf;
+
+        $pluginlist = plugin_list('admin');
+        $menu = array();
+        foreach($pluginlist as $p) {
+            /** @var \DokuWiki_Admin_Plugin $obj */
+            if(($obj = plugin_load('admin', $p)) === null) continue;
+
+            // check permissions
+            if($obj->forAdminOnly() && !$INFO['isadmin']) continue;
+
+            $menu[$p] = array(
+                'plugin' => $p,
+                'prompt' => $obj->getMenuText($conf['lang']),
+                'icon' => $obj->getMenuIcon(),
+                'sort' => $obj->getMenuSort(),
+            );
+        }
+
+        // sort by name, then sort
+        uasort(
+            $menu,
+            function ($a, $b) {
+                $strcmp = strcasecmp($a['prompt'], $b['prompt']);
+                if($strcmp != 0) return $strcmp;
+                if($a['sort'] == $b['sort']) return 0;
+                return ($a['sort'] < $b['sort']) ? -1 : 1;
+            }
+        );
+
+        return $menu;
+    }
+
+}
diff --git a/wiki/inc/Ui/Search.php b/wiki/inc/Ui/Search.php
new file mode 100644
index 0000000..419b967
--- /dev/null
+++ b/wiki/inc/Ui/Search.php
@@ -0,0 +1,644 @@
+<?php
+
+namespace dokuwiki\Ui;
+
+use \dokuwiki\Form\Form;
+
+class Search extends Ui
+{
+    protected $query;
+    protected $parsedQuery;
+    protected $searchState;
+    protected $pageLookupResults = array();
+    protected $fullTextResults = array();
+    protected $highlight = array();
+
+    /**
+     * Search constructor.
+     *
+     * @param array $pageLookupResults pagename lookup results in the form [pagename => pagetitle]
+     * @param array $fullTextResults fulltext search results in the form [pagename => #hits]
+     * @param array $highlight  array of strings to be highlighted
+     */
+    public function __construct(array $pageLookupResults, array $fullTextResults, $highlight)
+    {
+        global $QUERY;
+        $Indexer = idx_get_indexer();
+
+        $this->query = $QUERY;
+        $this->parsedQuery = ft_queryParser($Indexer, $QUERY);
+        $this->searchState = new SearchState($this->parsedQuery);
+
+        $this->pageLookupResults = $pageLookupResults;
+        $this->fullTextResults = $fullTextResults;
+        $this->highlight = $highlight;
+    }
+
+    /**
+     * display the search result
+     *
+     * @return void
+     */
+    public function show()
+    {
+        $searchHTML = '';
+
+        $searchHTML .= $this->getSearchIntroHTML($this->query);
+
+        $searchHTML .= $this->getSearchFormHTML($this->query);
+
+        $searchHTML .= $this->getPageLookupHTML($this->pageLookupResults);
+
+        $searchHTML .= $this->getFulltextResultsHTML($this->fullTextResults, $this->highlight);
+
+        echo $searchHTML;
+    }
+
+    /**
+     * Get a form which can be used to adjust/refine the search
+     *
+     * @param string $query
+     *
+     * @return string
+     */
+    protected function getSearchFormHTML($query)
+    {
+        global $lang, $ID, $INPUT;
+
+        $searchForm = (new Form(['method' => 'get'], true))->addClass('search-results-form');
+        $searchForm->setHiddenField('do', 'search');
+        $searchForm->setHiddenField('id', $ID);
+        $searchForm->setHiddenField('sf', '1');
+        if ($INPUT->has('min')) {
+            $searchForm->setHiddenField('min', $INPUT->str('min'));
+        }
+        if ($INPUT->has('max')) {
+            $searchForm->setHiddenField('max', $INPUT->str('max'));
+        }
+        if ($INPUT->has('srt')) {
+            $searchForm->setHiddenField('srt', $INPUT->str('srt'));
+        }
+        $searchForm->addFieldsetOpen()->addClass('search-form');
+        $searchForm->addTextInput('q')->val($query)->useInput(false);
+        $searchForm->addButton('', $lang['btn_search'])->attr('type', 'submit');
+
+        $this->addSearchAssistanceElements($searchForm);
+
+        $searchForm->addFieldsetClose();
+
+        trigger_event('FORM_SEARCH_OUTPUT', $searchForm);
+
+        return $searchForm->toHTML();
+    }
+
+    /**
+     * Add elements to adjust how the results are sorted
+     *
+     * @param Form $searchForm
+     */
+    protected function addSortTool(Form $searchForm)
+    {
+        global $INPUT, $lang;
+
+        $options = [
+            'hits' => [
+                'label' => $lang['search_sort_by_hits'],
+                'sort' => '',
+            ],
+            'mtime' => [
+                'label' => $lang['search_sort_by_mtime'],
+                'sort' => 'mtime',
+            ],
+        ];
+        $activeOption = 'hits';
+
+        if ($INPUT->str('srt') === 'mtime') {
+            $activeOption = 'mtime';
+        }
+
+        $searchForm->addTagOpen('div')->addClass('toggle')->attr('aria-haspopup', 'true');
+        // render current
+        $currentWrapper = $searchForm->addTagOpen('div')->addClass('current');
+        if ($activeOption !== 'hits') {
+            $currentWrapper->addClass('changed');
+        }
+        $searchForm->addHTML($options[$activeOption]['label']);
+        $searchForm->addTagClose('div');
+
+        // render options list
+        $searchForm->addTagOpen('ul')->attr('aria-expanded', 'false');
+
+        foreach ($options as $key => $option) {
+            $listItem = $searchForm->addTagOpen('li');
+
+            if ($key === $activeOption) {
+                $listItem->addClass('active');
+                $searchForm->addHTML($option['label']);
+            } else {
+                $link = $this->searchState->withSorting($option['sort'])->getSearchLink($option['label']);
+                $searchForm->addHTML($link);
+            }
+            $searchForm->addTagClose('li');
+        }
+        $searchForm->addTagClose('ul');
+
+        $searchForm->addTagClose('div');
+
+    }
+
+    /**
+     * Check if the query is simple enough to modify its namespace limitations without breaking the rest of the query
+     *
+     * @param array $parsedQuery
+     *
+     * @return bool
+     */
+    protected function isNamespaceAssistanceAvailable(array $parsedQuery) {
+        if (preg_match('/[\(\)\|]/', $parsedQuery['query']) === 1) {
+            return false;
+        }
+
+        return true;
+    }
+
+    /**
+     * Check if the query is simple enough to modify the fragment search behavior without breaking the rest of the query
+     *
+     * @param array $parsedQuery
+     *
+     * @return bool
+     */
+    protected function isFragmentAssistanceAvailable(array $parsedQuery) {
+        if (preg_match('/[\(\)\|]/', $parsedQuery['query']) === 1) {
+            return false;
+        }
+
+        if (!empty($parsedQuery['phrases'])) {
+            return false;
+        }
+
+        return true;
+    }
+
+    /**
+     * Add the elements to be used for search assistance
+     *
+     * @param Form $searchForm
+     */
+    protected function addSearchAssistanceElements(Form $searchForm)
+    {
+        $searchForm->addTagOpen('div')
+            ->addClass('advancedOptions')
+            ->attr('style', 'display: none;')
+            ->attr('aria-hidden', 'true');
+
+        $this->addFragmentBehaviorLinks($searchForm);
+        $this->addNamespaceSelector($searchForm);
+        $this->addDateSelector($searchForm);
+        $this->addSortTool($searchForm);
+
+        $searchForm->addTagClose('div');
+    }
+
+    /**
+     *  Add the elements to adjust the fragment search behavior
+     *
+     * @param Form $searchForm
+     */
+    protected function addFragmentBehaviorLinks(Form $searchForm)
+    {
+        if (!$this->isFragmentAssistanceAvailable($this->parsedQuery)) {
+            return;
+        }
+        global $lang;
+
+        $options = [
+            'exact' => [
+                'label' => $lang['search_exact_match'],
+                'and' => array_map(function ($term) {
+                    return trim($term, '*');
+                }, $this->parsedQuery['and']),
+                'not' => array_map(function ($term) {
+                    return trim($term, '*');
+                }, $this->parsedQuery['not']),
+            ],
+            'starts' => [
+                'label' => $lang['search_starts_with'],
+                'and' => array_map(function ($term) {
+                    return trim($term, '*') . '*';
+                }, $this->parsedQuery['and']),
+                'not' => array_map(function ($term) {
+                    return trim($term, '*') . '*';
+                }, $this->parsedQuery['not']),
+            ],
+            'ends' => [
+                'label' => $lang['search_ends_with'],
+                'and' => array_map(function ($term) {
+                    return '*' . trim($term, '*');
+                }, $this->parsedQuery['and']),
+                'not' => array_map(function ($term) {
+                    return '*' . trim($term, '*');
+                }, $this->parsedQuery['not']),
+            ],
+            'contains' => [
+                'label' => $lang['search_contains'],
+                'and' => array_map(function ($term) {
+                    return '*' . trim($term, '*') . '*';
+                }, $this->parsedQuery['and']),
+                'not' => array_map(function ($term) {
+                    return '*' . trim($term, '*') . '*';
+                }, $this->parsedQuery['not']),
+            ]
+        ];
+
+        // detect current
+        $activeOption = 'custom';
+        foreach ($options as $key => $option) {
+            if ($this->parsedQuery['and'] === $option['and']) {
+                $activeOption = $key;
+            }
+        }
+        if ($activeOption === 'custom') {
+            $options = array_merge(['custom' => [
+                'label' => $lang['search_custom_match'],
+            ]], $options);
+        }
+
+        $searchForm->addTagOpen('div')->addClass('toggle')->attr('aria-haspopup', 'true');
+        // render current
+        $currentWrapper = $searchForm->addTagOpen('div')->addClass('current');
+        if ($activeOption !== 'exact') {
+            $currentWrapper->addClass('changed');
+        }
+        $searchForm->addHTML($options[$activeOption]['label']);
+        $searchForm->addTagClose('div');
+
+        // render options list
+        $searchForm->addTagOpen('ul')->attr('aria-expanded', 'false');
+
+        foreach ($options as $key => $option) {
+            $listItem = $searchForm->addTagOpen('li');
+
+            if ($key === $activeOption) {
+                $listItem->addClass('active');
+                $searchForm->addHTML($option['label']);
+            } else {
+                $link = $this->searchState
+                    ->withFragments($option['and'], $option['not'])
+                    ->getSearchLink($option['label'])
+                ;
+                $searchForm->addHTML($link);
+            }
+            $searchForm->addTagClose('li');
+        }
+        $searchForm->addTagClose('ul');
+
+        $searchForm->addTagClose('div');
+
+        // render options list
+    }
+
+    /**
+     * Add the elements for the namespace selector
+     *
+     * @param Form $searchForm
+     */
+    protected function addNamespaceSelector(Form $searchForm)
+    {
+        if (!$this->isNamespaceAssistanceAvailable($this->parsedQuery)) {
+            return;
+        }
+
+        global $lang;
+
+        $baseNS = empty($this->parsedQuery['ns']) ? '' : $this->parsedQuery['ns'][0];
+        $extraNS = $this->getAdditionalNamespacesFromResults($baseNS);
+
+        $searchForm->addTagOpen('div')->addClass('toggle')->attr('aria-haspopup', 'true');
+        // render current
+        $currentWrapper = $searchForm->addTagOpen('div')->addClass('current');
+        if ($baseNS) {
+            $currentWrapper->addClass('changed');
+            $searchForm->addHTML('@' . $baseNS);
+        } else {
+            $searchForm->addHTML($lang['search_any_ns']);
+        }
+        $searchForm->addTagClose('div');
+
+        // render options list
+        $searchForm->addTagOpen('ul')->attr('aria-expanded', 'false');
+
+        $listItem = $searchForm->addTagOpen('li');
+        if ($baseNS) {
+            $listItem->addClass('active');
+            $link = $this->searchState->withNamespace('')->getSearchLink($lang['search_any_ns']);
+            $searchForm->addHTML($link);
+        } else {
+            $searchForm->addHTML($lang['search_any_ns']);
+        }
+        $searchForm->addTagClose('li');
+
+        foreach ($extraNS as $ns => $count) {
+            $listItem = $searchForm->addTagOpen('li');
+            $label = $ns . ($count ? " <bdi>($count)</bdi>" : '');
+
+            if ($ns === $baseNS) {
+                $listItem->addClass('active');
+                $searchForm->addHTML($label);
+            } else {
+                $link = $this->searchState->withNamespace($ns)->getSearchLink($label);
+                $searchForm->addHTML($link);
+            }
+            $searchForm->addTagClose('li');
+        }
+        $searchForm->addTagClose('ul');
+
+        $searchForm->addTagClose('div');
+
+    }
+
+    /**
+     * Parse the full text results for their top namespaces below the given base namespace
+     *
+     * @param string $baseNS the namespace within which was searched, empty string for root namespace
+     *
+     * @return array an associative array with namespace => #number of found pages, sorted descending
+     */
+    protected function getAdditionalNamespacesFromResults($baseNS)
+    {
+        $namespaces = [];
+        $baseNSLength = strlen($baseNS);
+        foreach ($this->fullTextResults as $page => $numberOfHits) {
+            $namespace = getNS($page);
+            if (!$namespace) {
+                continue;
+            }
+            if ($namespace === $baseNS) {
+                continue;
+            }
+            $firstColon = strpos((string)$namespace, ':', $baseNSLength + 1) ?: strlen($namespace);
+            $subtopNS = substr($namespace, 0, $firstColon);
+            if (empty($namespaces[$subtopNS])) {
+                $namespaces[$subtopNS] = 0;
+            }
+            $namespaces[$subtopNS] += 1;
+        }
+        ksort($namespaces);
+        arsort($namespaces);
+        return $namespaces;
+    }
+
+    /**
+     * @ToDo: custom date input
+     *
+     * @param Form $searchForm
+     */
+    protected function addDateSelector(Form $searchForm)
+    {
+        global $INPUT, $lang;
+
+        $options = [
+            'any' => [
+                'before' => false,
+                'after' => false,
+                'label' => $lang['search_any_time'],
+            ],
+            'week' => [
+                'before' => false,
+                'after' => '1 week ago',
+                'label' => $lang['search_past_7_days'],
+            ],
+            'month' => [
+                'before' => false,
+                'after' => '1 month ago',
+                'label' => $lang['search_past_month'],
+            ],
+            'year' => [
+                'before' => false,
+                'after' => '1 year ago',
+                'label' => $lang['search_past_year'],
+            ],
+        ];
+        $activeOption = 'any';
+        foreach ($options as $key => $option) {
+            if ($INPUT->str('min') === $option['after']) {
+                $activeOption = $key;
+                break;
+            }
+        }
+
+        $searchForm->addTagOpen('div')->addClass('toggle')->attr('aria-haspopup', 'true');
+        // render current
+        $currentWrapper = $searchForm->addTagOpen('div')->addClass('current');
+        if ($INPUT->has('max') || $INPUT->has('min')) {
+            $currentWrapper->addClass('changed');
+        }
+        $searchForm->addHTML($options[$activeOption]['label']);
+        $searchForm->addTagClose('div');
+
+        // render options list
+        $searchForm->addTagOpen('ul')->attr('aria-expanded', 'false');
+
+        foreach ($options as $key => $option) {
+            $listItem = $searchForm->addTagOpen('li');
+
+            if ($key === $activeOption) {
+                $listItem->addClass('active');
+                $searchForm->addHTML($option['label']);
+            } else {
+                $link = $this->searchState
+                    ->withTimeLimitations($option['after'], $option['before'])
+                    ->getSearchLink($option['label'])
+                ;
+                $searchForm->addHTML($link);
+            }
+            $searchForm->addTagClose('li');
+        }
+        $searchForm->addTagClose('ul');
+
+        $searchForm->addTagClose('div');
+    }
+
+
+    /**
+     * Build the intro text for the search page
+     *
+     * @param string $query the search query
+     *
+     * @return string
+     */
+    protected function getSearchIntroHTML($query)
+    {
+        global $lang;
+
+        $intro = p_locale_xhtml('searchpage');
+
+        $queryPagename = $this->createPagenameFromQuery($this->parsedQuery);
+        $createQueryPageLink = html_wikilink($queryPagename . '?do=edit', $queryPagename);
+
+        $pagecreateinfo = '';
+        if (auth_quickaclcheck($queryPagename) >= AUTH_CREATE) {
+            $pagecreateinfo = sprintf($lang['searchcreatepage'], $createQueryPageLink);
+        }
+        $intro = str_replace(
+            array('@QUERY@', '@SEARCH@', '@CREATEPAGEINFO@'),
+            array(hsc(rawurlencode($query)), hsc($query), $pagecreateinfo),
+            $intro
+        );
+
+        return $intro;
+    }
+
+    /**
+     * Create a pagename based the parsed search query
+     *
+     * @param array $parsedQuery
+     *
+     * @return string pagename constructed from the parsed query
+     */
+    public function createPagenameFromQuery($parsedQuery)
+    {
+        $cleanedQuery = cleanID($parsedQuery['query']);
+        if ($cleanedQuery === $parsedQuery['query']) {
+            return ':' . $cleanedQuery;
+        }
+        $pagename = '';
+        if (!empty($parsedQuery['ns'])) {
+            $pagename .= ':' . cleanID($parsedQuery['ns'][0]);
+        }
+        $pagename .= ':' . cleanID(implode(' ' , $parsedQuery['highlight']));
+        return $pagename;
+    }
+
+    /**
+     * Build HTML for a list of pages with matching pagenames
+     *
+     * @param array $data search results
+     *
+     * @return string
+     */
+    protected function getPageLookupHTML($data)
+    {
+        if (empty($data)) {
+            return '';
+        }
+
+        global $lang;
+
+        $html = '<div class="search_quickresult">';
+        $html .= '<h2>' . $lang['quickhits'] . ':</h2>';
+        $html .= '<ul class="search_quickhits">';
+        foreach ($data as $id => $title) {
+            $name = null;
+            if (!useHeading('navigation') && $ns = getNS($id)) {
+                $name = shorten(noNS($id), ' (' . $ns . ')', 30);
+            }
+            $link = html_wikilink(':' . $id, $name);
+            $eventData = [
+                'listItemContent' => [$link],
+                'page' => $id,
+            ];
+            trigger_event('SEARCH_RESULT_PAGELOOKUP', $eventData);
+            $html .= '<li>' . implode('', $eventData['listItemContent']) . '</li>';
+        }
+        $html .= '</ul> ';
+        //clear float (see http://www.complexspiral.com/publications/containing-floats/)
+        $html .= '<div class="clearer"></div>';
+        $html .= '</div>';
+
+        return $html;
+    }
+
+    /**
+     * Build HTML for fulltext search results or "no results" message
+     *
+     * @param array $data      the results of the fulltext search
+     * @param array $highlight the terms to be highlighted in the results
+     *
+     * @return string
+     */
+    protected function getFulltextResultsHTML($data, $highlight)
+    {
+        global $lang;
+
+        if (empty($data)) {
+            return '<div class="nothing">' . $lang['nothingfound'] . '</div>';
+        }
+
+        $html = '<div class="search_fulltextresult">';
+        $html .= '<h2>' . $lang['search_fullresults'] . ':</h2>';
+
+        $html .= '<dl class="search_results">';
+        $num = 0;
+        $position = 0;
+
+        foreach ($data as $id => $cnt) {
+            $position += 1;
+            $resultLink = html_wikilink(':' . $id, null, $highlight);
+
+            $resultHeader = [$resultLink];
+
+
+            $restrictQueryToNSLink = $this->restrictQueryToNSLink(getNS($id));
+            if ($restrictQueryToNSLink) {
+                $resultHeader[] = $restrictQueryToNSLink;
+            }
+
+            $resultBody = [];
+            $mtime = filemtime(wikiFN($id));
+            $lastMod = '<span class="lastmod">' . $lang['lastmod'] . '</span> ';
+            $lastMod .= '<time datetime="' . date_iso8601($mtime) . '" title="'.dformat($mtime).'">' . dformat($mtime, '%f') . '</time>';
+            $resultBody['meta'] = $lastMod;
+            if ($cnt !== 0) {
+                $num++;
+                $hits = '<span class="hits">' . $cnt . ' ' . $lang['hits'] . '</span>, ';
+                $resultBody['meta'] = $hits . $resultBody['meta'];
+                if ($num <= FT_SNIPPET_NUMBER) { // create snippets for the first number of matches only
+                    $resultBody['snippet'] = ft_snippet($id, $highlight);
+                }
+            }
+
+            $eventData = [
+                'resultHeader' => $resultHeader,
+                'resultBody' => $resultBody,
+                'page' => $id,
+                'position' => $position,
+            ];
+            trigger_event('SEARCH_RESULT_FULLPAGE', $eventData);
+            $html .= '<div class="search_fullpage_result">';
+            $html .= '<dt>' . implode(' ', $eventData['resultHeader']) . '</dt>';
+            foreach ($eventData['resultBody'] as $class => $htmlContent) {
+                $html .= "<dd class=\"$class\">$htmlContent</dd>";
+            }
+            $html .= '</div>';
+        }
+        $html .= '</dl>';
+
+        $html .= '</div>';
+
+        return $html;
+    }
+
+    /**
+     * create a link to restrict the current query to a namespace
+     *
+     * @param false|string $ns the namespace to which to restrict the query
+     *
+     * @return false|string
+     */
+    protected function restrictQueryToNSLink($ns)
+    {
+        if (!$ns) {
+            return false;
+        }
+        if (!$this->isNamespaceAssistanceAvailable($this->parsedQuery)) {
+            return false;
+        }
+        if (!empty($this->parsedQuery['ns']) && $this->parsedQuery['ns'][0] === $ns) {
+            return false;
+        }
+
+        $name = '@' . $ns;
+        return $this->searchState->withNamespace($ns)->getSearchLink($name);
+    }
+}
diff --git a/wiki/inc/Ui/SearchState.php b/wiki/inc/Ui/SearchState.php
new file mode 100644
index 0000000..eb3f7fa
--- /dev/null
+++ b/wiki/inc/Ui/SearchState.php
@@ -0,0 +1,141 @@
+<?php
+
+namespace dokuwiki\Ui;
+
+class SearchState
+{
+    /**
+     * @var array
+     */
+    protected $parsedQuery = [];
+
+    /**
+     * SearchState constructor.
+     *
+     * @param array $parsedQuery
+     */
+    public function __construct(array $parsedQuery)
+    {
+        global $INPUT;
+
+        $this->parsedQuery = $parsedQuery;
+        if (!isset($parsedQuery['after'])) {
+            $this->parsedQuery['after'] = $INPUT->str('min');
+        }
+        if (!isset($parsedQuery['before'])) {
+            $this->parsedQuery['before'] = $INPUT->str('max');
+        }
+        if (!isset($parsedQuery['sort'])) {
+            $this->parsedQuery['sort'] = $INPUT->str('srt');
+        }
+    }
+
+    /**
+     * Get a search state for the current search limited to a new namespace
+     *
+     * @param string $ns the namespace to which to limit the search, falsy to remove the limitation
+     * @param array  $notns
+     *
+     * @return SearchState
+     */
+    public function withNamespace($ns, array $notns = [])
+    {
+        $parsedQuery = $this->parsedQuery;
+        $parsedQuery['ns'] = $ns ? [$ns] : [];
+        $parsedQuery['notns'] = $notns;
+
+        return new SearchState($parsedQuery);
+    }
+
+    /**
+     * Get a search state for the current search with new search fragments and optionally phrases
+     *
+     * @param array $and
+     * @param array $not
+     * @param array $phrases
+     *
+     * @return SearchState
+     */
+    public function withFragments(array $and, array $not, array $phrases = [])
+    {
+        $parsedQuery = $this->parsedQuery;
+        $parsedQuery['and'] = $and;
+        $parsedQuery['not'] = $not;
+        $parsedQuery['phrases'] = $phrases;
+
+        return new SearchState($parsedQuery);
+    }
+
+    /**
+     * Get a search state for the current search with with adjusted time limitations
+     *
+     * @param $after
+     * @param $before
+     *
+     * @return SearchState
+     */
+    public function withTimeLimitations($after, $before)
+    {
+        $parsedQuery = $this->parsedQuery;
+        $parsedQuery['after'] = $after;
+        $parsedQuery['before'] = $before;
+
+        return new SearchState($parsedQuery);
+    }
+
+    /**
+     * Get a search state for the current search with adjusted sort preference
+     *
+     * @param $sort
+     *
+     * @return SearchState
+     */
+    public function withSorting($sort)
+    {
+        $parsedQuery = $this->parsedQuery;
+        $parsedQuery['sort'] = $sort;
+
+        return new SearchState($parsedQuery);
+    }
+
+    /**
+     * Get a link that represents the current search state
+     *
+     * Note that this represents only a simplified version of the search state.
+     * Grouping with braces and "OR" conditions are not supported.
+     *
+     * @param $label
+     *
+     * @return string
+     */
+    public function getSearchLink($label)
+    {
+        global $ID, $conf;
+        $parsedQuery = $this->parsedQuery;
+
+        $tagAttributes = [
+            'target' => $conf['target']['wiki'],
+        ];
+
+        $newQuery = ft_queryUnparser_simple(
+            $parsedQuery['and'],
+            $parsedQuery['not'],
+            $parsedQuery['phrases'],
+            $parsedQuery['ns'],
+            $parsedQuery['notns']
+        );
+        $hrefAttributes = ['do' => 'search', 'sf' => '1', 'q' => $newQuery];
+        if ($parsedQuery['after']) {
+            $hrefAttributes['min'] = $parsedQuery['after'];
+        }
+        if ($parsedQuery['before']) {
+            $hrefAttributes['max'] = $parsedQuery['before'];
+        }
+        if ($parsedQuery['sort']) {
+            $hrefAttributes['srt'] = $parsedQuery['sort'];
+        }
+
+        $href = wl($ID, $hrefAttributes, false, '&');
+        return "<a href='$href' " . buildAttributes($tagAttributes, true) . ">$label</a>";
+    }
+}
diff --git a/wiki/inc/Ui/Ui.php b/wiki/inc/Ui/Ui.php
new file mode 100644
index 0000000..8aac0de
--- /dev/null
+++ b/wiki/inc/Ui/Ui.php
@@ -0,0 +1,20 @@
+<?php
+namespace dokuwiki\Ui;
+
+/**
+ * Class Ui
+ *
+ * Abstract base class for all DokuWiki screens
+ *
+ * @package dokuwiki\Ui
+ */
+abstract class Ui {
+
+    /**
+     * Display the UI element
+     *
+     * @return void
+     */
+    abstract public function show();
+
+}
diff --git a/wiki/inc/actions.php b/wiki/inc/actions.php
new file mode 100644
index 0000000..9ba8878
--- /dev/null
+++ b/wiki/inc/actions.php
@@ -0,0 +1,64 @@
+<?php
+/**
+ * DokuWiki Actions
+ *
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author     Andreas Gohr <andi@splitbrain.org>
+ */
+
+if(!defined('DOKU_INC')) die('meh.');
+
+/**
+ * All action processing starts here
+ */
+function act_dispatch(){
+    // always initialize on first dispatch (test request may dispatch mutliple times on one request)
+    $router = \dokuwiki\ActionRouter::getInstance(true);
+
+    $headers = array('Content-Type: text/html; charset=utf-8');
+    trigger_event('ACTION_HEADERS_SEND',$headers,'act_sendheaders');
+
+    // clear internal variables
+    unset($router);
+    unset($headers);
+    // make all globals available to the template
+    extract($GLOBALS);
+
+    include(template('main.php'));
+    // output for the commands is now handled in inc/templates.php
+    // in function tpl_content()
+}
+
+/**
+ * Send the given headers using header()
+ *
+ * @param array $headers The headers that shall be sent
+ */
+function act_sendheaders($headers) {
+    foreach ($headers as $hdr) header($hdr);
+}
+
+/**
+ * Sanitize the action command
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param array|string $act
+ * @return string
+ */
+function act_clean($act){
+    // check if the action was given as array key
+    if(is_array($act)){
+        list($act) = array_keys($act);
+    }
+
+    //remove all bad chars
+    $act = strtolower($act);
+    $act = preg_replace('/[^1-9a-z_]+/','',$act);
+
+    if($act == 'export_html') $act = 'export_xhtml';
+    if($act == 'export_htmlbody') $act = 'export_xhtmlbody';
+
+    if($act === '') $act = 'show';
+    return $act;
+}
diff --git a/wiki/inc/auth.php b/wiki/inc/auth.php
new file mode 100644
index 0000000..e1d7a64
--- /dev/null
+++ b/wiki/inc/auth.php
@@ -0,0 +1,1267 @@
+<?php
+/**
+ * Authentication library
+ *
+ * Including this file will automatically try to login
+ * a user by calling auth_login()
+ *
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author     Andreas Gohr <andi@splitbrain.org>
+ */
+
+if(!defined('DOKU_INC')) die('meh.');
+
+// some ACL level defines
+define('AUTH_NONE', 0);
+define('AUTH_READ', 1);
+define('AUTH_EDIT', 2);
+define('AUTH_CREATE', 4);
+define('AUTH_UPLOAD', 8);
+define('AUTH_DELETE', 16);
+define('AUTH_ADMIN', 255);
+
+/**
+ * Initialize the auth system.
+ *
+ * This function is automatically called at the end of init.php
+ *
+ * This used to be the main() of the auth.php
+ *
+ * @todo backend loading maybe should be handled by the class autoloader
+ * @todo maybe split into multiple functions at the XXX marked positions
+ * @triggers AUTH_LOGIN_CHECK
+ * @return bool
+ */
+function auth_setup() {
+    global $conf;
+    /* @var DokuWiki_Auth_Plugin $auth */
+    global $auth;
+    /* @var Input $INPUT */
+    global $INPUT;
+    global $AUTH_ACL;
+    global $lang;
+    /* @var Doku_Plugin_Controller $plugin_controller */
+    global $plugin_controller;
+    $AUTH_ACL = array();
+
+    if(!$conf['useacl']) return false;
+
+    // try to load auth backend from plugins
+    foreach ($plugin_controller->getList('auth') as $plugin) {
+        if ($conf['authtype'] === $plugin) {
+            $auth = $plugin_controller->load('auth', $plugin);
+            break;
+        }
+    }
+
+    if(!isset($auth) || !$auth){
+        msg($lang['authtempfail'], -1);
+        return false;
+    }
+
+    if ($auth->success == false) {
+        // degrade to unauthenticated user
+        unset($auth);
+        auth_logoff();
+        msg($lang['authtempfail'], -1);
+        return false;
+    }
+
+    // do the login either by cookie or provided credentials XXX
+    $INPUT->set('http_credentials', false);
+    if(!$conf['rememberme']) $INPUT->set('r', false);
+
+    // handle renamed HTTP_AUTHORIZATION variable (can happen when a fix like
+    // the one presented at
+    // http://www.besthostratings.com/articles/http-auth-php-cgi.html is used
+    // for enabling HTTP authentication with CGI/SuExec)
+    if(isset($_SERVER['REDIRECT_HTTP_AUTHORIZATION']))
+        $_SERVER['HTTP_AUTHORIZATION'] = $_SERVER['REDIRECT_HTTP_AUTHORIZATION'];
+    // streamline HTTP auth credentials (IIS/rewrite -> mod_php)
+    if(isset($_SERVER['HTTP_AUTHORIZATION'])) {
+        list($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']) =
+            explode(':', base64_decode(substr($_SERVER['HTTP_AUTHORIZATION'], 6)));
+    }
+
+    // if no credentials were given try to use HTTP auth (for SSO)
+    if(!$INPUT->str('u') && empty($_COOKIE[DOKU_COOKIE]) && !empty($_SERVER['PHP_AUTH_USER'])) {
+        $INPUT->set('u', $_SERVER['PHP_AUTH_USER']);
+        $INPUT->set('p', $_SERVER['PHP_AUTH_PW']);
+        $INPUT->set('http_credentials', true);
+    }
+
+    // apply cleaning (auth specific user names, remove control chars)
+    if (true === $auth->success) {
+        $INPUT->set('u', $auth->cleanUser(stripctl($INPUT->str('u'))));
+        $INPUT->set('p', stripctl($INPUT->str('p')));
+    }
+
+    if(!is_null($auth) && $auth->canDo('external')) {
+        // external trust mechanism in place
+        $auth->trustExternal($INPUT->str('u'), $INPUT->str('p'), $INPUT->bool('r'));
+    } else {
+        $evdata = array(
+            'user'     => $INPUT->str('u'),
+            'password' => $INPUT->str('p'),
+            'sticky'   => $INPUT->bool('r'),
+            'silent'   => $INPUT->bool('http_credentials')
+        );
+        trigger_event('AUTH_LOGIN_CHECK', $evdata, 'auth_login_wrapper');
+    }
+
+    //load ACL into a global array XXX
+    $AUTH_ACL = auth_loadACL();
+
+    return true;
+}
+
+/**
+ * Loads the ACL setup and handle user wildcards
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @return array
+ */
+function auth_loadACL() {
+    global $config_cascade;
+    global $USERINFO;
+    /* @var Input $INPUT */
+    global $INPUT;
+
+    if(!is_readable($config_cascade['acl']['default'])) return array();
+
+    $acl = file($config_cascade['acl']['default']);
+
+    $out = array();
+    foreach($acl as $line) {
+        $line = trim($line);
+        if(empty($line) || ($line{0} == '#')) continue; // skip blank lines & comments
+        list($id,$rest) = preg_split('/[ \t]+/',$line,2);
+
+        // 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 (!$INPUT->server->has('REMOTE_USER')) continue;
+
+            $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)
+        if(strstr($line, '%GROUP%')){
+            // if user is not logged in, grps is empty, no output will be added (i.e. skipped)
+            foreach((array) $USERINFO['grps'] as $grp){
+                $nid   = str_replace('%GROUP%',cleanID($grp),$id);
+                $nrest = str_replace('%GROUP%','@'.auth_nameencode($grp),$rest);
+                $out[] = "$nid\t$nrest";
+            }
+        } else {
+            $out[] = "$id\t$rest";
+        }
+    }
+
+    return $out;
+}
+
+/**
+ * Event hook callback for AUTH_LOGIN_CHECK
+ *
+ * @param array $evdata
+ * @return bool
+ */
+function auth_login_wrapper($evdata) {
+    return auth_login(
+        $evdata['user'],
+        $evdata['password'],
+        $evdata['sticky'],
+        $evdata['silent']
+    );
+}
+
+/**
+ * This tries to login the user based on the sent auth credentials
+ *
+ * The authentication works like this: if a username was given
+ * a new login is assumed and user/password are checked. If they
+ * are correct the password is encrypted with blowfish and stored
+ * together with the username in a cookie - the same info is stored
+ * in the session, too. Additonally a browserID is stored in the
+ * session.
+ *
+ * If no username was given the cookie is checked: if the username,
+ * crypted password and browserID match between session and cookie
+ * no further testing is done and the user is accepted
+ *
+ * If a cookie was found but no session info was availabe the
+ * blowfish encrypted password from the cookie is decrypted and
+ * together with username rechecked by calling this function again.
+ *
+ * On a successful login $_SERVER[REMOTE_USER] and $USERINFO
+ * are set.
+ *
+ * @author  Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param   string  $user    Username
+ * @param   string  $pass    Cleartext Password
+ * @param   bool    $sticky  Cookie should not expire
+ * @param   bool    $silent  Don't show error on bad auth
+ * @return  bool             true on successful auth
+ */
+function auth_login($user, $pass, $sticky = false, $silent = false) {
+    global $USERINFO;
+    global $conf;
+    global $lang;
+    /* @var DokuWiki_Auth_Plugin $auth */
+    global $auth;
+    /* @var Input $INPUT */
+    global $INPUT;
+
+    $sticky ? $sticky = true : $sticky = false; //sanity check
+
+    if(!$auth) return false;
+
+    if(!empty($user)) {
+        //usual login
+        if(!empty($pass) && $auth->checkPass($user, $pass)) {
+            // make logininfo globally available
+            $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;
+        } else {
+            //invalid credentials - log off
+            if(!$silent) {
+                http_status(403, 'Login failed');
+                msg($lang['badlogin'], -1);
+            }
+            auth_logoff();
+            return false;
+        }
+    } else {
+        // read cookie information
+        list($user, $sticky, $pass) = auth_getCookie();
+        if($user && $pass) {
+            // we got a cookie - see if we can trust it
+
+            // get session info
+            $session = $_SESSION[DOKU_COOKIE]['auth'];
+            if(isset($session) &&
+                $auth->useSessionCache($user) &&
+                ($session['time'] >= time() - $conf['auth_security_timeout']) &&
+                ($session['user'] == $user) &&
+                ($session['pass'] == sha1($pass)) && //still crypted
+                ($session['buid'] == auth_browseruid())
+            ) {
+
+                // he has session, cookie and browser right - let him in
+                $INPUT->server->set('REMOTE_USER', $user);
+                $USERINFO               = $session['info']; //FIXME move all references to session
+                return true;
+            }
+            // no we don't trust it yet - recheck pass but silent
+            $secret = auth_cookiesalt(!$sticky, true); //bind non-sticky to session
+            $pass   = auth_decrypt($pass, $secret);
+            return auth_login($user, $pass, $sticky, true);
+        }
+    }
+    //just to be sure
+    auth_logoff(true);
+    return false;
+}
+
+/**
+ * Builds a pseudo UID from browser and IP data
+ *
+ * This is neither unique nor unfakable - still it adds some
+ * security. Using the first part of the IP makes sure
+ * proxy farms like AOLs are still okay.
+ *
+ * @author  Andreas Gohr <andi@splitbrain.org>
+ *
+ * @return  string  a MD5 sum of various browser headers
+ */
+function auth_browseruid() {
+    /* @var Input $INPUT */
+    global $INPUT;
+
+    $ip  = clientIP(true);
+    $uid = '';
+    $uid .= $INPUT->server->str('HTTP_USER_AGENT');
+    $uid .= $INPUT->server->str('HTTP_ACCEPT_CHARSET');
+    $uid .= substr($ip, 0, strpos($ip, '.'));
+    $uid = strtolower($uid);
+    return md5($uid);
+}
+
+/**
+ * Creates a random key to encrypt the password in cookies
+ *
+ * This function tries to read the password for encrypting
+ * cookies from $conf['metadir'].'/_htcookiesalt'
+ * if no such file is found a random key is created and
+ * and stored in this file.
+ *
+ * @author  Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param   bool $addsession if true, the sessionid is added to the salt
+ * @param   bool $secure     if security is more important than keeping the old value
+ * @return  string
+ */
+function auth_cookiesalt($addsession = false, $secure = false) {
+    if (defined('SIMPLE_TEST')) {
+        return 'test';
+    }
+    global $conf;
+    $file = $conf['metadir'].'/_htcookiesalt';
+    if ($secure || !file_exists($file)) {
+        $file = $conf['metadir'].'/_htcookiesalt2';
+    }
+    $salt = io_readFile($file);
+    if(empty($salt)) {
+        $salt = bin2hex(auth_randombytes(64));
+        io_saveFile($file, $salt);
+    }
+    if($addsession) {
+        $salt .= session_id();
+    }
+    return $salt;
+}
+
+/**
+ * Return cryptographically secure random bytes.
+ *
+ * @author Niklas Keller <me@kelunik.com>
+ *
+ * @param int $length number of bytes
+ * @return string cryptographically secure random bytes
+ */
+function auth_randombytes($length) {
+    return random_bytes($length);
+}
+
+/**
+ * Cryptographically secure random number generator.
+ *
+ * @author Niklas Keller <me@kelunik.com>
+ *
+ * @param int $min
+ * @param int $max
+ * @return int
+ */
+function auth_random($min, $max) {
+    return random_int($min, $max);
+}
+
+/**
+ * Encrypt data using the given secret using AES
+ *
+ * The mode is CBC with a random initialization vector, the key is derived
+ * using pbkdf2.
+ *
+ * @param string $data   The data that shall be encrypted
+ * @param string $secret The secret/password that shall be used
+ * @return string The ciphertext
+ */
+function auth_encrypt($data, $secret) {
+    $iv     = auth_randombytes(16);
+    $cipher = new \phpseclib\Crypt\AES();
+    $cipher->setPassword($secret);
+
+    /*
+    this uses the encrypted IV as IV as suggested in
+    http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf, Appendix C
+    for unique but necessarily random IVs. The resulting ciphertext is
+    compatible to ciphertext that was created using a "normal" IV.
+    */
+    return $cipher->encrypt($iv.$data);
+}
+
+/**
+ * Decrypt the given AES ciphertext
+ *
+ * The mode is CBC, the key is derived using pbkdf2
+ *
+ * @param string $ciphertext The encrypted data
+ * @param string $secret     The secret/password that shall be used
+ * @return string The decrypted data
+ */
+function auth_decrypt($ciphertext, $secret) {
+    $iv     = substr($ciphertext, 0, 16);
+    $cipher = new \phpseclib\Crypt\AES();
+    $cipher->setPassword($secret);
+    $cipher->setIV($iv);
+
+    return $cipher->decrypt(substr($ciphertext, 16));
+}
+
+/**
+ * Log out the current user
+ *
+ * This clears all authentication data and thus log the user
+ * off. It also clears session data.
+ *
+ * @author  Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param bool $keepbc - when true, the breadcrumb data is not cleared
+ */
+function auth_logoff($keepbc = false) {
+    global $conf;
+    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();
+
+    if(isset($_SESSION[DOKU_COOKIE]['auth']['user']))
+        unset($_SESSION[DOKU_COOKIE]['auth']['user']);
+    if(isset($_SESSION[DOKU_COOKIE]['auth']['pass']))
+        unset($_SESSION[DOKU_COOKIE]['auth']['pass']);
+    if(isset($_SESSION[DOKU_COOKIE]['auth']['info']))
+        unset($_SESSION[DOKU_COOKIE]['auth']['info']);
+    if(!$keepbc && isset($_SESSION[DOKU_COOKIE]['bc']))
+        unset($_SESSION[DOKU_COOKIE]['bc']);
+    $INPUT->server->remove('REMOTE_USER');
+    $USERINFO = null; //FIXME
+
+    $cookieDir = empty($conf['cookiedir']) ? DOKU_REL : $conf['cookiedir'];
+    setcookie(DOKU_COOKIE, '', time() - 600000, $cookieDir, '', ($conf['securecookie'] && is_ssl()), true);
+
+    if($auth) $auth->logOff();
+}
+
+/**
+ * Check if a user is a manager
+ *
+ * Should usually be called without any parameters to check the current
+ * user.
+ *
+ * The info is available through $INFO['ismanager'], too
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @see    auth_isadmin
+ *
+ * @param  string $user       Username
+ * @param  array  $groups     List of groups the user is in
+ * @param  bool   $adminonly  when true checks if user is admin
+ * @return bool
+ */
+function auth_ismanager($user = null, $groups = null, $adminonly = false) {
+    global $conf;
+    global $USERINFO;
+    /* @var DokuWiki_Auth_Plugin $auth */
+    global $auth;
+    /* @var Input $INPUT */
+    global $INPUT;
+
+
+    if(!$auth) return false;
+    if(is_null($user)) {
+        if(!$INPUT->server->has('REMOTE_USER')) {
+            return false;
+        } else {
+            $user = $INPUT->server->str('REMOTE_USER');
+        }
+    }
+    if(is_null($groups)) {
+        $groups = (array) $USERINFO['grps'];
+    }
+
+    // check superuser match
+    if(auth_isMember($conf['superuser'], $user, $groups)) return true;
+    if($adminonly) return false;
+    // check managers
+    if(auth_isMember($conf['manager'], $user, $groups)) return true;
+
+    return false;
+}
+
+/**
+ * Check if a user is admin
+ *
+ * Alias to auth_ismanager with adminonly=true
+ *
+ * The info is available through $INFO['isadmin'], too
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @see auth_ismanager()
+ *
+ * @param  string $user       Username
+ * @param  array  $groups     List of groups the user is in
+ * @return bool
+ */
+function auth_isadmin($user = null, $groups = null) {
+    return auth_ismanager($user, $groups, true);
+}
+
+/**
+ * Match a user and his groups against a comma separated list of
+ * users and groups to determine membership status
+ *
+ * Note: all input should NOT be nameencoded.
+ *
+ * @param string $memberlist commaseparated list of allowed users and groups
+ * @param string $user       user to match against
+ * @param array  $groups     groups the user is member of
+ * @return bool       true for membership acknowledged
+ */
+function auth_isMember($memberlist, $user, array $groups) {
+    /* @var DokuWiki_Auth_Plugin $auth */
+    global $auth;
+    if(!$auth) return false;
+
+    // clean user and groups
+    if(!$auth->isCaseSensitive()) {
+        $user   = utf8_strtolower($user);
+        $groups = array_map('utf8_strtolower', $groups);
+    }
+    $user   = $auth->cleanUser($user);
+    $groups = array_map(array($auth, 'cleanGroup'), $groups);
+
+    // extract the memberlist
+    $members = explode(',', $memberlist);
+    $members = array_map('trim', $members);
+    $members = array_unique($members);
+    $members = array_filter($members);
+
+    // compare cleaned values
+    foreach($members as $member) {
+        if($member == '@ALL' ) return true;
+        if(!$auth->isCaseSensitive()) $member = utf8_strtolower($member);
+        if($member[0] == '@') {
+            $member = $auth->cleanGroup(substr($member, 1));
+            if(in_array($member, $groups)) return true;
+        } else {
+            $member = $auth->cleanUser($member);
+            if($member == $user) return true;
+        }
+    }
+
+    // still here? not a member!
+    return false;
+}
+
+/**
+ * Convinience function for auth_aclcheck()
+ *
+ * This checks the permissions for the current user
+ *
+ * @author  Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param  string  $id  page ID (needs to be resolved and cleaned)
+ * @return int          permission level
+ */
+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, $INPUT->server->str('REMOTE_USER'), $USERINFO['grps']);
+}
+
+/**
+ * Returns the maximum rights a user has for the given ID or its namespace
+ *
+ * @author  Andreas Gohr <andi@splitbrain.org>
+ *
+ * @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 <andi@splitbrain.org>
+ *
+ * @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 */
+    global $auth;
+
+    // if no ACL is used always return upload rights
+    if(!$conf['useacl']) return AUTH_UPLOAD;
+    if(!$auth) return AUTH_NONE;
+
+    //make sure groups is an array
+    if(!is_array($groups)) $groups = array();
+
+    //if user is superuser or in superusergroup return 255 (acl_admin)
+    if(auth_isadmin($user, $groups)) {
+        return AUTH_ADMIN;
+    }
+
+    if(!$auth->isCaseSensitive()) {
+        $user   = utf8_strtolower($user);
+        $groups = array_map('utf8_strtolower', $groups);
+    }
+    $user   = auth_nameencode($auth->cleanUser($user));
+    $groups = array_map(array($auth, 'cleanGroup'), (array) $groups);
+
+    //prepend groups with @ and nameencode
+    foreach($groups as &$group) {
+        $group = '@'.auth_nameencode($group);
+    }
+
+    $ns   = getNS($id);
+    $perm = -1;
+
+    //add ALL group
+    $groups[] = '@ALL';
+
+    //add User
+    if($user) $groups[] = $user;
+
+    //check exact match first
+    $matches = preg_grep('/^'.preg_quote($id, '/').'[ \t]+([^ \t]+)[ \t]+/', $AUTH_ACL);
+    if(count($matches)) {
+        foreach($matches as $match) {
+            $match = preg_replace('/#.*$/', '', $match); //ignore comments
+            $acl   = preg_split('/[ \t]+/', $match);
+            if(!$auth->isCaseSensitive() && $acl[1] !== '@ALL') {
+                $acl[1] = utf8_strtolower($acl[1]);
+            }
+            if(!in_array($acl[1], $groups)) {
+                continue;
+            }
+            if($acl[2] > AUTH_DELETE) $acl[2] = AUTH_DELETE; //no admins in the ACL!
+            if($acl[2] > $perm) {
+                $perm = $acl[2];
+            }
+        }
+        if($perm > -1) {
+            //we had a match - return it
+            return (int) $perm;
+        }
+    }
+
+    //still here? do the namespace checks
+    if($ns) {
+        $path = $ns.':*';
+    } else {
+        $path = '*'; //root document
+    }
+
+    do {
+        $matches = preg_grep('/^'.preg_quote($path, '/').'[ \t]+([^ \t]+)[ \t]+/', $AUTH_ACL);
+        if(count($matches)) {
+            foreach($matches as $match) {
+                $match = preg_replace('/#.*$/', '', $match); //ignore comments
+                $acl   = preg_split('/[ \t]+/', $match);
+                if(!$auth->isCaseSensitive() && $acl[1] !== '@ALL') {
+                    $acl[1] = utf8_strtolower($acl[1]);
+                }
+                if(!in_array($acl[1], $groups)) {
+                    continue;
+                }
+                if($acl[2] > AUTH_DELETE) $acl[2] = AUTH_DELETE; //no admins in the ACL!
+                if($acl[2] > $perm) {
+                    $perm = $acl[2];
+                }
+            }
+            //we had a match - return it
+            if($perm != -1) {
+                return (int) $perm;
+            }
+        }
+        //get next higher namespace
+        $ns = getNS($ns);
+
+        if($path != '*') {
+            $path = $ns.':*';
+            if($path == ':*') $path = '*';
+        } else {
+            //we did this already
+            //looks like there is something wrong with the ACL
+            //break here
+            msg('No ACL setup yet! Denying access to everyone.');
+            return AUTH_NONE;
+        }
+    } while(1); //this should never loop endless
+    return AUTH_NONE;
+}
+
+/**
+ * Encode ASCII special chars
+ *
+ * Some auth backends allow special chars in their user and groupnames
+ * The special chars are encoded with this function. Only ASCII chars
+ * are encoded UTF-8 multibyte are left as is (different from usual
+ * urlencoding!).
+ *
+ * Decoding can be done with rawurldecode
+ *
+ * @author Andreas Gohr <gohr@cosmocode.de>
+ * @see rawurldecode()
+ *
+ * @param string $name
+ * @param bool $skip_group
+ * @return string
+ */
+function auth_nameencode($name, $skip_group = false) {
+    global $cache_authname;
+    $cache =& $cache_authname;
+    $name  = (string) $name;
+
+    // never encode wildcard FS#1955
+    if($name == '%USER%') return $name;
+    if($name == '%GROUP%') return $name;
+
+    if(!isset($cache[$name][$skip_group])) {
+        if($skip_group && $name{0} == '@') {
+            $cache[$name][$skip_group] = '@'.preg_replace_callback(
+                '/([\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f])/',
+                'auth_nameencode_callback', substr($name, 1)
+            );
+        } else {
+            $cache[$name][$skip_group] = preg_replace_callback(
+                '/([\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f])/',
+                'auth_nameencode_callback', $name
+            );
+        }
+    }
+
+    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)));
+}
+
+/**
+ * Create a pronouncable password
+ *
+ * The $foruser variable might be used by plugins to run additional password
+ * policy checks, but is not used by the default implementation
+ *
+ * @author   Andreas Gohr <andi@splitbrain.org>
+ * @link     http://www.phpbuilder.com/annotate/message.php3?id=1014451
+ * @triggers AUTH_PASSWORD_GENERATE
+ *
+ * @param  string $foruser username for which the password is generated
+ * @return string  pronouncable password
+ */
+function auth_pwgen($foruser = '') {
+    $data = array(
+        'password' => '',
+        'foruser'  => $foruser
+    );
+
+    $evt = new Doku_Event('AUTH_PASSWORD_GENERATE', $data);
+    if($evt->advise_before(true)) {
+        $c = 'bcdfghjklmnprstvwz'; //consonants except hard to speak ones
+        $v = 'aeiou'; //vowels
+        $a = $c.$v; //both
+        $s = '!$%&?+*~#-_:.;,'; // specials
+
+        //use thre syllables...
+        for($i = 0; $i < 3; $i++) {
+            $data['password'] .= $c[auth_random(0, strlen($c) - 1)];
+            $data['password'] .= $v[auth_random(0, strlen($v) - 1)];
+            $data['password'] .= $a[auth_random(0, strlen($a) - 1)];
+        }
+        //... and add a nice number and special
+        $data['password'] .= auth_random(10, 99).$s[auth_random(0, strlen($s) - 1)];
+    }
+    $evt->advise_after();
+
+    return $data['password'];
+}
+
+/**
+ * Sends a password to the given user
+ *
+ * @author  Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param string $user Login name of the user
+ * @param string $password The new password in clear text
+ * @return bool  true on success
+ */
+function auth_sendPassword($user, $password) {
+    global $lang;
+    /* @var DokuWiki_Auth_Plugin $auth */
+    global $auth;
+    if(!$auth) return false;
+
+    $user     = $auth->cleanUser($user);
+    $userinfo = $auth->getUserData($user, $requireGroups = false);
+
+    if(!$userinfo['mail']) return false;
+
+    $text = rawLocale('password');
+    $trep = array(
+        'FULLNAME' => $userinfo['name'],
+        'LOGIN'    => $user,
+        'PASSWORD' => $password
+    );
+
+    $mail = new Mailer();
+    $mail->to($userinfo['name'].' <'.$userinfo['mail'].'>');
+    $mail->subject($lang['regpwmail']);
+    $mail->setBody($text, $trep);
+    return $mail->send();
+}
+
+/**
+ * Register a new user
+ *
+ * This registers a new user - Data is read directly from $_POST
+ *
+ * @author  Andreas Gohr <andi@splitbrain.org>
+ *
+ * @return bool  true on success, false on any error
+ */
+function register() {
+    global $lang;
+    global $conf;
+    /* @var DokuWiki_Auth_Plugin $auth */
+    global $auth;
+    global $INPUT;
+
+    if(!$INPUT->post->bool('save')) return false;
+    if(!actionOK('register')) return false;
+
+    // gather input
+    $login    = trim($auth->cleanUser($INPUT->post->str('login')));
+    $fullname = trim(preg_replace('/[\x00-\x1f:<>&%,;]+/', '', $INPUT->post->str('fullname')));
+    $email    = trim(preg_replace('/[\x00-\x1f:<>&%,;]+/', '', $INPUT->post->str('email')));
+    $pass     = $INPUT->post->str('pass');
+    $passchk  = $INPUT->post->str('passchk');
+
+    if(empty($login) || empty($fullname) || empty($email)) {
+        msg($lang['regmissing'], -1);
+        return false;
+    }
+
+    if($conf['autopasswd']) {
+        $pass = auth_pwgen($login); // automatically generate password
+    } elseif(empty($pass) || empty($passchk)) {
+        msg($lang['regmissing'], -1); // complain about missing passwords
+        return false;
+    } elseif($pass != $passchk) {
+        msg($lang['regbadpass'], -1); // complain about misspelled passwords
+        return false;
+    }
+
+    //check mail
+    if(!mail_isvalid($email)) {
+        msg($lang['regbadmail'], -1);
+        return false;
+    }
+
+    //okay try to create the user
+    if(!$auth->triggerUserMod('create', array($login, $pass, $fullname, $email))) {
+        msg($lang['regfail'], -1);
+        return false;
+    }
+
+    // send notification about the new user
+    $subscription = new Subscription();
+    $subscription->send_register($login, $fullname, $email);
+
+    // are we done?
+    if(!$conf['autopasswd']) {
+        msg($lang['regsuccess2'], 1);
+        return true;
+    }
+
+    // autogenerated password? then send password to user
+    if(auth_sendPassword($login, $pass)) {
+        msg($lang['regsuccess'], 1);
+        return true;
+    } else {
+        msg($lang['regmailfail'], -1);
+        return false;
+    }
+}
+
+/**
+ * Update user profile
+ *
+ * @author    Christopher Smith <chris@jalakai.co.uk>
+ */
+function updateprofile() {
+    global $conf;
+    global $lang;
+    /* @var DokuWiki_Auth_Plugin $auth */
+    global $auth;
+    /* @var Input $INPUT */
+    global $INPUT;
+
+    if(!$INPUT->post->bool('save')) return false;
+    if(!checkSecurityToken()) return false;
+
+    if(!actionOK('profile')) {
+        msg($lang['profna'], -1);
+        return false;
+    }
+
+    $changes         = array();
+    $changes['pass'] = $INPUT->post->str('newpass');
+    $changes['name'] = $INPUT->post->str('fullname');
+    $changes['mail'] = $INPUT->post->str('email');
+
+    // check misspelled passwords
+    if($changes['pass'] != $INPUT->post->str('passchk')) {
+        msg($lang['regbadpass'], -1);
+        return false;
+    }
+
+    // clean fullname and email
+    $changes['name'] = trim(preg_replace('/[\x00-\x1f:<>&%,;]+/', '', $changes['name']));
+    $changes['mail'] = trim(preg_replace('/[\x00-\x1f:<>&%,;]+/', '', $changes['mail']));
+
+    // no empty name and email (except the backend doesn't support them)
+    if((empty($changes['name']) && $auth->canDo('modName')) ||
+        (empty($changes['mail']) && $auth->canDo('modMail'))
+    ) {
+        msg($lang['profnoempty'], -1);
+        return false;
+    }
+    if(!mail_isvalid($changes['mail']) && $auth->canDo('modMail')) {
+        msg($lang['regbadmail'], -1);
+        return false;
+    }
+
+    $changes = array_filter($changes);
+
+    // check for unavailable capabilities
+    if(!$auth->canDo('modName')) unset($changes['name']);
+    if(!$auth->canDo('modMail')) unset($changes['mail']);
+    if(!$auth->canDo('modPass')) unset($changes['pass']);
+
+    // anything to do?
+    if(!count($changes)) {
+        msg($lang['profnochange'], -1);
+        return false;
+    }
+
+    if($conf['profileconfirm']) {
+        if(!$auth->checkPass($INPUT->server->str('REMOTE_USER'), $INPUT->post->str('oldpass'))) {
+            msg($lang['badpassconfirm'], -1);
+            return false;
+        }
+    }
+
+    if(!$auth->triggerUserMod('modify', array($INPUT->server->str('REMOTE_USER'), &$changes))) {
+        msg($lang['proffail'], -1);
+        return false;
+    }
+
+    if($changes['pass']) {
+        // update cookie and session with the changed data
+        list( /*user*/, $sticky, /*pass*/) = auth_getCookie();
+        $pass = auth_encrypt($changes['pass'], auth_cookiesalt(!$sticky, true));
+        auth_setCookie($INPUT->server->str('REMOTE_USER'), $pass, (bool) $sticky);
+    } else {
+        // make sure the session is writable
+        @session_start();
+        // invalidate session cache
+        $_SESSION[DOKU_COOKIE]['auth']['time'] = 0;
+        session_write_close();
+    }
+
+    return true;
+}
+
+/**
+ * Delete the current logged-in user
+ *
+ * @return bool true on success, false on any error
+ */
+function auth_deleteprofile(){
+    global $conf;
+    global $lang;
+    /* @var DokuWiki_Auth_Plugin $auth */
+    global $auth;
+    /* @var Input $INPUT */
+    global $INPUT;
+
+    if(!$INPUT->post->bool('delete')) return false;
+    if(!checkSecurityToken()) return false;
+
+    // action prevented or auth module disallows
+    if(!actionOK('profile_delete') || !$auth->canDo('delUser')) {
+        msg($lang['profnodelete'], -1);
+        return false;
+    }
+
+    if(!$INPUT->post->bool('confirm_delete')){
+        msg($lang['profconfdeletemissing'], -1);
+        return false;
+    }
+
+    if($conf['profileconfirm']) {
+        if(!$auth->checkPass($INPUT->server->str('REMOTE_USER'), $INPUT->post->str('oldpass'))) {
+            msg($lang['badpassconfirm'], -1);
+            return false;
+        }
+    }
+
+    $deleted = array();
+    $deleted[] = $INPUT->server->str('REMOTE_USER');
+    if($auth->triggerUserMod('delete', array($deleted))) {
+        // force and immediate logout including removing the sticky cookie
+        auth_logoff();
+        return true;
+    }
+
+    return false;
+}
+
+/**
+ * Send a  new password
+ *
+ * This function handles both phases of the password reset:
+ *
+ *   - handling the first request of password reset
+ *   - validating the password reset auth token
+ *
+ * @author Benoit Chesneau <benoit@bchesneau.info>
+ * @author Chris Smith <chris@jalakai.co.uk>
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @return bool true on success, false on any error
+ */
+function act_resendpwd() {
+    global $lang;
+    global $conf;
+    /* @var DokuWiki_Auth_Plugin $auth */
+    global $auth;
+    /* @var Input $INPUT */
+    global $INPUT;
+
+    if(!actionOK('resendpwd')) {
+        msg($lang['resendna'], -1);
+        return false;
+    }
+
+    $token = preg_replace('/[^a-f0-9]+/', '', $INPUT->str('pwauth'));
+
+    if($token) {
+        // we're in token phase - get user info from token
+
+        $tfile = $conf['cachedir'].'/'.$token{0}.'/'.$token.'.pwauth';
+        if(!file_exists($tfile)) {
+            msg($lang['resendpwdbadauth'], -1);
+            $INPUT->remove('pwauth');
+            return false;
+        }
+        // token is only valid for 3 days
+        if((time() - filemtime($tfile)) > (3 * 60 * 60 * 24)) {
+            msg($lang['resendpwdbadauth'], -1);
+            $INPUT->remove('pwauth');
+            @unlink($tfile);
+            return false;
+        }
+
+        $user     = io_readfile($tfile);
+        $userinfo = $auth->getUserData($user, $requireGroups = false);
+        if(!$userinfo['mail']) {
+            msg($lang['resendpwdnouser'], -1);
+            return false;
+        }
+
+        if(!$conf['autopasswd']) { // we let the user choose a password
+            $pass = $INPUT->str('pass');
+
+            // password given correctly?
+            if(!$pass) return false;
+            if($pass != $INPUT->str('passchk')) {
+                msg($lang['regbadpass'], -1);
+                return false;
+            }
+
+            // change it
+            if(!$auth->triggerUserMod('modify', array($user, array('pass' => $pass)))) {
+                msg($lang['proffail'], -1);
+                return false;
+            }
+
+        } else { // autogenerate the password and send by mail
+
+            $pass = auth_pwgen($user);
+            if(!$auth->triggerUserMod('modify', array($user, array('pass' => $pass)))) {
+                msg($lang['proffail'], -1);
+                return false;
+            }
+
+            if(auth_sendPassword($user, $pass)) {
+                msg($lang['resendpwdsuccess'], 1);
+            } else {
+                msg($lang['regmailfail'], -1);
+            }
+        }
+
+        @unlink($tfile);
+        return true;
+
+    } else {
+        // we're in request phase
+
+        if(!$INPUT->post->bool('save')) return false;
+
+        if(!$INPUT->post->str('login')) {
+            msg($lang['resendpwdmissing'], -1);
+            return false;
+        } else {
+            $user = trim($auth->cleanUser($INPUT->post->str('login')));
+        }
+
+        $userinfo = $auth->getUserData($user, $requireGroups = false);
+        if(!$userinfo['mail']) {
+            msg($lang['resendpwdnouser'], -1);
+            return false;
+        }
+
+        // generate auth token
+        $token = md5(auth_randombytes(16)); // random secret
+        $tfile = $conf['cachedir'].'/'.$token{0}.'/'.$token.'.pwauth';
+        $url   = wl('', array('do'=> 'resendpwd', 'pwauth'=> $token), true, '&');
+
+        io_saveFile($tfile, $user);
+
+        $text = rawLocale('pwconfirm');
+        $trep = array(
+            'FULLNAME' => $userinfo['name'],
+            'LOGIN'    => $user,
+            'CONFIRM'  => $url
+        );
+
+        $mail = new Mailer();
+        $mail->to($userinfo['name'].' <'.$userinfo['mail'].'>');
+        $mail->subject($lang['regpwmail']);
+        $mail->setBody($text, $trep);
+        if($mail->send()) {
+            msg($lang['resendpwdconfirm'], 1);
+        } else {
+            msg($lang['regmailfail'], -1);
+        }
+        return true;
+    }
+    // never reached
+}
+
+/**
+ * Encrypts a password using the given method and salt
+ *
+ * If the selected method needs a salt and none was given, a random one
+ * is chosen.
+ *
+ * @author  Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param string $clear The clear text password
+ * @param string $method The hashing method
+ * @param string $salt A salt, null for random
+ * @return  string  The crypted password
+ */
+function auth_cryptPassword($clear, $method = '', $salt = null) {
+    global $conf;
+    if(empty($method)) $method = $conf['passcrypt'];
+
+    $pass = new PassHash();
+    $call = 'hash_'.$method;
+
+    if(!method_exists($pass, $call)) {
+        msg("Unsupported crypt method $method", -1);
+        return false;
+    }
+
+    return $pass->$call($clear, $salt);
+}
+
+/**
+ * Verifies a cleartext password against a crypted hash
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param  string $clear The clear text password
+ * @param  string $crypt The hash to compare with
+ * @return bool true if both match
+ */
+function auth_verifyPassword($clear, $crypt) {
+    $pass = new PassHash();
+    return $pass->verify_hash($clear, $crypt);
+}
+
+/**
+ * Set the authentication cookie and add user identification data to the session
+ *
+ * @param string  $user       username
+ * @param string  $pass       encrypted password
+ * @param bool    $sticky     whether or not the cookie will last beyond the session
+ * @return bool
+ */
+function auth_setCookie($user, $pass, $sticky) {
+    global $conf;
+    /* @var DokuWiki_Auth_Plugin $auth */
+    global $auth;
+    global $USERINFO;
+
+    if(!$auth) return false;
+    $USERINFO = $auth->getUserData($user);
+
+    // set cookie
+    $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
+    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);
+    $_SESSION[DOKU_COOKIE]['auth']['buid'] = auth_browseruid();
+    $_SESSION[DOKU_COOKIE]['auth']['info'] = $USERINFO;
+    $_SESSION[DOKU_COOKIE]['auth']['time'] = time();
+
+    return true;
+}
+
+/**
+ * Returns the user, (encrypted) password and sticky bit from cookie
+ *
+ * @returns array
+ */
+function auth_getCookie() {
+    if(!isset($_COOKIE[DOKU_COOKIE])) {
+        return array(null, null, null);
+    }
+    list($user, $sticky, $pass) = explode('|', $_COOKIE[DOKU_COOKIE], 3);
+    $sticky = (bool) $sticky;
+    $pass   = base64_decode($pass);
+    $user   = base64_decode($user);
+    return array($user, $sticky, $pass);
+}
+
+//Setup VIM: ex: et ts=2 :
diff --git a/wiki/inc/cache.php b/wiki/inc/cache.php
new file mode 100644
index 0000000..8589d91
--- /dev/null
+++ b/wiki/inc/cache.php
@@ -0,0 +1,337 @@
+<?php
+/**
+ * Generic class to handle caching
+ *
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author     Chris Smith <chris@jalakai.co.uk>
+ */
+
+if(!defined('DOKU_INC')) die('meh.');
+
+/**
+ * Generic handling of caching
+ */
+class cache {
+    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
+
+    public $_event = '';       // event to be triggered during useCache
+    public $_time;
+    public $_nocache = false;  // if set to true, cache will not be used or stored
+
+    /**
+     * @param string $key primary identifier
+     * @param string $ext file extension
+     */
+    public function __construct($key,$ext) {
+        $this->key = $key;
+        $this->ext = $ext;
+        $this->cache = getCacheName($key,$ext);
+    }
+
+    /**
+     * public method to determine whether the cache can be used
+     *
+     * 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:
+     *                            'age'   => max age of the cache in seconds
+     *                            'files' => cache must be younger than mtime of each file
+     *                                       (nb. dependency passes if file doesn't exist)
+     *
+     * @return bool    true if cache can be used, false otherwise
+     */
+    public function useCache($depends=array()) {
+        $this->depends = $depends;
+        $this->_addDependencies();
+
+        if ($this->_event) {
+            return $this->_stats(trigger_event($this->_event, $this, array($this,'_useCache')));
+        } else {
+            return $this->_stats($this->_useCache());
+        }
+    }
+
+    /**
+     * private method containing cache use decision logic
+     *
+     * this function processes the following keys in the depends array
+     *   purge - force a purge on any non empty value
+     *   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()
+     */
+    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?
+
+        // cache too old?
+        if (!empty($this->depends['age']) && ((time() - $this->_time) > $this->depends['age'])) return false;
+
+        if (!empty($this->depends['files'])) {
+            foreach ($this->depends['files'] as $file) {
+                if ($this->_time <= @filemtime($file)) return false;         // cache older than files it depends on?
+            }
+        }
+
+        return true;
+    }
+
+    /**
+     * add dependencies to the depends array
+     *
+     * this method should only add dependencies,
+     * it should not remove any existing dependencies and
+     * it should only overwrite a dependency when the new value is more stringent than the old
+     */
+    protected function _addDependencies() {
+        global $INPUT;
+        if ($INPUT->has('purge')) $this->depends['purge'] = true;   // purge requested
+    }
+
+    /**
+     * 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) {
+        return io_readFile($this->cache, $clean);
+    }
+
+    /**
+     * cache $data
+     *
+     * @param   string $data   the data to be cached
+     * @return  bool           true on success, false otherwise
+     */
+    public function storeCache($data) {
+        if ($this->_nocache) return false;
+
+        return io_savefile($this->cache, $data);
+    }
+
+    /**
+     * remove any cached data associated with this cache instance
+     */
+    public function removeCache() {
+        @unlink($this->cache);
+    }
+
+    /**
+     * Record cache hits statistics.
+     * (Only when debugging allowed, to reduce overhead.)
+     *
+     * @param    bool   $success   result of this cache use attempt
+     * @return   bool              pass-thru $success value
+     */
+    protected function _stats($success) {
+        global $conf;
+        static $stats = null;
+        static $file;
+
+        if (!$conf['allowdebug']) { return $success; }
+
+        if (is_null($stats)) {
+            $file = $conf['cachedir'].'/cache_stats.txt';
+            $lines = explode("\n",io_readFile($file));
+
+            foreach ($lines as $line) {
+                $i = strpos($line,',');
+                $stats[substr($line,0,$i)] = $line;
+            }
+        }
+
+        if (isset($stats[$this->ext])) {
+            list($ext,$count,$hits) = explode(',',$stats[$this->ext]);
+        } else {
+            $ext = $this->ext;
+            $count = 0;
+            $hits = 0;
+        }
+
+        $count++;
+        if ($success) $hits++;
+        $stats[$this->ext] = "$ext,$count,$hits";
+
+        io_saveFile($file,join("\n",$stats));
+
+        return $success;
+    }
+}
+
+/**
+ * Parser caching
+ */
+class cache_parser extends cache {
+
+    public $file = '';       // source file for cache
+    public $mode = '';       // input mode (represents the processing the input file will undergo)
+    public $page = '';
+
+    public $_event = 'PARSER_CACHE_USE';
+
+    /**
+     *
+     * @param string $id page id
+     * @param string $file source file for cache
+     * @param string $mode input mode
+     */
+    public function __construct($id, $file, $mode) {
+        if ($id) $this->page = $id;
+        $this->file = $file;
+        $this->mode = $mode;
+
+        parent::__construct($file.$_SERVER['HTTP_HOST'].$_SERVER['SERVER_PORT'],'.'.$mode);
+    }
+
+    /**
+     * 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();
+    }
+
+    protected function _addDependencies() {
+
+        // parser cache file dependencies ...
+        $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
+
+        $this->depends['files'] = !empty($this->depends['files']) ? array_merge($files, $this->depends['files']) : $files;
+        parent::_addDependencies();
+    }
+
+}
+
+/**
+ * Caching of data of renderer
+ */
+class cache_renderer extends cache_parser {
+
+    /**
+     * method contains cache use decision logic
+     *
+     * @return bool               see useCache()
+     */
+    public function _useCache() {
+        global $conf;
+
+        if (!parent::_useCache()) return false;
+
+        if (!isset($this->page)) {
+            return true;
+        }
+
+        if ($this->_time < @filemtime(metaFN($this->page,'.meta'))) return false;         // meta cache older than file it depends on?
+
+        // check current link existence is consistent with cache version
+        // first check the purgefile
+        // - if the cache is more recent than the purgefile we know no links can have been updated
+        if ($this->_time >= @filemtime($conf['cachedir'].'/purgefile')) {
+            return true;
+        }
+
+        // for wiki pages, check metadata dependencies
+        $metadata = p_get_metadata($this->page);
+
+        if (!isset($metadata['relation']['references']) ||
+                empty($metadata['relation']['references'])) {
+            return true;
+        }
+
+        foreach ($metadata['relation']['references'] as $id => $exists) {
+            if ($exists != page_exists($id,'',false)) return false;
+        }
+
+        return true;
+    }
+
+    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(
+                DOKU_INC.'inc/parser/'.$this->mode.'.php',       // ... the renderer
+                );
+
+        // page implies metadata and possibly some other dependencies
+        if (isset($this->page)) {
+
+            $valid = p_get_metadata($this->page, 'date valid');         // for xhtml this will render the metadata if needed
+            if (!empty($valid['age'])) {
+                $this->depends['age'] = isset($this->depends['age']) ?
+                    min($this->depends['age'],$valid['age']) : $valid['age'];
+            }
+        }
+
+        $this->depends['files'] = !empty($this->depends['files']) ? array_merge($files, $this->depends['files']) : $files;
+        parent::_addDependencies();
+    }
+}
+
+/**
+ * Caching of parser instructions
+ */
+class cache_instructions extends cache_parser {
+
+    /**
+     * @param string $id page id
+     * @param string $file source file for cache
+     */
+    public function __construct($id, $file) {
+        parent::__construct($id, $file, 'i');
+    }
+
+    /**
+     * retrieve the cached data
+     *
+     * @param   bool   $clean   true to clean line endings, false to leave line endings alone
+     * @return  array          cache contents
+     */
+    public function retrieveCache($clean=true) {
+        $contents = io_readFile($this->cache, false);
+        return !empty($contents) ? unserialize($contents) : array();
+    }
+
+    /**
+     * cache $instructions
+     *
+     * @param   array $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/wiki/inc/changelog.php b/wiki/inc/changelog.php
new file mode 100644
index 0000000..d77b018
--- /dev/null
+++ b/wiki/inc/changelog.php
@@ -0,0 +1,1059 @@
+<?php
+/**
+ * Changelog handling functions
+ *
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author     Andreas Gohr <andi@splitbrain.org>
+ */
+
+// Constants for known core changelog line types.
+// Use these in place of string literals for more readable code.
+define('DOKU_CHANGE_TYPE_CREATE',       'C');
+define('DOKU_CHANGE_TYPE_EDIT',         'E');
+define('DOKU_CHANGE_TYPE_MINOR_EDIT',   'e');
+define('DOKU_CHANGE_TYPE_DELETE',       'D');
+define('DOKU_CHANGE_TYPE_REVERT',       'R');
+
+/**
+ * parses a changelog line into it's components
+ *
+ * @author Ben Coburn <btcoburn@silicodon.net>
+ *
+ * @param string $line changelog line
+ * @return array|bool parsed line or false
+ */
+function parseChangelogLine($line) {
+    $line = rtrim($line, "\n");
+    $tmp = explode("\t", $line);
+    if ($tmp!==false && count($tmp)>1) {
+        $info = array();
+        $info['date']  = (int)$tmp[0]; // unix timestamp
+        $info['ip']    = $tmp[1]; // IPv4 address (127.0.0.1)
+        $info['type']  = $tmp[2]; // log line type
+        $info['id']    = $tmp[3]; // page id
+        $info['user']  = $tmp[4]; // user name
+        $info['sum']   = $tmp[5]; // edit summary (or action reason)
+        $info['extra'] = $tmp[6]; // extra data (varies by line type)
+        if(isset($tmp[7]) && $tmp[7] !== '') { //last item has line-end||
+            $info['sizechange'] = (int) $tmp[7];
+        } else {
+            $info['sizechange'] = null;
+        }
+        return $info;
+    } else {
+        return false;
+    }
+}
+
+/**
+ * Add's an entry to the changelog and saves the metadata for the page
+ *
+ * @param int    $date      Timestamp of the change
+ * @param String $id        Name of the affected page
+ * @param String $type      Type of the change see DOKU_CHANGE_TYPE_*
+ * @param String $summary   Summary of the change
+ * @param mixed  $extra     In case of a revert the revision (timestmp) of the reverted page
+ * @param array  $flags     Additional flags in a key value array.
+ *                             Available flags:
+ *                             - ExternalEdit - mark as an external edit.
+ * @param null|int $sizechange Change of filesize
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @author Esther Brunner <wikidesign@gmail.com>
+ * @author Ben Coburn <btcoburn@silicodon.net>
+ */
+function addLogEntry($date, $id, $type=DOKU_CHANGE_TYPE_EDIT, $summary='', $extra='', $flags=null, $sizechange = null){
+    global $conf, $INFO;
+    /** @var Input $INPUT */
+    global $INPUT;
+
+    // check for special flags as keys
+    if (!is_array($flags)) { $flags = array(); }
+    $flagExternalEdit = isset($flags['ExternalEdit']);
+
+    $id = cleanid($id);
+    $file = wikiFN($id);
+    $created = @filectime($file);
+    $minor = ($type===DOKU_CHANGE_TYPE_MINOR_EDIT);
+    $wasRemoved = ($type===DOKU_CHANGE_TYPE_DELETE);
+
+    if(!$date) $date = time(); //use current time if none supplied
+    $remote = (!$flagExternalEdit)?clientIP(true):'127.0.0.1';
+    $user   = (!$flagExternalEdit)?$INPUT->server->str('REMOTE_USER'):'';
+    if($sizechange === null) {
+        $sizechange = '';
+    } else {
+        $sizechange = (int) $sizechange;
+    }
+
+    $strip = array("\t", "\n");
+    $logline = array(
+        'date'       => $date,
+        'ip'         => $remote,
+        'type'       => str_replace($strip, '', $type),
+        'id'         => $id,
+        'user'       => $user,
+        'sum'        => utf8_substr(str_replace($strip, '', $summary), 0, 255),
+        'extra'      => str_replace($strip, '', $extra),
+        'sizechange' => $sizechange
+    );
+
+    $wasCreated = ($type===DOKU_CHANGE_TYPE_CREATE);
+    $wasReverted = ($type===DOKU_CHANGE_TYPE_REVERT);
+    // update metadata
+    if (!$wasRemoved) {
+        $oldmeta = p_read_metadata($id);
+        $meta    = array();
+        if ($wasCreated && empty($oldmeta['persistent']['date']['created'])){ // newly created
+            $meta['date']['created'] = $created;
+            if ($user){
+                $meta['creator'] = $INFO['userinfo']['name'];
+                $meta['user']    = $user;
+            }
+        } elseif (($wasCreated || $wasReverted) && !empty($oldmeta['persistent']['date']['created'])) { // re-created / restored
+            $meta['date']['created']  = $oldmeta['persistent']['date']['created'];
+            $meta['date']['modified'] = $created; // use the files ctime here
+            $meta['creator'] = $oldmeta['persistent']['creator'];
+            if ($user) $meta['contributor'][$user] = $INFO['userinfo']['name'];
+        } elseif (!$minor) {   // non-minor modification
+            $meta['date']['modified'] = $date;
+            if ($user) $meta['contributor'][$user] = $INFO['userinfo']['name'];
+        }
+        $meta['last_change'] = $logline;
+        p_set_metadata($id, $meta);
+    }
+
+    // add changelog lines
+    $logline = implode("\t", $logline)."\n";
+    io_saveFile(metaFN($id,'.changes'),$logline,true); //page changelog
+    io_saveFile($conf['changelog'],$logline,true); //global changelog cache
+}
+
+/**
+ * Add's an entry to the media changelog
+ *
+ * @author Michael Hamann <michael@content-space.de>
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @author Esther Brunner <wikidesign@gmail.com>
+ * @author Ben Coburn <btcoburn@silicodon.net>
+ *
+ * @param int    $date      Timestamp of the change
+ * @param String $id        Name of the affected page
+ * @param String $type      Type of the change see DOKU_CHANGE_TYPE_*
+ * @param String $summary   Summary of the change
+ * @param mixed  $extra     In case of a revert the revision (timestmp) of the reverted page
+ * @param array  $flags     Additional flags in a key value array.
+ *                             Available flags:
+ *                             - (none, so far)
+ * @param null|int $sizechange Change of filesize
+ */
+function addMediaLogEntry($date, $id, $type=DOKU_CHANGE_TYPE_EDIT, $summary='', $extra='', $flags=null, $sizechange = 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   = $INPUT->server->str('REMOTE_USER');
+    if($sizechange === null) {
+        $sizechange = '';
+    } else {
+        $sizechange = (int) $sizechange;
+    }
+
+    $strip = array("\t", "\n");
+    $logline = array(
+        'date'       => $date,
+        'ip'         => $remote,
+        'type'       => str_replace($strip, '', $type),
+        'id'         => $id,
+        'user'       => $user,
+        'sum'        => utf8_substr(str_replace($strip, '', $summary), 0, 255),
+        'extra'      => str_replace($strip, '', $extra),
+        'sizechange' => $sizechange
+    );
+
+    // add changelog lines
+    $logline = implode("\t", $logline)."\n";
+    io_saveFile($conf['media_changelog'],$logline,true); //global media changelog cache
+    io_saveFile(mediaMetaFN($id,'.changes'),$logline,true); //media file's changelog
+}
+
+/**
+ * returns an array of recently changed files using the
+ * changelog
+ *
+ * The following constants can be used to control which changes are
+ * included. Add them together as needed.
+ *
+ * RECENTS_SKIP_DELETED   - don't include deleted pages
+ * RECENTS_SKIP_MINORS    - don't include minor changes
+ * RECENTS_SKIP_SUBSPACES - don't include subspaces
+ * RECENTS_MEDIA_CHANGES  - return media changes instead of page changes
+ * RECENTS_MEDIA_PAGES_MIXED  - return both media changes and page changes
+ *
+ * @param int    $first   number of first entry returned (for paginating
+ * @param int    $num     return $num entries
+ * @param string $ns      restrict to given namespace
+ * @param int    $flags   see above
+ * @return array recently changed files
+ *
+ * @author Ben Coburn <btcoburn@silicodon.net>
+ * @author Kate Arzamastseva <pshns@ukr.net>
+ */
+function getRecents($first,$num,$ns='',$flags=0){
+    global $conf;
+    $recent = array();
+    $count  = 0;
+
+    if(!$num)
+        return $recent;
+
+    // read all recent changes. (kept short)
+    if ($flags & RECENTS_MEDIA_CHANGES) {
+        $lines = @file($conf['media_changelog']);
+    } else {
+        $lines = @file($conf['changelog']);
+    }
+    $lines_position = count($lines)-1;
+    $media_lines_position = 0;
+    $media_lines = array();
+
+    if ($flags & RECENTS_MEDIA_PAGES_MIXED) {
+        $media_lines = @file($conf['media_changelog']);
+        $media_lines_position = count($media_lines)-1;
+    }
+
+    $seen = array(); // caches seen lines, _handleRecent() skips them
+
+    // handle lines
+    while ($lines_position >= 0 || (($flags & RECENTS_MEDIA_PAGES_MIXED) && $media_lines_position >=0)) {
+        if (empty($rec) && $lines_position >= 0) {
+            $rec = _handleRecent(@$lines[$lines_position], $ns, $flags, $seen);
+            if (!$rec) {
+                $lines_position --;
+                continue;
+            }
+        }
+        if (($flags & RECENTS_MEDIA_PAGES_MIXED) && empty($media_rec) && $media_lines_position >= 0) {
+            $media_rec = _handleRecent(@$media_lines[$media_lines_position], $ns, $flags | RECENTS_MEDIA_CHANGES, $seen);
+            if (!$media_rec) {
+                $media_lines_position --;
+                continue;
+            }
+        }
+        if (($flags & RECENTS_MEDIA_PAGES_MIXED) && @$media_rec['date'] >= @$rec['date']) {
+            $media_lines_position--;
+            $x = $media_rec;
+            $x['media'] = true;
+            $media_rec = false;
+        } else {
+            $lines_position--;
+            $x = $rec;
+            if ($flags & RECENTS_MEDIA_CHANGES) $x['media'] = true;
+            $rec = false;
+        }
+        if(--$first >= 0) continue; // skip first entries
+        $recent[] = $x;
+        $count++;
+        // break when we have enough entries
+        if($count >= $num){ break; }
+    }
+    return $recent;
+}
+
+/**
+ * returns an array of files changed since a given time using the
+ * changelog
+ *
+ * The following constants can be used to control which changes are
+ * included. Add them together as needed.
+ *
+ * RECENTS_SKIP_DELETED   - don't include deleted pages
+ * RECENTS_SKIP_MINORS    - don't include minor changes
+ * RECENTS_SKIP_SUBSPACES - don't include subspaces
+ * RECENTS_MEDIA_CHANGES  - return media changes instead of page changes
+ *
+ * @param int    $from    date of the oldest entry to return
+ * @param int    $to      date of the newest entry to return (for pagination, optional)
+ * @param string $ns      restrict to given namespace (optional)
+ * @param int    $flags   see above (optional)
+ * @return array of files
+ *
+ * @author Michael Hamann <michael@content-space.de>
+ * @author Ben Coburn <btcoburn@silicodon.net>
+ */
+function getRecentsSince($from,$to=null,$ns='',$flags=0){
+    global $conf;
+    $recent = array();
+
+    if($to && $to < $from)
+        return $recent;
+
+    // read all recent changes. (kept short)
+    if ($flags & RECENTS_MEDIA_CHANGES) {
+        $lines = @file($conf['media_changelog']);
+    } else {
+        $lines = @file($conf['changelog']);
+    }
+    if(!$lines) return $recent;
+
+    // we start searching at the end of the list
+    $lines = array_reverse($lines);
+
+    // handle lines
+    $seen = array(); // caches seen lines, _handleRecent() skips them
+
+    foreach($lines as $line){
+        $rec = _handleRecent($line, $ns, $flags, $seen);
+        if($rec !== false) {
+            if ($rec['date'] >= $from) {
+                if (!$to || $rec['date'] <= $to) {
+                    $recent[] = $rec;
+                }
+            } else {
+                break;
+            }
+        }
+    }
+
+    return array_reverse($recent);
+}
+
+/**
+ * Internal function used by getRecents
+ *
+ * don't call directly
+ *
+ * @see getRecents()
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @author Ben Coburn <btcoburn@silicodon.net>
+ *
+ * @param string $line   changelog line
+ * @param string $ns     restrict to given namespace
+ * @param int    $flags  flags to control which changes are included
+ * @param array  $seen   listing of seen pages
+ * @return array|bool    false or array with info about a change
+ */
+function _handleRecent($line,$ns,$flags,&$seen){
+    if(empty($line)) return false;   //skip empty lines
+
+    // split the line into parts
+    $recent = parseChangelogLine($line);
+    if ($recent===false) { return false; }
+
+    // skip seen ones
+    if(isset($seen[$recent['id']])) return false;
+
+    // skip minors
+    if($recent['type']===DOKU_CHANGE_TYPE_MINOR_EDIT && ($flags & RECENTS_SKIP_MINORS)) return false;
+
+    // remember in seen to skip additional sights
+    $seen[$recent['id']] = 1;
+
+    // check if it's a hidden page
+    if(isHiddenPage($recent['id'])) return false;
+
+    // filter namespace
+    if (($ns) && (strpos($recent['id'],$ns.':') !== 0)) return false;
+
+    // exclude subnamespaces
+    if (($flags & RECENTS_SKIP_SUBSPACES) && (getNS($recent['id']) != $ns)) return false;
+
+    // check ACL
+    if ($flags & RECENTS_MEDIA_CHANGES) {
+        $recent['perms'] = auth_quickaclcheck(getNS($recent['id']).':*');
+    } else {
+        $recent['perms'] = auth_quickaclcheck($recent['id']);
+    }
+    if ($recent['perms'] < AUTH_READ) return false;
+
+    // check existance
+    if($flags & RECENTS_SKIP_DELETED){
+        $fn = (($flags & RECENTS_MEDIA_CHANGES) ? mediaFN($recent['id']) : wikiFN($recent['id']));
+        if(!file_exists($fn)) return false;
+    }
+
+    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 <btcoburn@silicodon.net>
+     * @author Kate Arzamastseva <pshns@ukr.net>
+     */
+    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 <btcoburn@silicodon.net>
+     * @author Kate Arzamastseva <pshns@ukr.net>
+     */
+    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|false
+     *     if success returns array(fp, array(changeloglines), $head, $tail, $eof)
+     *     where fp only defined for chuck reading, needs closing.
+     *     otherwise false
+     */
+    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 resource $fp    resource filepointer
+     * @param int      $head  start point chunck
+     * @param int      $tail  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 int      $finger  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());
+    }
+
+    /**
+    * Return an existing revision for a specific date which is
+    * the current one or younger or equal then the date
+    *
+    * @param number $date_at timestamp
+    * @return string revision ('' for current)
+    */
+    function getLastRevisionAt($date_at){
+        //requested date_at(timestamp) younger or equal then modified_time($this->id) => load current
+        if(file_exists($this->getFilename()) && $date_at >= @filemtime($this->getFilename())) {
+            return '';
+        } else if ($rev = $this->getRelativeRevision($date_at+1, -1)) { //+1 to get also the requested date revision
+            return $rev;
+        } else {
+            return false;
+        }
+    }
+
+    /**
+     * 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);
+    }
+}
diff --git a/wiki/inc/cli.php b/wiki/inc/cli.php
new file mode 100644
index 0000000..cb4fc58
--- /dev/null
+++ b/wiki/inc/cli.php
@@ -0,0 +1,655 @@
+<?php
+
+/**
+ * Class DokuCLI
+ *
+ * All DokuWiki commandline scripts should inherit from this class and implement the abstract methods.
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+abstract class DokuCLI {
+    /** @var string the executed script itself */
+    protected $bin;
+    /** @var  DokuCLI_Options the option parser */
+    protected $options;
+    /** @var  DokuCLI_Colors */
+    public $colors;
+
+    /**
+     * constructor
+     *
+     * Initialize the arguments, set up helper classes and set up the CLI environment
+     */
+    public function __construct() {
+        set_exception_handler(array($this, 'fatal'));
+
+        $this->options = new DokuCLI_Options();
+        $this->colors  = new DokuCLI_Colors();
+
+        dbg_deprecated('use \splitbrain\phpcli\CLI instead');
+        $this->error('DokuCLI is deprecated, use \splitbrain\phpcli\CLI instead.');
+    }
+
+    /**
+     * Register options and arguments on the given $options object
+     *
+     * @param DokuCLI_Options $options
+     * @return void
+     */
+    abstract protected function setup(DokuCLI_Options $options);
+
+    /**
+     * Your main program
+     *
+     * Arguments and options have been parsed when this is run
+     *
+     * @param DokuCLI_Options $options
+     * @return void
+     */
+    abstract protected function main(DokuCLI_Options $options);
+
+    /**
+     * Execute the CLI program
+     *
+     * Executes the setup() routine, adds default options, initiate the options parsing and argument checking
+     * and finally executes main()
+     */
+    public function run() {
+        if('cli' != php_sapi_name()) throw new DokuCLI_Exception('This has to be run from the command line');
+
+        // setup
+        $this->setup($this->options);
+        $this->options->registerOption(
+            'no-colors',
+            'Do not use any colors in output. Useful when piping output to other tools or files.'
+        );
+        $this->options->registerOption(
+            'help',
+            'Display this help screen and exit immediately.',
+            'h'
+        );
+
+        // parse
+        $this->options->parseOptions();
+
+        // handle defaults
+        if($this->options->getOpt('no-colors')) {
+            $this->colors->disable();
+        }
+        if($this->options->getOpt('help')) {
+            echo $this->options->help();
+            exit(0);
+        }
+
+        // check arguments
+        $this->options->checkArguments();
+
+        // execute
+        $this->main($this->options);
+
+        exit(0);
+    }
+
+    /**
+     * Exits the program on a fatal error
+     *
+     * @param Exception|string $error either an exception or an error message
+     */
+    public function fatal($error) {
+        $code = 0;
+        if(is_object($error) && is_a($error, 'Exception')) {
+            /** @var Exception $error */
+            $code  = $error->getCode();
+            $error = $error->getMessage();
+        }
+        if(!$code) $code = DokuCLI_Exception::E_ANY;
+
+        $this->error($error);
+        exit($code);
+    }
+
+    /**
+     * Print an error message
+     *
+     * @param string $string
+     */
+    public function error($string) {
+        $this->colors->ptln("E: $string", 'red', STDERR);
+    }
+
+    /**
+     * Print a success message
+     *
+     * @param string $string
+     */
+    public function success($string) {
+        $this->colors->ptln("S: $string", 'green', STDERR);
+    }
+
+    /**
+     * Print an info message
+     *
+     * @param string $string
+     */
+    public function info($string) {
+        $this->colors->ptln("I: $string", 'cyan', STDERR);
+    }
+
+}
+
+/**
+ * Class DokuCLI_Colors
+ *
+ * Handles color output on (Linux) terminals
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+class DokuCLI_Colors {
+    /** @var array known color names */
+    protected $colors = array(
+        'reset'       => "\33[0m",
+        'black'       => "\33[0;30m",
+        'darkgray'    => "\33[1;30m",
+        'blue'        => "\33[0;34m",
+        'lightblue'   => "\33[1;34m",
+        'green'       => "\33[0;32m",
+        'lightgreen'  => "\33[1;32m",
+        'cyan'        => "\33[0;36m",
+        'lightcyan'   => "\33[1;36m",
+        'red'         => "\33[0;31m",
+        'lightred'    => "\33[1;31m",
+        'purple'      => "\33[0;35m",
+        'lightpurple' => "\33[1;35m",
+        'brown'       => "\33[0;33m",
+        'yellow'      => "\33[1;33m",
+        'lightgray'   => "\33[0;37m",
+        'white'       => "\33[1;37m",
+    );
+
+    /** @var bool should colors be used? */
+    protected $enabled = true;
+
+    /**
+     * Constructor
+     *
+     * Tries to disable colors for non-terminals
+     */
+    public function __construct() {
+        if(function_exists('posix_isatty') && !posix_isatty(STDOUT)) {
+            $this->enabled = false;
+            return;
+        }
+        if(!getenv('TERM')) {
+            $this->enabled = false;
+            return;
+        }
+    }
+
+    /**
+     * enable color output
+     */
+    public function enable() {
+        $this->enabled = true;
+    }
+
+    /**
+     * disable color output
+     */
+    public function disable() {
+        $this->enabled = false;
+    }
+
+    /**
+     * Convenience function to print a line in a given color
+     *
+     * @param string   $line
+     * @param string   $color
+     * @param resource $channel
+     */
+    public function ptln($line, $color, $channel = STDOUT) {
+        $this->set($color);
+        fwrite($channel, rtrim($line)."\n");
+        $this->reset();
+    }
+
+    /**
+     * Set the given color for consecutive output
+     *
+     * @param string $color one of the supported color names
+     * @throws DokuCLI_Exception
+     */
+    public function set($color) {
+        if(!$this->enabled) return;
+        if(!isset($this->colors[$color])) throw new DokuCLI_Exception("No such color $color");
+        echo $this->colors[$color];
+    }
+
+    /**
+     * reset the terminal color
+     */
+    public function reset() {
+        $this->set('reset');
+    }
+}
+
+/**
+ * Class DokuCLI_Options
+ *
+ * Parses command line options passed to the CLI script. Allows CLI scripts to easily register all accepted options and
+ * commands and even generates a help text from this setup.
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+class DokuCLI_Options {
+    /** @var  array keeps the list of options to parse */
+    protected $setup;
+
+    /** @var  array store parsed options */
+    protected $options = array();
+
+    /** @var string current parsed command if any */
+    protected $command = '';
+
+    /** @var  array passed non-option arguments */
+    public $args = array();
+
+    /** @var  string the executed script */
+    protected $bin;
+
+    /**
+     * Constructor
+     */
+    public function __construct() {
+        $this->setup = array(
+            '' => array(
+                'opts' => array(),
+                'args' => array(),
+                'help' => ''
+            )
+        ); // default command
+
+        $this->args = $this->readPHPArgv();
+        $this->bin  = basename(array_shift($this->args));
+
+        $this->options = array();
+    }
+
+    /**
+     * Sets the help text for the tool itself
+     *
+     * @param string $help
+     */
+    public function setHelp($help) {
+        $this->setup['']['help'] = $help;
+    }
+
+    /**
+     * Register the names of arguments for help generation and number checking
+     *
+     * This has to be called in the order arguments are expected
+     *
+     * @param string $arg      argument name (just for help)
+     * @param string $help     help text
+     * @param bool   $required is this a required argument
+     * @param string $command  if theses apply to a sub command only
+     * @throws DokuCLI_Exception
+     */
+    public function registerArgument($arg, $help, $required = true, $command = '') {
+        if(!isset($this->setup[$command])) throw new DokuCLI_Exception("Command $command not registered");
+
+        $this->setup[$command]['args'][] = array(
+            'name'     => $arg,
+            'help'     => $help,
+            'required' => $required
+        );
+    }
+
+    /**
+     * This registers a sub command
+     *
+     * Sub commands have their own options and use their own function (not main()).
+     *
+     * @param string $command
+     * @param string $help
+     * @throws DokuCLI_Exception
+     */
+    public function registerCommand($command, $help) {
+        if(isset($this->setup[$command])) throw new DokuCLI_Exception("Command $command already registered");
+
+        $this->setup[$command] = array(
+            'opts' => array(),
+            'args' => array(),
+            'help' => $help
+        );
+
+    }
+
+    /**
+     * Register an option for option parsing and help generation
+     *
+     * @param string      $long     multi character option (specified with --)
+     * @param string      $help     help text for this option
+     * @param string|null $short    one character option (specified with -)
+     * @param bool|string $needsarg does this option require an argument? give it a name here
+     * @param string      $command  what command does this option apply to
+     * @throws DokuCLI_Exception
+     */
+    public function registerOption($long, $help, $short = null, $needsarg = false, $command = '') {
+        if(!isset($this->setup[$command])) throw new DokuCLI_Exception("Command $command not registered");
+
+        $this->setup[$command]['opts'][$long] = array(
+            'needsarg' => $needsarg,
+            'help'     => $help,
+            'short'    => $short
+        );
+
+        if($short) {
+            if(strlen($short) > 1) throw new DokuCLI_Exception("Short options should be exactly one ASCII character");
+
+            $this->setup[$command]['short'][$short] = $long;
+        }
+    }
+
+    /**
+     * Checks the actual number of arguments against the required number
+     *
+     * Throws an exception if arguments are missing. Called from parseOptions()
+     *
+     * @throws DokuCLI_Exception
+     */
+    public function checkArguments() {
+        $argc = count($this->args);
+
+        $req = 0;
+        foreach($this->setup[$this->command]['args'] as $arg) {
+            if(!$arg['required']) break; // last required arguments seen
+            $req++;
+        }
+
+        if($req > $argc) throw new DokuCLI_Exception("Not enough arguments", DokuCLI_Exception::E_OPT_ARG_REQUIRED);
+    }
+
+    /**
+     * Parses the given arguments for known options and command
+     *
+     * The given $args array should NOT contain the executed file as first item anymore! The $args
+     * array is stripped from any options and possible command. All found otions can be accessed via the
+     * getOpt() function
+     *
+     * Note that command options will overwrite any global options with the same name
+     *
+     * @throws DokuCLI_Exception
+     */
+    public function parseOptions() {
+        $non_opts = array();
+
+        $argc = count($this->args);
+        for($i = 0; $i < $argc; $i++) {
+            $arg = $this->args[$i];
+
+            // The special element '--' means explicit end of options. Treat the rest of the arguments as non-options
+            // and end the loop.
+            if($arg == '--') {
+                $non_opts = array_merge($non_opts, array_slice($this->args, $i + 1));
+                break;
+            }
+
+            // '-' is stdin - a normal argument
+            if($arg == '-') {
+                $non_opts = array_merge($non_opts, array_slice($this->args, $i));
+                break;
+            }
+
+            // first non-option
+            if($arg{0} != '-') {
+                $non_opts = array_merge($non_opts, array_slice($this->args, $i));
+                break;
+            }
+
+            // long option
+            if(strlen($arg) > 1 && $arg{1} == '-') {
+                list($opt, $val) = explode('=', substr($arg, 2), 2);
+
+                if(!isset($this->setup[$this->command]['opts'][$opt])) {
+                    throw new DokuCLI_Exception("No such option $arg", DokuCLI_Exception::E_UNKNOWN_OPT);
+                }
+
+                // argument required?
+                if($this->setup[$this->command]['opts'][$opt]['needsarg']) {
+                    if(is_null($val) && $i + 1 < $argc && !preg_match('/^--?[\w]/', $this->args[$i + 1])) {
+                        $val = $this->args[++$i];
+                    }
+                    if(is_null($val)) {
+                        throw new DokuCLI_Exception("Option $arg requires an argument", DokuCLI_Exception::E_OPT_ARG_REQUIRED);
+                    }
+                    $this->options[$opt] = $val;
+                } else {
+                    $this->options[$opt] = true;
+                }
+
+                continue;
+            }
+
+            // short option
+            $opt = substr($arg, 1);
+            if(!isset($this->setup[$this->command]['short'][$opt])) {
+                throw new DokuCLI_Exception("No such option $arg", DokuCLI_Exception::E_UNKNOWN_OPT);
+            } else {
+                $opt = $this->setup[$this->command]['short'][$opt]; // store it under long name
+            }
+
+            // argument required?
+            if($this->setup[$this->command]['opts'][$opt]['needsarg']) {
+                $val = null;
+                if($i + 1 < $argc && !preg_match('/^--?[\w]/', $this->args[$i + 1])) {
+                    $val = $this->args[++$i];
+                }
+                if(is_null($val)) {
+                    throw new DokuCLI_Exception("Option $arg requires an argument", DokuCLI_Exception::E_OPT_ARG_REQUIRED);
+                }
+                $this->options[$opt] = $val;
+            } else {
+                $this->options[$opt] = true;
+            }
+        }
+
+        // parsing is now done, update args array
+        $this->args = $non_opts;
+
+        // if not done yet, check if first argument is a command and reexecute argument parsing if it is
+        if(!$this->command && $this->args && isset($this->setup[$this->args[0]])) {
+            // it is a command!
+            $this->command = array_shift($this->args);
+            $this->parseOptions(); // second pass
+        }
+    }
+
+    /**
+     * Get the value of the given option
+     *
+     * Please note that all options are accessed by their long option names regardless of how they were
+     * specified on commandline.
+     *
+     * Can only be used after parseOptions() has been run
+     *
+     * @param string $option
+     * @param bool|string $default what to return if the option was not set
+     * @return bool|string
+     */
+    public function getOpt($option, $default = false) {
+        if(isset($this->options[$option])) return $this->options[$option];
+        return $default;
+    }
+
+    /**
+     * Return the found command if any
+     *
+     * @return string
+     */
+    public function getCmd() {
+        return $this->command;
+    }
+
+    /**
+     * Builds a help screen from the available options. You may want to call it from -h or on error
+     *
+     * @return string
+     */
+    public function help() {
+        $text = '';
+
+        $hascommands = (count($this->setup) > 1);
+        foreach($this->setup as $command => $config) {
+            $hasopts = (bool) $this->setup[$command]['opts'];
+            $hasargs = (bool) $this->setup[$command]['args'];
+
+            if(!$command) {
+                $text .= 'USAGE: '.$this->bin;
+            } else {
+                $text .= "\n$command";
+            }
+
+            if($hasopts) $text .= ' <OPTIONS>';
+
+            foreach($this->setup[$command]['args'] as $arg) {
+                if($arg['required']) {
+                    $text .= ' <'.$arg['name'].'>';
+                } else {
+                    $text .= ' [<'.$arg['name'].'>]';
+                }
+            }
+            $text .= "\n";
+
+            if($this->setup[$command]['help']) {
+                $text .= "\n";
+                $text .= $this->tableFormat(
+                    array(2, 72),
+                    array('', $this->setup[$command]['help']."\n")
+                );
+            }
+
+            if($hasopts) {
+                $text .= "\n  OPTIONS\n\n";
+                foreach($this->setup[$command]['opts'] as $long => $opt) {
+
+                    $name = '';
+                    if($opt['short']) {
+                        $name .= '-'.$opt['short'];
+                        if($opt['needsarg']) $name .= ' <'.$opt['needsarg'].'>';
+                        $name .= ', ';
+                    }
+                    $name .= "--$long";
+                    if($opt['needsarg']) $name .= ' <'.$opt['needsarg'].'>';
+
+                    $text .= $this->tableFormat(
+                        array(2, 20, 52),
+                        array('', $name, $opt['help'])
+                    );
+                    $text .= "\n";
+                }
+            }
+
+            if($hasargs) {
+                $text .= "\n";
+                foreach($this->setup[$command]['args'] as $arg) {
+                    $name = '<'.$arg['name'].'>';
+
+                    $text .= $this->tableFormat(
+                        array(2, 20, 52),
+                        array('', $name, $arg['help'])
+                    );
+                }
+            }
+
+            if($command == '' && $hascommands) {
+                $text .= "\nThis tool accepts a command as first parameter as outlined below:\n";
+            }
+        }
+
+        return $text;
+    }
+
+    /**
+     * Safely read the $argv PHP array across different PHP configurations.
+     * Will take care on register_globals and register_argc_argv ini directives
+     *
+     * @throws DokuCLI_Exception
+     * @return array the $argv PHP array or PEAR error if not registered
+     */
+    private function readPHPArgv() {
+        global $argv;
+        if(!is_array($argv)) {
+            if(!@is_array($_SERVER['argv'])) {
+                if(!@is_array($GLOBALS['HTTP_SERVER_VARS']['argv'])) {
+                    throw new DokuCLI_Exception(
+                        "Could not read cmd args (register_argc_argv=Off?)",
+                        DOKU_CLI_OPTS_ARG_READ
+                    );
+                }
+                return $GLOBALS['HTTP_SERVER_VARS']['argv'];
+            }
+            return $_SERVER['argv'];
+        }
+        return $argv;
+    }
+
+    /**
+     * Displays text in multiple word wrapped columns
+     *
+     * @param int[]    $widths list of column widths (in characters)
+     * @param string[] $texts  list of texts for each column
+     * @return string
+     */
+    private function tableFormat($widths, $texts) {
+        $wrapped = array();
+        $maxlen  = 0;
+
+        foreach($widths as $col => $width) {
+            $wrapped[$col] = explode("\n", wordwrap($texts[$col], $width - 1, "\n", true)); // -1 char border
+            $len           = count($wrapped[$col]);
+            if($len > $maxlen) $maxlen = $len;
+
+        }
+
+        $out = '';
+        for($i = 0; $i < $maxlen; $i++) {
+            foreach($widths as $col => $width) {
+                if(isset($wrapped[$col][$i])) {
+                    $val = $wrapped[$col][$i];
+                } else {
+                    $val = '';
+                }
+                $out .= sprintf('%-'.$width.'s', $val);
+            }
+            $out .= "\n";
+        }
+        return $out;
+    }
+}
+
+/**
+ * Class DokuCLI_Exception
+ *
+ * The code is used as exit code for the CLI tool. This should probably be extended. Many cases just fall back to the
+ * E_ANY code.
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+class DokuCLI_Exception extends Exception {
+    const E_ANY = -1; // no error code specified
+    const E_UNKNOWN_OPT = 1; //Unrecognized option
+    const E_OPT_ARG_REQUIRED = 2; //Option requires argument
+    const E_OPT_ARG_DENIED = 3; //Option not allowed argument
+    const E_OPT_ABIGUOUS = 4; //Option abiguous
+    const E_ARG_READ = 5; //Could not read argv
+
+    /**
+     * @param string    $message     The Exception message to throw.
+     * @param int       $code        The Exception code
+     * @param Exception $previous    The previous exception used for the exception chaining.
+     */
+    public function __construct($message = "", $code = 0, Exception $previous = null) {
+        if(!$code) $code = DokuCLI_Exception::E_ANY;
+        parent::__construct($message, $code, $previous);
+    }
+}
diff --git a/wiki/inc/common.php b/wiki/inc/common.php
new file mode 100644
index 0000000..1fd0154
--- /dev/null
+++ b/wiki/inc/common.php
@@ -0,0 +1,2087 @@
+<?php
+/**
+ * Common DokuWiki functions
+ *
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author     Andreas Gohr <andi@splitbrain.org>
+ */
+
+if(!defined('DOKU_INC')) die('meh.');
+
+/**
+ * These constants are used with the recents function
+ */
+define('RECENTS_SKIP_DELETED', 2);
+define('RECENTS_SKIP_MINORS', 4);
+define('RECENTS_SKIP_SUBSPACES', 8);
+define('RECENTS_MEDIA_CHANGES', 16);
+define('RECENTS_MEDIA_PAGES_MIXED', 32);
+
+/**
+ * Wrapper around htmlspecialchars()
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @see    htmlspecialchars()
+ *
+ * @param string $string the string being converted
+ * @return string converted string
+ */
+function hsc($string) {
+    return htmlspecialchars($string, ENT_QUOTES, 'UTF-8');
+}
+
+/**
+ * Checks if the given input is blank
+ *
+ * This is similar to empty() but will return false for "0".
+ *
+ * Please note: when you pass uninitialized variables, they will implicitly be created
+ * with a NULL value without warning.
+ *
+ * To avoid this it's recommended to guard the call with isset like this:
+ *
+ * (isset($foo) && !blank($foo))
+ * (!isset($foo) || blank($foo))
+ *
+ * @param $in
+ * @param bool $trim Consider a string of whitespace to be blank
+ * @return bool
+ */
+function blank(&$in, $trim = false) {
+    if(is_null($in)) return true;
+    if(is_array($in)) return empty($in);
+    if($in === "\0") return true;
+    if($trim && trim($in) === '') return true;
+    if(strlen($in) > 0) return false;
+    return empty($in);
+}
+
+/**
+ * print a newline terminated string
+ *
+ * You can give an indention as optional parameter
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param string $string  line of text
+ * @param int    $indent  number of spaces indention
+ */
+function ptln($string, $indent = 0) {
+    echo str_repeat(' ', $indent)."$string\n";
+}
+
+/**
+ * strips control characters (<32) from the given string
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param string $string being stripped
+ * @return string
+ */
+function stripctl($string) {
+    return preg_replace('/[\x00-\x1F]+/s', '', $string);
+}
+
+/**
+ * Return a secret token to be used for CSRF attack prevention
+ *
+ * @author  Andreas Gohr <andi@splitbrain.org>
+ * @link    http://en.wikipedia.org/wiki/Cross-site_request_forgery
+ * @link    http://christ1an.blogspot.com/2007/04/preventing-csrf-efficiently.html
+ *
+ * @return  string
+ */
+function getSecurityToken() {
+    /** @var Input $INPUT */
+    global $INPUT;
+
+    $user = $INPUT->server->str('REMOTE_USER');
+    $session = session_id();
+
+    // CSRF checks are only for logged in users - do not generate for anonymous
+    if(trim($user) == '' || trim($session) == '') return '';
+    return PassHash::hmac('md5', $session.$user, auth_cookiesalt());
+}
+
+/**
+ * Check the secret CSRF token
+ *
+ * @param null|string $token security token or null to read it from request variable
+ * @return bool success if the token matched
+ */
+function checkSecurityToken($token = null) {
+    /** @var Input $INPUT */
+    global $INPUT;
+    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) {
+        msg('Security Token did not match. Possible CSRF attack.', -1);
+        return false;
+    }
+    return true;
+}
+
+/**
+ * Print a hidden form field with a secret CSRF token
+ *
+ * @author  Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param bool $print  if true print the field, otherwise html of the field is returned
+ * @return string html of hidden form field
+ */
+function formSecurityToken($print = true) {
+    $ret = '<div class="no"><input type="hidden" name="sectok" value="'.getSecurityToken().'" /></div>'."\n";
+    if($print) echo $ret;
+    return $ret;
+}
+
+/**
+ * Determine basic information for a request of $id
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @author Chris Smith <chris@jalakai.co.uk>
+ *
+ * @param string $id         pageid
+ * @param bool   $htmlClient add info about whether is mobile browser
+ * @return array with info for a request of $id
+ *
+ */
+function basicinfo($id, $htmlClient=true){
+    global $USERINFO;
+    /* @var Input $INPUT */
+    global $INPUT;
+
+    // set info about manager/admin status.
+    $info = array();
+    $info['isadmin']   = false;
+    $info['ismanager'] = false;
+    if($INPUT->server->has('REMOTE_USER')) {
+        $info['userinfo']   = $USERINFO;
+        $info['perm']       = auth_quickaclcheck($id);
+        $info['client']     = $INPUT->server->str('REMOTE_USER');
+
+        if($info['perm'] == AUTH_ADMIN) {
+            $info['isadmin']   = true;
+            $info['ismanager'] = true;
+        } elseif(auth_ismanager()) {
+            $info['ismanager'] = true;
+        }
+
+        // if some outside auth were used only REMOTE_USER is set
+        if(!$info['userinfo']['name']) {
+            $info['userinfo']['name'] = $INPUT->server->str('REMOTE_USER');
+        }
+
+    } else {
+        $info['perm']       = auth_aclcheck($id, '', null);
+        $info['client']     = clientIP(true);
+    }
+
+    $info['namespace'] = getNS($id);
+
+    // mobile detection
+    if ($htmlClient) {
+        $info['ismobile'] = clientismobile();
+    }
+
+    return $info;
+ }
+
+/**
+ * Return info about the current document as associative
+ * array.
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @return array with info about current document
+ */
+function pageinfo() {
+    global $ID;
+    global $REV;
+    global $RANGE;
+    global $lang;
+    /* @var Input $INPUT */
+    global $INPUT;
+
+    $info = basicinfo($ID);
+
+    // include ID & REV not redundant, as some parts of DokuWiki may temporarily change $ID, e.g. p_wiki_xhtml
+    // FIXME ... perhaps it would be better to ensure the temporary changes weren't necessary
+    $info['id']  = $ID;
+    $info['rev'] = $REV;
+
+    if($INPUT->server->has('REMOTE_USER')) {
+        $sub = new Subscription();
+        $info['subscribed'] = $sub->user_subscription();
+    } else {
+        $info['subscribed'] = false;
+    }
+
+    $info['locked']     = checklock($ID);
+    $info['filepath']   = wikiFN($ID);
+    $info['exists']     = file_exists($info['filepath']);
+    $info['currentrev'] = @filemtime($info['filepath']);
+    if($REV) {
+        //check if current revision was meant
+        if($info['exists'] && ($info['currentrev'] == $REV)) {
+            $REV = '';
+        } elseif($RANGE) {
+            //section editing does not work with old revisions!
+            $REV   = '';
+            $RANGE = '';
+            msg($lang['nosecedit'], 0);
+        } else {
+            //really use old revision
+            $info['filepath'] = wikiFN($ID, $REV);
+            $info['exists']   = file_exists($info['filepath']);
+        }
+    }
+    $info['rev'] = $REV;
+    if($info['exists']) {
+        $info['writable'] = (is_writable($info['filepath']) &&
+            ($info['perm'] >= AUTH_EDIT));
+    } else {
+        $info['writable'] = ($info['perm'] >= AUTH_CREATE);
+    }
+    $info['editable'] = ($info['writable'] && empty($info['locked']));
+    $info['lastmod']  = @filemtime($info['filepath']);
+
+    //load page meta data
+    $info['meta'] = p_get_metadata($ID);
+
+    //who's the editor
+    $pagelog = new PageChangeLog($ID, 1024);
+    if($REV) {
+        $revinfo = $pagelog->getRevisionInfo($REV);
+    } else {
+        if(!empty($info['meta']['last_change']) && is_array($info['meta']['last_change'])) {
+            $revinfo = $info['meta']['last_change'];
+        } else {
+            $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;
+                p_set_metadata($ID, array('last_change' => $revinfo));
+            }
+        }
+    }
+    //and check for an external edit
+    if($revinfo !== false && $revinfo['date'] != $info['lastmod']) {
+        // cached changelog line no longer valid
+        $revinfo                     = false;
+        $info['meta']['last_change'] = $revinfo;
+        p_set_metadata($ID, array('last_change' => $revinfo));
+    }
+
+    $info['ip']   = $revinfo['ip'];
+    $info['user'] = $revinfo['user'];
+    $info['sum']  = $revinfo['sum'];
+    // See also $INFO['meta']['last_change'] which is the most recent log line for page $ID.
+    // Use $INFO['meta']['last_change']['type']===DOKU_CHANGE_TYPE_MINOR_EDIT in place of $info['minor'].
+
+    if($revinfo['user']) {
+        $info['editor'] = $revinfo['user'];
+    } else {
+        $info['editor'] = $revinfo['ip'];
+    }
+
+    // draft
+    $draft = getCacheName($info['client'].$ID, '.draft');
+    if(file_exists($draft)) {
+        if(@filemtime($draft) < @filemtime(wikiFN($ID))) {
+            // remove stale draft
+            @unlink($draft);
+        } else {
+            $info['draft'] = $draft;
+        }
+    }
+
+    return $info;
+}
+
+/**
+ * Initialize and/or fill global $JSINFO with some basic info to be given to javascript
+ */
+function jsinfo() {
+    global $JSINFO, $ID, $INFO, $ACT;
+
+    if (!is_array($JSINFO)) {
+        $JSINFO = [];
+    }
+    //export minimal info to JS, plugins can add more
+    $JSINFO['id']                    = $ID;
+    $JSINFO['namespace']             = (string) $INFO['namespace'];
+    $JSINFO['ACT']                   = act_clean($ACT);
+    $JSINFO['useHeadingNavigation']  = (int) useHeading('navigation');
+    $JSINFO['useHeadingContent']     = (int) useHeading('content');
+}
+
+/**
+ * Return information about the current media item as an associative array.
+ *
+ * @return array with info about current media item
+ */
+function mediainfo(){
+    global $NS;
+    global $IMG;
+
+    $info = basicinfo("$NS:*");
+    $info['image'] = $IMG;
+
+    return $info;
+}
+
+/**
+ * Build an string of URL parameters
+ *
+ * @author Andreas Gohr
+ *
+ * @param array  $params    array with key-value pairs
+ * @param string $sep       series of pairs are separated by this character
+ * @return string query string
+ */
+function buildURLparams($params, $sep = '&amp;') {
+    $url = '';
+    $amp = false;
+    foreach($params as $key => $val) {
+        if($amp) $url .= $sep;
+
+        $url .= rawurlencode($key).'=';
+        $url .= rawurlencode((string) $val);
+        $amp = true;
+    }
+    return $url;
+}
+
+/**
+ * Build an string of html tag attributes
+ *
+ * Skips keys starting with '_', values get HTML encoded
+ *
+ * @author Andreas Gohr
+ *
+ * @param array $params    array with (attribute name-attribute value) pairs
+ * @param bool  $skipempty skip empty string values?
+ * @return string
+ */
+function buildAttributes($params, $skipempty = false) {
+    $url   = '';
+    $white = false;
+    foreach($params as $key => $val) {
+        if($key{0} == '_') continue;
+        if($val === '' && $skipempty) continue;
+        if($white) $url .= ' ';
+
+        $url .= $key.'="';
+        $url .= htmlspecialchars($val);
+        $url .= '"';
+        $white = true;
+    }
+    return $url;
+}
+
+/**
+ * This builds the breadcrumb trail and returns it as array
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @return string[] with the data: array(pageid=>name, ... )
+ */
+function breadcrumbs() {
+    // we prepare the breadcrumbs early for quick session closing
+    static $crumbs = null;
+    if($crumbs != null) return $crumbs;
+
+    global $ID;
+    global $ACT;
+    global $conf;
+
+    //first visit?
+    $crumbs = isset($_SESSION[DOKU_COOKIE]['bc']) ? $_SESSION[DOKU_COOKIE]['bc'] : array();
+    //we only save on show and existing visible wiki documents
+    $file = wikiFN($ID);
+    if($ACT != 'show' || isHiddenPage($ID) || !file_exists($file)) {
+        $_SESSION[DOKU_COOKIE]['bc'] = $crumbs;
+        return $crumbs;
+    }
+
+    // page names
+    $name = noNSorNS($ID);
+    if(useHeading('navigation')) {
+        // get page title
+        $title = p_get_first_heading($ID, METADATA_RENDER_USING_SIMPLE_CACHE);
+        if($title) {
+            $name = $title;
+        }
+    }
+
+    //remove ID from array
+    if(isset($crumbs[$ID])) {
+        unset($crumbs[$ID]);
+    }
+
+    //add to array
+    $crumbs[$ID] = $name;
+    //reduce size
+    while(count($crumbs) > $conf['breadcrumbs']) {
+        array_shift($crumbs);
+    }
+    //save to session
+    $_SESSION[DOKU_COOKIE]['bc'] = $crumbs;
+    return $crumbs;
+}
+
+/**
+ * Filter for page IDs
+ *
+ * This is run on a ID before it is outputted somewhere
+ * currently used to replace the colon with something else
+ * on Windows (non-IIS) systems and to have proper URL encoding
+ *
+ * See discussions at https://github.com/splitbrain/dokuwiki/pull/84 and
+ * https://github.com/splitbrain/dokuwiki/pull/173 why we use a whitelist of
+ * unaffected servers instead of blacklisting affected servers here.
+ *
+ * Urlencoding is ommitted when the second parameter is false
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param string $id pageid being filtered
+ * @param bool   $ue apply urlencoding?
+ * @return string
+ */
+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($INPUT->server->str('SERVER_SOFTWARE'), 'Microsoft-IIS') === false
+    ) {
+        $id = strtr($id, ':', ';');
+    }
+    if($ue) {
+        $id = rawurlencode($id);
+        $id = str_replace('%3A', ':', $id); //keep as colon
+        $id = str_replace('%3B', ';', $id); //keep as semicolon
+        $id = str_replace('%2F', '/', $id); //keep as slash
+    }
+    return $id;
+}
+
+/**
+ * This builds a link to a wikipage
+ *
+ * It handles URL rewriting and adds additional parameters
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param string       $id             page id, defaults to start page
+ * @param string|array $urlParameters  URL parameters, associative array recommended
+ * @param bool         $absolute       request an absolute URL instead of relative
+ * @param string       $separator      parameter separator
+ * @return string
+ */
+function wl($id = '', $urlParameters = '', $absolute = false, $separator = '&amp;') {
+    global $conf;
+    if(is_array($urlParameters)) {
+        if(isset($urlParameters['rev']) && !$urlParameters['rev']) unset($urlParameters['rev']);
+        if(isset($urlParameters['at']) && $conf['date_at_format']) $urlParameters['at'] = date($conf['date_at_format'],$urlParameters['at']);
+        $urlParameters = buildURLparams($urlParameters, $separator);
+    } else {
+        $urlParameters = str_replace(',', $separator, $urlParameters);
+    }
+    if($id === '') {
+        $id = $conf['start'];
+    }
+    $id = idfilter($id);
+    if($absolute) {
+        $xlink = DOKU_URL;
+    } else {
+        $xlink = DOKU_BASE;
+    }
+
+    if($conf['userewrite'] == 2) {
+        $xlink .= DOKU_SCRIPT.'/'.$id;
+        if($urlParameters) $xlink .= '?'.$urlParameters;
+    } elseif($conf['userewrite']) {
+        $xlink .= $id;
+        if($urlParameters) $xlink .= '?'.$urlParameters;
+    } elseif($id) {
+        $xlink .= DOKU_SCRIPT.'?id='.$id;
+        if($urlParameters) $xlink .= $separator.$urlParameters;
+    } else {
+        $xlink .= DOKU_SCRIPT;
+        if($urlParameters) $xlink .= '?'.$urlParameters;
+    }
+
+    return $xlink;
+}
+
+/**
+ * This builds a link to an alternate page format
+ *
+ * Handles URL rewriting if enabled. Follows the style of wl().
+ *
+ * @author Ben Coburn <btcoburn@silicodon.net>
+ * @param string       $id             page id, defaults to start page
+ * @param string       $format         the export renderer to use
+ * @param string|array $urlParameters  URL parameters, associative array recommended
+ * @param bool         $abs            request an absolute URL instead of relative
+ * @param string       $sep            parameter separator
+ * @return string
+ */
+function exportlink($id = '', $format = 'raw', $urlParameters = '', $abs = false, $sep = '&amp;') {
+    global $conf;
+    if(is_array($urlParameters)) {
+        $urlParameters = buildURLparams($urlParameters, $sep);
+    } else {
+        $urlParameters = str_replace(',', $sep, $urlParameters);
+    }
+
+    $format = rawurlencode($format);
+    $id     = idfilter($id);
+    if($abs) {
+        $xlink = DOKU_URL;
+    } else {
+        $xlink = DOKU_BASE;
+    }
+
+    if($conf['userewrite'] == 2) {
+        $xlink .= DOKU_SCRIPT.'/'.$id.'?do=export_'.$format;
+        if($urlParameters) $xlink .= $sep.$urlParameters;
+    } elseif($conf['userewrite'] == 1) {
+        $xlink .= '_export/'.$format.'/'.$id;
+        if($urlParameters) $xlink .= '?'.$urlParameters;
+    } else {
+        $xlink .= DOKU_SCRIPT.'?do=export_'.$format.$sep.'id='.$id;
+        if($urlParameters) $xlink .= $sep.$urlParameters;
+    }
+
+    return $xlink;
+}
+
+/**
+ * Build a link to a media file
+ *
+ * Will return a link to the detail page if $direct is false
+ *
+ * The $more parameter should always be given as array, the function then
+ * will strip default parameters to produce even cleaner URLs
+ *
+ * @param string  $id     the media file id or URL
+ * @param mixed   $more   string or array with additional parameters
+ * @param bool    $direct link to detail page if false
+ * @param string  $sep    URL parameter separator
+ * @param bool    $abs    Create an absolute URL
+ * @return string
+ */
+function ml($id = '', $more = '', $direct = true, $sep = '&amp;', $abs = false) {
+    global $conf;
+    $isexternalimage = media_isexternal($id);
+    if(!$isexternalimage) {
+        $id = cleanID($id);
+    }
+
+    if(is_array($more)) {
+        // add token for resized images
+        if(!empty($more['w']) || !empty($more['h']) || $isexternalimage){
+            $more['tok'] = media_get_token($id,$more['w'],$more['h']);
+        }
+        // strip defaults for shorter URLs
+        if(isset($more['cache']) && $more['cache'] == 'cache') unset($more['cache']);
+        if(empty($more['w'])) unset($more['w']);
+        if(empty($more['h'])) unset($more['h']);
+        if(isset($more['id']) && $direct) unset($more['id']);
+        if(isset($more['rev']) && !$more['rev']) unset($more['rev']);
+        $more = buildURLparams($more, $sep);
+    } else {
+        $matches = array();
+        if (preg_match_all('/\b(w|h)=(\d*)\b/',$more,$matches,PREG_SET_ORDER) || $isexternalimage){
+            $resize = array('w'=>0, 'h'=>0);
+            foreach ($matches as $match){
+                $resize[$match[1]] = $match[2];
+            }
+            $more .= $more === '' ? '' : $sep;
+            $more .= 'tok='.media_get_token($id,$resize['w'],$resize['h']);
+        }
+        $more = str_replace('cache=cache', '', $more); //skip default
+        $more = str_replace(',,', ',', $more);
+        $more = str_replace(',', $sep, $more);
+    }
+
+    if($abs) {
+        $xlink = DOKU_URL;
+    } else {
+        $xlink = DOKU_BASE;
+    }
+
+    // external URLs are always direct without rewriting
+    if($isexternalimage) {
+        $xlink .= 'lib/exe/fetch.php';
+        $xlink .= '?'.$more;
+        $xlink .= $sep.'media='.rawurlencode($id);
+        return $xlink;
+    }
+
+    $id = idfilter($id);
+
+    // decide on scriptname
+    if($direct) {
+        if($conf['userewrite'] == 1) {
+            $script = '_media';
+        } else {
+            $script = 'lib/exe/fetch.php';
+        }
+    } else {
+        if($conf['userewrite'] == 1) {
+            $script = '_detail';
+        } else {
+            $script = 'lib/exe/detail.php';
+        }
+    }
+
+    // build URL based on rewrite mode
+    if($conf['userewrite']) {
+        $xlink .= $script.'/'.$id;
+        if($more) $xlink .= '?'.$more;
+    } else {
+        if($more) {
+            $xlink .= $script.'?'.$more;
+            $xlink .= $sep.'media='.$id;
+        } else {
+            $xlink .= $script.'?media='.$id;
+        }
+    }
+
+    return $xlink;
+}
+
+/**
+ * Returns the URL to the DokuWiki base script
+ *
+ * Consider using wl() instead, unless you absoutely need the doku.php endpoint
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @return string
+ */
+function script() {
+    return DOKU_BASE.DOKU_SCRIPT;
+}
+
+/**
+ * Spamcheck against wordlist
+ *
+ * Checks the wikitext against a list of blocked expressions
+ * returns true if the text contains any bad words
+ *
+ * Triggers COMMON_WORDBLOCK_BLOCKED
+ *
+ *  Action Plugins can use this event to inspect the blocked data
+ *  and gain information about the user who was blocked.
+ *
+ *  Event data:
+ *    data['matches']  - array of matches
+ *    data['userinfo'] - information about the blocked user
+ *      [ip]           - ip address
+ *      [user]         - username (if logged in)
+ *      [mail]         - mail address (if logged in)
+ *      [name]         - real name (if logged in)
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @author Michael Klier <chi@chimeric.de>
+ *
+ * @param  string $text - optional text to check, if not given the globals are used
+ * @return bool         - true if a spam word was found
+ */
+function checkwordblock($text = '') {
+    global $TEXT;
+    global $PRE;
+    global $SUF;
+    global $SUM;
+    global $conf;
+    global $INFO;
+    /* @var Input $INPUT */
+    global $INPUT;
+
+    if(!$conf['usewordblock']) return false;
+
+    if(!$text) $text = "$PRE $TEXT $SUF $SUM";
+
+    // we prepare the text a tiny bit to prevent spammers circumventing URL checks
+    $text = preg_replace('!(\b)(www\.[\w.:?\-;,]+?\.[\w.:?\-;,]+?[\w/\#~:.?+=&%@\!\-.:?\-;,]+?)([.:?\-;,]*[^\w/\#~:.?+=&%@\!\-.:?\-;,])!i', '\1http://\2 \2\3', $text);
+
+    $wordblocks = getWordblocks();
+    // how many lines to read at once (to work around some PCRE limits)
+    if(version_compare(phpversion(), '4.3.0', '<')) {
+        // old versions of PCRE define a maximum of parenthesises even if no
+        // backreferences are used - the maximum is 99
+        // this is very bad performancewise and may even be too high still
+        $chunksize = 40;
+    } else {
+        // read file in chunks of 200 - this should work around the
+        // MAX_PATTERN_SIZE in modern PCRE
+        $chunksize = 200;
+    }
+    while($blocks = array_splice($wordblocks, 0, $chunksize)) {
+        $re = array();
+        // build regexp from blocks
+        foreach($blocks as $block) {
+            $block = preg_replace('/#.*$/', '', $block);
+            $block = trim($block);
+            if(empty($block)) continue;
+            $re[] = $block;
+        }
+        if(count($re) && preg_match('#('.join('|', $re).')#si', $text, $matches)) {
+            // prepare event data
+            $data = array();
+            $data['matches']        = $matches;
+            $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'];
+            }
+            $callback = function () {
+                return true;
+            };
+            return trigger_event('COMMON_WORDBLOCK_BLOCKED', $data, $callback, true);
+        }
+    }
+    return false;
+}
+
+/**
+ * Return the IP of the client
+ *
+ * Honours X-Forwarded-For and X-Real-IP Proxy Headers
+ *
+ * It returns a comma separated list of IPs if the above mentioned
+ * headers are set. If the single parameter is set, it tries to return
+ * a routable public address, prefering the ones suplied in the X
+ * headers
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param  boolean $single If set only a single IP is returned
+ * @return string
+ */
+function clientIP($single = false) {
+    /* @var Input $INPUT */
+    global $INPUT;
+
+    $ip   = array();
+    $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
+    $dec_octet   = '(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|[0-9])';
+    $hex_digit   = '[A-Fa-f0-9]';
+    $h16         = "{$hex_digit}{1,4}";
+    $IPv4Address = "$dec_octet\\.$dec_octet\\.$dec_octet\\.$dec_octet";
+    $ls32        = "(?:$h16:$h16|$IPv4Address)";
+    $IPv6Address =
+        "(?:(?:{$IPv4Address})|(?:".
+            "(?:$h16:){6}$ls32".
+            "|::(?:$h16:){5}$ls32".
+            "|(?:$h16)?::(?:$h16:){4}$ls32".
+            "|(?:(?:$h16:){0,1}$h16)?::(?:$h16:){3}$ls32".
+            "|(?:(?:$h16:){0,2}$h16)?::(?:$h16:){2}$ls32".
+            "|(?:(?:$h16:){0,3}$h16)?::(?:$h16:){1}$ls32".
+            "|(?:(?:$h16:){0,4}$h16)?::$ls32".
+            "|(?:(?:$h16:){0,5}$h16)?::$h16".
+            "|(?:(?:$h16:){0,6}$h16)?::".
+            ")(?:\\/(?:12[0-8]|1[0-1][0-9]|[1-9][0-9]|[0-9]))?)";
+
+    // remove any non-IP stuff
+    $cnt   = count($ip);
+    $match = array();
+    for($i = 0; $i < $cnt; $i++) {
+        if(preg_match("/^$IPv4Address$/", $ip[$i], $match) || preg_match("/^$IPv6Address$/", $ip[$i], $match)) {
+            $ip[$i] = $match[0];
+        } else {
+            $ip[$i] = '';
+        }
+        if(empty($ip[$i])) unset($ip[$i]);
+    }
+    $ip = array_values(array_unique($ip));
+    if(!$ip[0]) $ip[0] = '0.0.0.0'; // for some strange reason we don't have a IP
+
+    if(!$single) return join(',', $ip);
+
+    // decide which IP to use, trying to avoid local addresses
+    $ip = array_reverse($ip);
+    foreach($ip as $i) {
+        if(preg_match('/^(::1|[fF][eE]80:|127\.|10\.|192\.168\.|172\.((1[6-9])|(2[0-9])|(3[0-1]))\.)/', $i)) {
+            continue;
+        } else {
+            return $i;
+        }
+    }
+    // still here? just use the first (last) address
+    return $ip[0];
+}
+
+/**
+ * Check if the browser is on a mobile device
+ *
+ * Adapted from the example code at url below
+ *
+ * @link http://www.brainhandles.com/2007/10/15/detecting-mobile-browsers/#code
+ *
+ * @return bool if true, client is mobile browser; otherwise false
+ */
+function clientismobile() {
+    /* @var Input $INPUT */
+    global $INPUT;
+
+    if($INPUT->server->has('HTTP_X_WAP_PROFILE')) return true;
+
+    if(preg_match('/wap\.|\.wap/i', $INPUT->server->str('HTTP_ACCEPT'))) return true;
+
+    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", $INPUT->server->str('HTTP_USER_AGENT'))) return true;
+
+    return false;
+}
+
+/**
+ * check if a given link is interwiki link
+ *
+ * @param string $link the link, e.g. "wiki>page"
+ * @return bool
+ */
+function link_isinterwiki($link){
+    if (preg_match('/^[a-zA-Z0-9\.]+>/u',$link)) return true;
+    return false;
+}
+
+/**
+ * Convert one or more comma separated IPs to hostnames
+ *
+ * If $conf['dnslookups'] is disabled it simply returns the input string
+ *
+ * @author Glen Harris <astfgl@iamnota.org>
+ *
+ * @param  string $ips comma separated list of IP addresses
+ * @return string a comma separated list of hostnames
+ */
+function gethostsbyaddrs($ips) {
+    global $conf;
+    if(!$conf['dnslookups']) return $ips;
+
+    $hosts = array();
+    $ips   = explode(',', $ips);
+
+    if(is_array($ips)) {
+        foreach($ips as $ip) {
+            $hosts[] = gethostbyaddr(trim($ip));
+        }
+        return join(',', $hosts);
+    } else {
+        return gethostbyaddr(trim($ips));
+    }
+}
+
+/**
+ * Checks if a given page is currently locked.
+ *
+ * removes stale lockfiles
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param string $id page id
+ * @return bool page is locked?
+ */
+function checklock($id) {
+    global $conf;
+    /* @var Input $INPUT */
+    global $INPUT;
+
+    $lock = wikiLockFN($id);
+
+    //no lockfile
+    if(!file_exists($lock)) return false;
+
+    //lockfile expired
+    if((time() - filemtime($lock)) > $conf['locktime']) {
+        @unlink($lock);
+        return false;
+    }
+
+    //my own lock
+    @list($ip, $session) = explode("\n", io_readFile($lock));
+    if($ip == $INPUT->server->str('REMOTE_USER') || $ip == clientIP() || (session_id() && $session == session_id())) {
+        return false;
+    }
+
+    return $ip;
+}
+
+/**
+ * Lock a page for editing
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param string $id page id to lock
+ */
+function lock($id) {
+    global $conf;
+    /* @var Input $INPUT */
+    global $INPUT;
+
+    if($conf['locktime'] == 0) {
+        return;
+    }
+
+    $lock = wikiLockFN($id);
+    if($INPUT->server->str('REMOTE_USER')) {
+        io_saveFile($lock, $INPUT->server->str('REMOTE_USER'));
+    } else {
+        io_saveFile($lock, clientIP()."\n".session_id());
+    }
+}
+
+/**
+ * Unlock a page if it was locked by the user
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param string $id page id to unlock
+ * @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 == $INPUT->server->str('REMOTE_USER') || $ip == clientIP() || $session == session_id()) {
+            @unlink($lock);
+            return true;
+        }
+    }
+    return false;
+}
+
+/**
+ * convert line ending to unix format
+ *
+ * also makes sure the given text is valid UTF-8
+ *
+ * @see    formText() for 2crlf conversion
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param string $text
+ * @return string
+ */
+function cleanText($text) {
+    $text = preg_replace("/(\015\012)|(\015)/", "\012", $text);
+
+    // if the text is not valid UTF-8 we simply assume latin1
+    // this won't break any worse than it breaks with the wrong encoding
+    // but might actually fix the problem in many cases
+    if(!utf8_check($text)) $text = utf8_encode($text);
+
+    return $text;
+}
+
+/**
+ * Prepares text for print in Webforms by encoding special chars.
+ * It also converts line endings to Windows format which is
+ * pseudo standard for webforms.
+ *
+ * @see    cleanText() for 2unix conversion
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param string $text
+ * @return string
+ */
+function formText($text) {
+    $text = str_replace("\012", "\015\012", $text);
+    return htmlspecialchars($text);
+}
+
+/**
+ * Returns the specified local text in raw format
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param string $id   page id
+ * @param string $ext  extension of file being read, default 'txt'
+ * @return string
+ */
+function rawLocale($id, $ext = 'txt') {
+    return io_readFile(localeFN($id, $ext));
+}
+
+/**
+ * Returns the raw WikiText
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param string $id   page id
+ * @param string|int $rev  timestamp when a revision of wikitext is desired
+ * @return string
+ */
+function rawWiki($id, $rev = '') {
+    return io_readWikiPage(wikiFN($id, $rev), $id, $rev);
+}
+
+/**
+ * Returns the pagetemplate contents for the ID's namespace
+ *
+ * @triggers COMMON_PAGETPL_LOAD
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param string $id the id of the page to be created
+ * @return string parsed pagetemplate content
+ */
+function pageTemplate($id) {
+    global $conf;
+
+    if(is_array($id)) $id = $id[0];
+
+    // prepare initial event data
+    $data = array(
+        'id'        => $id, // the id of the page to be created
+        'tpl'       => '', // the text used as template
+        'tplfile'   => '', // the file above text was/should be loaded from
+        'doreplace' => true // should wildcard replacements be done on the text?
+    );
+
+    $evt = new Doku_Event('COMMON_PAGETPL_LOAD', $data);
+    if($evt->advise_before(true)) {
+        // the before event might have loaded the content already
+        if(empty($data['tpl'])) {
+            // if the before event did not set a template file, try to find one
+            if(empty($data['tplfile'])) {
+                $path = dirname(wikiFN($id));
+                if(file_exists($path.'/_template.txt')) {
+                    $data['tplfile'] = $path.'/_template.txt';
+                } else {
+                    // search upper namespaces for templates
+                    $len = strlen(rtrim($conf['datadir'], '/'));
+                    while(strlen($path) >= $len) {
+                        if(file_exists($path.'/__template.txt')) {
+                            $data['tplfile'] = $path.'/__template.txt';
+                            break;
+                        }
+                        $path = substr($path, 0, strrpos($path, '/'));
+                    }
+                }
+            }
+            // load the content
+            $data['tpl'] = io_readFile($data['tplfile']);
+        }
+        if($data['doreplace']) parsePageTemplate($data);
+    }
+    $evt->advise_after();
+    unset($evt);
+
+    return $data['tpl'];
+}
+
+/**
+ * Performs common page template replacements
+ * This works on data from COMMON_PAGETPL_LOAD
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param array $data array with event data
+ * @return string
+ */
+function parsePageTemplate(&$data) {
+    /**
+     * @var string $id        the id of the page to be created
+     * @var string $tpl       the text used as template
+     * @var string $tplfile   the file above text was/should be loaded from
+     * @var bool   $doreplace should wildcard replacements be done on the text?
+     */
+    extract($data);
+
+    global $USERINFO;
+    global $conf;
+    /* @var Input $INPUT */
+    global $INPUT;
+
+    // replace placeholders
+    $file = noNS($id);
+    $page = strtr($file, $conf['sepchar'], ' ');
+
+    $tpl = str_replace(
+        array(
+             '@ID@',
+             '@NS@',
+             '@CURNS@',
+             '@FILE@',
+             '@!FILE@',
+             '@!FILE!@',
+             '@PAGE@',
+             '@!PAGE@',
+             '@!!PAGE@',
+             '@!PAGE!@',
+             '@USER@',
+             '@NAME@',
+             '@MAIL@',
+             '@DATE@',
+        ),
+        array(
+             $id,
+             getNS($id),
+             curNS($id),
+             $file,
+             utf8_ucfirst($file),
+             utf8_strtoupper($file),
+             $page,
+             utf8_ucfirst($page),
+             utf8_ucwords($page),
+             utf8_strtoupper($page),
+             $INPUT->server->str('REMOTE_USER'),
+             $USERINFO['name'],
+             $USERINFO['mail'],
+             $conf['dformat'],
+        ), $tpl
+    );
+
+    // we need the callback to work around strftime's char limit
+    $tpl = preg_replace_callback(
+        '/%./',
+        function ($m) {
+            return strftime($m[0]);
+        },
+        $tpl
+    );
+    $data['tpl'] = $tpl;
+    return $tpl;
+}
+
+/**
+ * Returns the raw Wiki Text in three slices.
+ *
+ * The range parameter needs to have the form "from-to"
+ * and gives the range of the section in bytes - no
+ * UTF-8 awareness is needed.
+ * The returned order is prefix, section and suffix.
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param string $range in form "from-to"
+ * @param string $id    page id
+ * @param string $rev   optional, the revision timestamp
+ * @return string[] with three slices
+ */
+function rawWikiSlices($range, $id, $rev = '') {
+    $text = io_readWikiPage(wikiFN($id, $rev), $id, $rev);
+
+    // Parse range
+    list($from, $to) = explode('-', $range, 2);
+    // Make range zero-based, use defaults if marker is missing
+    $from = !$from ? 0 : ($from - 1);
+    $to   = !$to ? strlen($text) : ($to - 1);
+
+    $slices = array();
+    $slices[0] = substr($text, 0, $from);
+    $slices[1] = substr($text, $from, $to - $from);
+    $slices[2] = substr($text, $to);
+    return $slices;
+}
+
+/**
+ * Joins wiki text slices
+ *
+ * function to join the text slices.
+ * When the pretty parameter is set to true it adds additional empty
+ * lines between sections if needed (used on saving).
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param string $pre   prefix
+ * @param string $text  text in the middle
+ * @param string $suf   suffix
+ * @param bool $pretty add additional empty lines between sections
+ * @return string
+ */
+function con($pre, $text, $suf, $pretty = false) {
+    if($pretty) {
+        if($pre !== '' && substr($pre, -1) !== "\n" &&
+            substr($text, 0, 1) !== "\n"
+        ) {
+            $pre .= "\n";
+        }
+        if($suf !== '' && substr($text, -1) !== "\n" &&
+            substr($suf, 0, 1) !== "\n"
+        ) {
+            $text .= "\n";
+        }
+    }
+
+    return $pre.$text.$suf;
+}
+
+/**
+ * Checks if the current page version is newer than the last entry in the page's
+ * changelog. If so, we assume it has been an external edit and we create an
+ * attic copy and add a proper changelog line.
+ *
+ * This check is only executed when the page is about to be saved again from the
+ * wiki, triggered in @see saveWikiText()
+ *
+ * @param string $id the page ID
+ */
+function detectExternalEdit($id) {
+    global $lang;
+
+    $fileLastMod = wikiFN($id);
+    $lastMod     = @filemtime($fileLastMod); // from page
+    $pagelog     = new PageChangeLog($id, 1024);
+    $lastRev     = $pagelog->getRevisions(-1, 1); // from changelog
+    $lastRev     = (int) (empty($lastRev) ? 0 : $lastRev[0]);
+
+    if(!file_exists(wikiFN($id, $lastMod)) && file_exists($fileLastMod) && $lastMod >= $lastRev) {
+        // add old revision to the attic if missing
+        saveOldRevision($id);
+        // add a changelog entry if this edit came from outside dokuwiki
+        if($lastMod > $lastRev) {
+            $fileLastRev = wikiFN($id, $lastRev);
+            $revinfo = $pagelog->getRevisionInfo($lastRev);
+            if(empty($lastRev) || !file_exists($fileLastRev) || $revinfo['type'] == DOKU_CHANGE_TYPE_DELETE) {
+                $filesize_old = 0;
+            } else {
+                $filesize_old = io_getSizeFile($fileLastRev);
+            }
+            $filesize_new = filesize($fileLastMod);
+            $sizechange = $filesize_new - $filesize_old;
+
+            addLogEntry($lastMod, $id, DOKU_CHANGE_TYPE_EDIT, $lang['external_edit'], '', array('ExternalEdit'=> true), $sizechange);
+            // remove soon to be stale instructions
+            $cache = new cache_instructions($id, $fileLastMod);
+            $cache->removeCache();
+        }
+    }
+}
+
+/**
+ * Saves a wikitext by calling io_writeWikiPage.
+ * Also directs changelog and attic updates.
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @author Ben Coburn <btcoburn@silicodon.net>
+ *
+ * @param string $id       page id
+ * @param string $text     wikitext being saved
+ * @param string $summary  summary of text update
+ * @param bool   $minor    mark this saved version as minor update
+ */
+function saveWikiText($id, $text, $summary, $minor = false) {
+    /* Note to developers:
+       This code is subtle and delicate. Test the behavior of
+       the attic and changelog with dokuwiki and external edits
+       after any changes. External edits change the wiki page
+       directly without using php or dokuwiki.
+     */
+    global $conf;
+    global $lang;
+    global $REV;
+    /* @var Input $INPUT */
+    global $INPUT;
+
+    // prepare data for event
+    $svdta = array();
+    $svdta['id']             = $id;
+    $svdta['file']           = wikiFN($id);
+    $svdta['revertFrom']     = $REV;
+    $svdta['oldRevision']    = @filemtime($svdta['file']);
+    $svdta['newRevision']    = 0;
+    $svdta['newContent']     = $text;
+    $svdta['oldContent']     = rawWiki($id);
+    $svdta['summary']        = $summary;
+    $svdta['contentChanged'] = ($svdta['newContent'] != $svdta['oldContent']);
+    $svdta['changeInfo']     = '';
+    $svdta['changeType']     = DOKU_CHANGE_TYPE_EDIT;
+    $svdta['sizechange']     = null;
+
+    // select changelog line type
+    if($REV) {
+        $svdta['changeType']  = DOKU_CHANGE_TYPE_REVERT;
+        $svdta['changeInfo'] = $REV;
+    } else if(!file_exists($svdta['file'])) {
+        $svdta['changeType'] = DOKU_CHANGE_TYPE_CREATE;
+    } else if(trim($text) == '') {
+        // empty or whitespace only content deletes
+        $svdta['changeType'] = DOKU_CHANGE_TYPE_DELETE;
+        // autoset summary on deletion
+        if(blank($svdta['summary'])) {
+            $svdta['summary'] = $lang['deleted'];
+        }
+    } else if($minor && $conf['useacl'] && $INPUT->server->str('REMOTE_USER')) {
+        //minor edits only for logged in users
+        $svdta['changeType'] = DOKU_CHANGE_TYPE_MINOR_EDIT;
+    }
+
+    $event = new Doku_Event('COMMON_WIKIPAGE_SAVE', $svdta);
+    if(!$event->advise_before()) return;
+
+    // if the content has not been changed, no save happens (plugins may override this)
+    if(!$svdta['contentChanged']) return;
+
+    detectExternalEdit($id);
+
+    if(
+        $svdta['changeType'] == DOKU_CHANGE_TYPE_CREATE ||
+        ($svdta['changeType'] == DOKU_CHANGE_TYPE_REVERT && !file_exists($svdta['file']))
+    ) {
+        $filesize_old = 0;
+    } else {
+        $filesize_old = filesize($svdta['file']);
+    }
+    if($svdta['changeType'] == DOKU_CHANGE_TYPE_DELETE) {
+        // Send "update" event with empty data, so plugins can react to page deletion
+        $data = array(array($svdta['file'], '', false), getNS($id), noNS($id), false);
+        trigger_event('IO_WIKIPAGE_WRITE', $data);
+        // pre-save deleted revision
+        @touch($svdta['file']);
+        clearstatcache();
+        $svdta['newRevision'] = saveOldRevision($id);
+        // remove empty file
+        @unlink($svdta['file']);
+        $filesize_new = 0;
+        // don't remove old meta info as it should be saved, plugins can use IO_WIKIPAGE_WRITE for removing their metadata...
+        // purge non-persistant meta data
+        p_purge_metadata($id);
+        // remove empty namespaces
+        io_sweepNS($id, 'datadir');
+        io_sweepNS($id, 'mediadir');
+    } else {
+        // save file (namespace dir is created in io_writeWikiPage)
+        io_writeWikiPage($svdta['file'], $svdta['newContent'], $id);
+        // pre-save the revision, to keep the attic in sync
+        $svdta['newRevision'] = saveOldRevision($id);
+        $filesize_new = filesize($svdta['file']);
+    }
+    $svdta['sizechange'] = $filesize_new - $filesize_old;
+
+    $event->advise_after();
+
+    addLogEntry($svdta['newRevision'], $svdta['id'], $svdta['changeType'], $svdta['summary'], $svdta['changeInfo'], null, $svdta['sizechange']);
+
+    // send notify mails
+    notify($svdta['id'], 'admin', $svdta['oldRevision'], $svdta['summary'], $minor);
+    notify($svdta['id'], 'subscribers', $svdta['oldRevision'], $svdta['summary'], $minor);
+
+    // update the purgefile (timestamp of the last time anything within the wiki was changed)
+    io_saveFile($conf['cachedir'].'/purgefile', time());
+
+    // if useheading is enabled, purge the cache of all linking pages
+    if(useHeading('content')) {
+        $pages = ft_backlinks($id, true);
+        foreach($pages as $page) {
+            $cache = new cache_renderer($page, wikiFN($page), 'xhtml');
+            $cache->removeCache();
+        }
+    }
+}
+
+/**
+ * moves the current version to the attic and returns its
+ * revision date
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param string $id page id
+ * @return int|string revision timestamp
+ */
+function saveOldRevision($id) {
+    $oldf = wikiFN($id);
+    if(!file_exists($oldf)) return '';
+    $date = filemtime($oldf);
+    $newf = wikiFN($id, $date);
+    io_writeWikiPage($newf, rawWiki($id), $id, $date);
+    return $date;
+}
+
+/**
+ * Sends a notify mail on page change or registration
+ *
+ * @param string     $id       The changed page
+ * @param string     $who      Who to notify (admin|subscribers|register)
+ * @param int|string $rev Old page revision
+ * @param string     $summary  What changed
+ * @param boolean    $minor    Is this a minor edit?
+ * @param string[]   $replace  Additional string substitutions, @KEY@ to be replaced by value
+ * @return bool
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+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') {
+        if(empty($conf['notify'])) return false; //notify enabled?
+        $tpl = 'mailtext';
+        $to  = $conf['notify'];
+    } elseif($who == 'subscribers') {
+        if(!actionOK('subscribe')) return false; //subscribers enabled?
+        if($conf['useacl'] && $INPUT->server->str('REMOTE_USER') && $minor) return false; //skip minors
+        $data = array('id' => $id, 'addresslist' => '', 'self' => false, 'replacements' => $replace);
+        trigger_event(
+            'COMMON_NOTIFY_ADDRESSLIST', $data,
+            array(new Subscription(), 'notifyaddresses')
+        );
+        $to = $data['addresslist'];
+        if(empty($to)) return false;
+        $tpl = 'subscr_single';
+    } else {
+        return false; //just to be safe
+    }
+
+    // prepare content
+    $subscription = new Subscription();
+    return $subscription->send_diff($to, $tpl, $id, $rev, $summary);
+}
+
+/**
+ * extracts the query from a search engine referrer
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @author Todd Augsburger <todd@rollerorgans.com>
+ *
+ * @return array|string
+ */
+function getGoogleQuery() {
+    /* @var Input $INPUT */
+    global $INPUT;
+
+    if(!$INPUT->server->has('HTTP_REFERER')) {
+        return '';
+    }
+    $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 '';
+
+    $query = array();
+    // temporary workaround against PHP bug #49733
+    // see http://bugs.php.net/bug.php?id=49733
+    if(UTF8_MBSTRING) $enc = mb_internal_encoding();
+    parse_str($url['query'], $query);
+    if(UTF8_MBSTRING) mb_internal_encoding($enc);
+
+    $q = '';
+    if(isset($query['q'])){
+        $q = $query['q'];
+    }elseif(isset($query['p'])){
+        $q = $query['p'];
+    }elseif(isset($query['query'])){
+        $q = $query['query'];
+    }
+    $q = trim($q);
+
+    if(!$q) return '';
+    $q = preg_split('/[\s\'"\\\\`()\]\[?:!\.{};,#+*<>\\/]+/', $q, -1, PREG_SPLIT_NO_EMPTY);
+    return $q;
+}
+
+/**
+ * Return the human readable size of a file
+ *
+ * @param int $size A file size
+ * @param int $dec A number of decimal places
+ * @return string human readable size
+ *
+ * @author      Martin Benjamin <b.martin@cybernet.ch>
+ * @author      Aidan Lister <aidan@php.net>
+ * @version     1.0.0
+ */
+function filesize_h($size, $dec = 1) {
+    $sizes = array('B', 'KB', 'MB', 'GB');
+    $count = count($sizes);
+    $i     = 0;
+
+    while($size >= 1024 && ($i < $count - 1)) {
+        $size /= 1024;
+        $i++;
+    }
+
+    return round($size, $dec)."\xC2\xA0".$sizes[$i]; //non-breaking space
+}
+
+/**
+ * Return the given timestamp as human readable, fuzzy age
+ *
+ * @author Andreas Gohr <gohr@cosmocode.de>
+ *
+ * @param int $dt timestamp
+ * @return string
+ */
+function datetime_h($dt) {
+    global $lang;
+
+    $ago = time() - $dt;
+    if($ago > 24 * 60 * 60 * 30 * 12 * 2) {
+        return sprintf($lang['years'], round($ago / (24 * 60 * 60 * 30 * 12)));
+    }
+    if($ago > 24 * 60 * 60 * 30 * 2) {
+        return sprintf($lang['months'], round($ago / (24 * 60 * 60 * 30)));
+    }
+    if($ago > 24 * 60 * 60 * 7 * 2) {
+        return sprintf($lang['weeks'], round($ago / (24 * 60 * 60 * 7)));
+    }
+    if($ago > 24 * 60 * 60 * 2) {
+        return sprintf($lang['days'], round($ago / (24 * 60 * 60)));
+    }
+    if($ago > 60 * 60 * 2) {
+        return sprintf($lang['hours'], round($ago / (60 * 60)));
+    }
+    if($ago > 60 * 2) {
+        return sprintf($lang['minutes'], round($ago / (60)));
+    }
+    return sprintf($lang['seconds'], $ago);
+}
+
+/**
+ * Wraps around strftime but provides support for fuzzy dates
+ *
+ * The format default to $conf['dformat']. It is passed to
+ * strftime - %f can be used to get the value from datetime_h()
+ *
+ * @see datetime_h
+ * @author Andreas Gohr <gohr@cosmocode.de>
+ *
+ * @param int|null $dt      timestamp when given, null will take current timestamp
+ * @param string   $format  empty default to $conf['dformat'], or provide format as recognized by strftime()
+ * @return string
+ */
+function dformat($dt = null, $format = '') {
+    global $conf;
+
+    if(is_null($dt)) $dt = time();
+    $dt = (int) $dt;
+    if(!$format) $format = $conf['dformat'];
+
+    $format = str_replace('%f', datetime_h($dt), $format);
+    return strftime($format, $dt);
+}
+
+/**
+ * Formats a timestamp as ISO 8601 date
+ *
+ * @author <ungu at terong dot com>
+ * @link http://php.net/manual/en/function.date.php#54072
+ *
+ * @param int $int_date current date in UNIX timestamp
+ * @return string
+ */
+function date_iso8601($int_date) {
+    $date_mod     = date('Y-m-d\TH:i:s', $int_date);
+    $pre_timezone = date('O', $int_date);
+    $time_zone    = substr($pre_timezone, 0, 3).":".substr($pre_timezone, 3, 2);
+    $date_mod .= $time_zone;
+    return $date_mod;
+}
+
+/**
+ * return an obfuscated email address in line with $conf['mailguard'] setting
+ *
+ * @author Harry Fuecks <hfuecks@gmail.com>
+ * @author Christopher Smith <chris@jalakai.co.uk>
+ *
+ * @param string $email email address
+ * @return string
+ */
+function obfuscate($email) {
+    global $conf;
+
+    switch($conf['mailguard']) {
+        case 'visible' :
+            $obfuscate = array('@' => ' [at] ', '.' => ' [dot] ', '-' => ' [dash] ');
+            return strtr($email, $obfuscate);
+
+        case 'hex' :
+            $encode = '';
+            $len    = strlen($email);
+            for($x = 0; $x < $len; $x++) {
+                $encode .= '&#x'.bin2hex($email{$x}).';';
+            }
+            return $encode;
+
+        case 'none' :
+        default :
+            return $email;
+    }
+}
+
+/**
+ * Removes quoting backslashes
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param string $string
+ * @param string $char backslashed character
+ * @return string
+ */
+function unslash($string, $char = "'") {
+    return str_replace('\\'.$char, $char, $string);
+}
+
+/**
+ * Convert php.ini shorthands to byte
+ *
+ * @author <gilthans dot NO dot SPAM at gmail dot com>
+ * @link   http://php.net/manual/en/ini.core.php#79564
+ *
+ * @param string $v shorthands
+ * @return int|string
+ */
+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;
+        /** @noinspection PhpMissingBreakStatementInspection */
+        case 'K':
+            $ret *= 1024;
+            break;
+        default;
+            $ret *= 10;
+            break;
+    }
+    return $ret;
+}
+
+/**
+ * Wrapper around preg_quote adding the default delimiter
+ *
+ * @param string $string
+ * @return string
+ */
+function preg_quote_cb($string) {
+    return preg_quote($string, '/');
+}
+
+/**
+ * Shorten a given string by removing data from the middle
+ *
+ * You can give the string in two parts, the first part $keep
+ * will never be shortened. The second part $short will be cut
+ * in the middle to shorten but only if at least $min chars are
+ * left to display it. Otherwise it will be left off.
+ *
+ * @param string $keep   the part to keep
+ * @param string $short  the part to shorten
+ * @param int    $max    maximum chars you want for the whole string
+ * @param int    $min    minimum number of chars to have left for middle shortening
+ * @param string $char   the shortening character to use
+ * @return string
+ */
+function shorten($keep, $short, $max, $min = 9, $char = '…') {
+    $max = $max - utf8_strlen($keep);
+    if($max < $min) return $keep;
+    $len = utf8_strlen($short);
+    if($len <= $max) return $keep.$short;
+    $half = floor($max / 2);
+    return $keep.utf8_substr($short, 0, $half - 1).$char.utf8_substr($short, $len - $half);
+}
+
+/**
+ * Return the users real name or e-mail address for use
+ * in page footer and recent changes pages
+ *
+ * @param string|null $username or null 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 <dokuwiki AT andywebber DOT com>
+ */
+function editorinfo($username, $textonly = false) {
+    return userlink($username, $textonly);
+}
+
+/**
+ * Returns users realname w/o link
+ *
+ * @param string|null $username or null 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;
+
+    // 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'] = '<bdi>' . hsc($INFO['userinfo']['name']) . '</bdi> (<bdi>' . hsc($INPUT->server->str('REMOTE_USER')) . '</bdi>)';
+        }
+    }
+
+    $evt = new Doku_Event('COMMON_USER_LINK', $data);
+    if($evt->advise_before(true)) {
+        if(empty($data['name'])) {
+            if($auth) $info = $auth->getUserData($username);
+            if($conf['showuseras'] != 'loginname' && 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;
+                }
+            } else {
+                $data['name'] = $textonly ? $data['username'] : hsc($data['username']);
+            }
+        }
+
+        /** @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'];
+}
+
+/**
+ * Returns the path to a image file for the currently chosen license.
+ * When no image exists, returns an empty string
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param  string $type - type of image 'badge' or 'button'
+ * @return string
+ */
+function license_img($type) {
+    global $license;
+    global $conf;
+    if(!$conf['license']) return '';
+    if(!is_array($license[$conf['license']])) return '';
+    $try   = array();
+    $try[] = 'lib/images/license/'.$type.'/'.$conf['license'].'.png';
+    $try[] = 'lib/images/license/'.$type.'/'.$conf['license'].'.gif';
+    if(substr($conf['license'], 0, 3) == 'cc-') {
+        $try[] = 'lib/images/license/'.$type.'/cc.png';
+    }
+    foreach($try as $src) {
+        if(file_exists(DOKU_INC.$src)) return $src;
+    }
+    return '';
+}
+
+/**
+ * Checks if the given amount of memory is available
+ *
+ * If the memory_get_usage() function is not available the
+ * function just assumes $bytes of already allocated memory
+ *
+ * @author Filip Oscadal <webmaster@illusionsoftworks.cz>
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param int  $mem    Size of memory you want to allocate in bytes
+ * @param int  $bytes  already allocated memory (see above)
+ * @return bool
+ */
+function is_mem_available($mem, $bytes = 1048576) {
+    $limit = trim(ini_get('memory_limit'));
+    if(empty($limit)) return true; // no limit set!
+
+    // parse limit to bytes
+    $limit = php_to_byte($limit);
+
+    // get used memory if possible
+    if(function_exists('memory_get_usage')) {
+        $used = memory_get_usage();
+    } else {
+        $used = $bytes;
+    }
+
+    if($used + $mem > $limit) {
+        return false;
+    }
+
+    return true;
+}
+
+/**
+ * Send a HTTP redirect to the browser
+ *
+ * Works arround Microsoft IIS cookie sending bug. Exits the script.
+ *
+ * @link   http://support.microsoft.com/kb/q176113/
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param string $url url being directed to
+ */
+function send_redirect($url) {
+    $url = stripctl($url); // defend against HTTP Response Splitting
+
+    /* @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')) {
+        //reopen session, store data and close session again
+        @session_start();
+        $_SESSION[DOKU_COOKIE]['msg'] = $MSG;
+    }
+
+    // always close the session
+    session_write_close();
+
+    // check if running on IIS < 6 with CGI-PHP
+    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);
+    } else {
+        header('Location: '.$url);
+    }
+
+    // no exits during unit tests
+    if(defined('DOKU_UNITTEST')) {
+        // pass info about the redirect back to the test suite
+        $testRequest = TestRequest::getRunning();
+        if($testRequest !== null) {
+            $testRequest->addData('send_redirect', $url);
+        }
+        return;
+    }
+
+    exit;
+}
+
+/**
+ * Validate a value using a set of valid values
+ *
+ * This function checks whether a specified value is set and in the array
+ * $valid_values. If not, the function returns a default value or, if no
+ * default is specified, throws an exception.
+ *
+ * @param string $param        The name of the parameter
+ * @param array  $valid_values A set of valid values; Optionally a default may
+ *                             be marked by the key “default”.
+ * @param array  $array        The array containing the value (typically $_POST
+ *                             or $_GET)
+ * @param string $exc          The text of the raised exception
+ *
+ * @throws Exception
+ * @return mixed
+ * @author Adrian Lang <lang@cosmocode.de>
+ */
+function valid_input_set($param, $valid_values, $array, $exc = '') {
+    if(isset($array[$param]) && in_array($array[$param], $valid_values)) {
+        return $array[$param];
+    } elseif(isset($valid_values['default'])) {
+        return $valid_values['default'];
+    } else {
+        throw new Exception($exc);
+    }
+}
+
+/**
+ * Read a preference from the DokuWiki cookie
+ * (remembering both keys & values are urlencoded)
+ *
+ * @param string $pref     preference key
+ * @param mixed  $default  value returned when preference not found
+ * @return string preference value
+ */
+function get_doku_pref($pref, $default) {
+    $enc_pref = urlencode($pref);
+    if(isset($_COOKIE['DOKU_PREFS']) && strpos($_COOKIE['DOKU_PREFS'], $enc_pref) !== false) {
+        $parts = explode('#', $_COOKIE['DOKU_PREFS']);
+        $cnt   = count($parts);
+        for($i = 0; $i < $cnt; $i += 2) {
+            if($parts[$i] == $enc_pref) {
+                return urldecode($parts[$i + 1]);
+            }
+        }
+    }
+    return $default;
+}
+
+/**
+ * Add a preference to the DokuWiki cookie
+ * (remembering $_COOKIE['DOKU_PREFS'] is urlencoded)
+ * Remove it by setting $val to false
+ *
+ * @param string $pref  preference key
+ * @param string $val   preference value
+ */
+function set_doku_pref($pref, $val) {
+    global $conf;
+    $orig = get_doku_pref($pref, false);
+    $cookieVal = '';
+
+    if($orig && ($orig != $val)) {
+        $parts = explode('#', $_COOKIE['DOKU_PREFS']);
+        $cnt   = count($parts);
+        // urlencode $pref for the comparison
+        $enc_pref = rawurlencode($pref);
+        for($i = 0; $i < $cnt; $i += 2) {
+            if($parts[$i] == $enc_pref) {
+                if ($val !== false) {
+                    $parts[$i + 1] = rawurlencode($val);
+                } else {
+                    unset($parts[$i]);
+                    unset($parts[$i + 1]);
+                }
+                break;
+            }
+        }
+        $cookieVal = implode('#', $parts);
+    } else if (!$orig && $val !== false) {
+        $cookieVal = ($_COOKIE['DOKU_PREFS'] ? $_COOKIE['DOKU_PREFS'].'#' : '').rawurlencode($pref).'#'.rawurlencode($val);
+    }
+
+    if (!empty($cookieVal)) {
+        $cookieDir = empty($conf['cookiedir']) ? DOKU_REL : $conf['cookiedir'];
+        setcookie('DOKU_PREFS', $cookieVal, time()+365*24*3600, $cookieDir, '', ($conf['securecookie'] && is_ssl()));
+    }
+}
+
+/**
+ * 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);
+}
+
+/**
+ * Returns the contents of a given SVG file for embedding
+ *
+ * Inlining SVGs saves on HTTP requests and more importantly allows for styling them through
+ * CSS. However it should used with small SVGs only. The $maxsize setting ensures only small
+ * files are embedded.
+ *
+ * This strips unneeded headers, comments and newline. The result is not a vaild standalone SVG!
+ *
+ * @param string $file full path to the SVG file
+ * @param int $maxsize maximum allowed size for the SVG to be embedded
+ * @return string|false the SVG content, false if the file couldn't be loaded
+ */
+function inlineSVG($file, $maxsize = 2048) {
+    $file = trim($file);
+    if($file === '') return false;
+    if(!file_exists($file)) return false;
+    if(filesize($file) > $maxsize) return false;
+    if(!is_readable($file)) return false;
+    $content = file_get_contents($file);
+    $content = preg_replace('/<!--.*?(-->)/s','', $content); // comments
+    $content = preg_replace('/<\?xml .*?\?>/i', '', $content); // xml header
+    $content = preg_replace('/<!DOCTYPE .*?>/i', '', $content); // doc type
+    $content = preg_replace('/>\s+</s', '><', $content); // newlines between tags
+    $content = trim($content);
+    if(substr($content, 0, 5) !== '<svg ') return false;
+    return $content;
+}
+
+//Setup VIM: ex: et ts=2 :
diff --git a/wiki/inc/compatibility.php b/wiki/inc/compatibility.php
new file mode 100644
index 0000000..cb865a2
--- /dev/null
+++ b/wiki/inc/compatibility.php
@@ -0,0 +1,82 @@
+<?php
+/**
+ * compatibility functions
+ *
+ * This file contains a few functions that might be missing from the PHP build
+ */
+
+if(!function_exists('ctype_space')) {
+    /**
+     * Check for whitespace character(s)
+     *
+     * @see ctype_space
+     * @param string $text
+     * @return bool
+     */
+    function ctype_space($text) {
+        if(!is_string($text)) return false; #FIXME original treats between -128 and 255 inclusive as ASCII chars
+        if(trim($text) === '') return true;
+        return false;
+    }
+}
+
+if(!function_exists('ctype_digit')) {
+    /**
+     * Check for numeric character(s)
+     *
+     * @see ctype_digit
+     * @param string $text
+     * @return bool
+     */
+    function ctype_digit($text) {
+        if(!is_string($text)) return false; #FIXME original treats between -128 and 255 inclusive as ASCII chars
+        if(preg_match('/^\d+$/', $text)) return true;
+        return false;
+    }
+}
+
+if(!function_exists('gzopen') && function_exists('gzopen64')) {
+    /**
+     * work around for PHP compiled against certain zlib versions #865
+     *
+     * @link http://stackoverflow.com/questions/23417519/php-zlib-gzopen-not-exists
+     *
+     * @param string $filename
+     * @param string $mode
+     * @param int    $use_include_path
+     * @return mixed
+     */
+    function gzopen($filename, $mode, $use_include_path = 0) {
+        return gzopen64($filename, $mode, $use_include_path);
+    }
+}
+
+if(!function_exists('gzseek') && function_exists('gzseek64')) {
+    /**
+     * work around for PHP compiled against certain zlib versions #865
+     *
+     * @link http://stackoverflow.com/questions/23417519/php-zlib-gzopen-not-exists
+     *
+     * @param resource $zp
+     * @param int      $offset
+     * @param int      $whence
+     * @return int
+     */
+    function gzseek($zp, $offset, $whence = SEEK_SET) {
+        return gzseek64($zp, $offset, $whence);
+    }
+}
+
+if(!function_exists('gztell') && function_exists('gztell64')) {
+    /**
+     * work around for PHP compiled against certain zlib versions #865
+     *
+     * @link   http://stackoverflow.com/questions/23417519/php-zlib-gzopen-not-exists
+     *
+     * @param resource $zp
+     * @return int
+     */
+    function gztell($zp) {
+        return gztell64($zp);
+    }
+}
\ No newline at end of file
diff --git a/wiki/inc/config_cascade.php b/wiki/inc/config_cascade.php
new file mode 100644
index 0000000..f0aa6cc
--- /dev/null
+++ b/wiki/inc/config_cascade.php
@@ -0,0 +1,87 @@
+<?php
+/**
+ * The default config cascade
+ *
+ * This array configures the default locations of various files in the
+ * DokuWiki directory hierarchy. It can be overriden in inc/preload.php
+ */
+$config_cascade = array_merge(
+    array(
+        'main' => array(
+            'default'   => array(DOKU_CONF . 'dokuwiki.php'),
+            'local'     => array(DOKU_CONF . 'local.php'),
+            'protected' => array(DOKU_CONF . 'local.protected.php'),
+        ),
+        'acronyms' => array(
+            'default'   => array(DOKU_CONF . 'acronyms.conf'),
+            'local'     => array(DOKU_CONF . 'acronyms.local.conf'),
+        ),
+        'entities' => array(
+            'default'   => array(DOKU_CONF . 'entities.conf'),
+            'local'     => array(DOKU_CONF . 'entities.local.conf'),
+        ),
+        'interwiki' => array(
+            'default'   => array(DOKU_CONF . 'interwiki.conf'),
+            'local'     => array(DOKU_CONF . 'interwiki.local.conf'),
+        ),
+        'license' => array(
+            'default'   => array(DOKU_CONF . 'license.php'),
+            'local'     => array(DOKU_CONF . 'license.local.php'),
+        ),
+        'manifest' => array(
+            'default'   => array(DOKU_CONF . 'manifest.json'),
+            'local'     => array(DOKU_CONF . 'manifest.local.json'),
+        ),
+        'mediameta' => array(
+            'default'   => array(DOKU_CONF . 'mediameta.php'),
+            'local'     => array(DOKU_CONF . 'mediameta.local.php'),
+        ),
+        'mime' => array(
+            'default'   => array(DOKU_CONF . 'mime.conf'),
+            'local'     => array(DOKU_CONF . 'mime.local.conf'),
+        ),
+        'scheme' => array(
+            'default'   => array(DOKU_CONF . 'scheme.conf'),
+            'local'     => array(DOKU_CONF . 'scheme.local.conf'),
+        ),
+        'smileys' => array(
+            'default'   => array(DOKU_CONF . 'smileys.conf'),
+            'local'     => array(DOKU_CONF . 'smileys.local.conf'),
+        ),
+        'wordblock' => array(
+            'default'   => array(DOKU_CONF . 'wordblock.conf'),
+            'local'     => array(DOKU_CONF . 'wordblock.local.conf'),
+        ),
+        'userstyle' => array(
+            'screen'    => array(DOKU_CONF . 'userstyle.css', DOKU_CONF . 'userstyle.less'),
+            'print'     => array(DOKU_CONF . 'userprint.css', DOKU_CONF . 'userprint.less'),
+            'feed'      => array(DOKU_CONF . 'userfeed.css', DOKU_CONF . 'userfeed.less'),
+            'all'       => array(DOKU_CONF . 'userall.css', DOKU_CONF . 'userall.less')
+        ),
+        'userscript' => array(
+            'default'   => array(DOKU_CONF . 'userscript.js')
+        ),
+        'acl' => array(
+            'default'   => DOKU_CONF . 'acl.auth.php',
+        ),
+        'plainauth.users' => array(
+            'default'   => DOKU_CONF . 'users.auth.php',
+            'protected' => '' // not used by default
+        ),
+        'plugins' => array(
+            'default'   => array(DOKU_CONF . 'plugins.php'),
+            'local'     => array(DOKU_CONF . 'plugins.local.php'),
+            'protected' => array(
+                DOKU_CONF . 'plugins.required.php',
+                DOKU_CONF . 'plugins.protected.php',
+            ),
+        ),
+        'lang' => array(
+            'core'      => array(DOKU_CONF . 'lang/'),
+            'plugin'    => array(DOKU_CONF . 'plugin_lang/'),
+            'template'  => array(DOKU_CONF . 'template_lang/')
+        )
+    ),
+    $config_cascade
+);
+
diff --git a/wiki/inc/confutils.php b/wiki/inc/confutils.php
new file mode 100644
index 0000000..5914701
--- /dev/null
+++ b/wiki/inc/confutils.php
@@ -0,0 +1,467 @@
+<?php
+/**
+ * Utilities for collecting data from config files
+ *
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author     Harry Fuecks <hfuecks@gmail.com>
+ */
+
+/*
+ * line prefix used to negate single value config items
+ * (scheme.conf & stopwords.conf), e.g.
+ * !gopher
+ */
+const DOKU_CONF_NEGATION = '!';
+
+/**
+ * Returns the (known) extension and mimetype of a given filename
+ *
+ * If $knownonly is true (the default), then only known extensions
+ * are returned.
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param string $file file name
+ * @param bool   $knownonly
+ * @return array with extension, mimetype and if it should be downloaded
+ */
+function mimetype($file, $knownonly=true){
+    $mtypes = getMimeTypes();     // known mimetypes
+    $ext    = strrpos($file, '.');
+    if ($ext === false) {
+        return array(false, false, false);
+    }
+    $ext = strtolower(substr($file, $ext + 1));
+    if (!isset($mtypes[$ext])){
+        if ($knownonly) {
+            return array(false, false, false);
+        } else {
+            return array($ext, 'application/octet-stream', true);
+        }
+    }
+    if($mtypes[$ext][0] == '!'){
+        return array($ext, substr($mtypes[$ext],1), true);
+    }else{
+        return array($ext, $mtypes[$ext], false);
+    }
+}
+
+/**
+ * returns a hash of mimetypes
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+function getMimeTypes() {
+    static $mime = null;
+    if ( !$mime ) {
+        $mime = retrieveConfig('mime','confToHash');
+        $mime = array_filter($mime);
+    }
+    return $mime;
+}
+
+/**
+ * returns a hash of acronyms
+ *
+ * @author Harry Fuecks <hfuecks@gmail.com>
+ */
+function getAcronyms() {
+    static $acronyms = null;
+    if ( !$acronyms ) {
+        $acronyms = retrieveConfig('acronyms','confToHash');
+        $acronyms = array_filter($acronyms, 'strlen');
+    }
+    return $acronyms;
+}
+
+/**
+ * returns a hash of smileys
+ *
+ * @author Harry Fuecks <hfuecks@gmail.com>
+ */
+function getSmileys() {
+    static $smileys = null;
+    if ( !$smileys ) {
+        $smileys = retrieveConfig('smileys','confToHash');
+        $smileys = array_filter($smileys, 'strlen');
+    }
+    return $smileys;
+}
+
+/**
+ * returns a hash of entities
+ *
+ * @author Harry Fuecks <hfuecks@gmail.com>
+ */
+function getEntities() {
+    static $entities = null;
+    if ( !$entities ) {
+        $entities = retrieveConfig('entities','confToHash');
+        $entities = array_filter($entities, 'strlen');
+    }
+    return $entities;
+}
+
+/**
+ * returns a hash of interwikilinks
+ *
+ * @author Harry Fuecks <hfuecks@gmail.com>
+ */
+function getInterwiki() {
+    static $wikis = null;
+    if ( !$wikis ) {
+        $wikis = retrieveConfig('interwiki','confToHash',array(true));
+        $wikis = array_filter($wikis, 'strlen');
+
+        //add sepecial case 'this'
+        $wikis['this'] = DOKU_URL.'{NAME}';
+    }
+    return $wikis;
+}
+
+/**
+ * Returns the jquery script URLs for the versions defined in lib/scripts/jquery/versions
+ *
+ * @trigger CONFUTIL_CDN_SELECT
+ * @return array
+ */
+function getCdnUrls() {
+    global $conf;
+
+    // load version info
+    $versions = array();
+    $lines = file(DOKU_INC . 'lib/scripts/jquery/versions');
+    foreach($lines as $line) {
+        $line = trim(preg_replace('/#.*$/', '', $line));
+        if($line === '') continue;
+        list($key, $val) = explode('=', $line, 2);
+        $key = trim($key);
+        $val = trim($val);
+        $versions[$key] = $val;
+    }
+
+    $src = array();
+    $data = array(
+        'versions' => $versions,
+        'src' => &$src
+    );
+    $event = new Doku_Event('CONFUTIL_CDN_SELECT', $data);
+    if($event->advise_before()) {
+        if(!$conf['jquerycdn']) {
+            $jqmod = md5(join('-', $versions));
+            $src[] = DOKU_BASE . 'lib/exe/jquery.php' . '?tseed=' . $jqmod;
+        } elseif($conf['jquerycdn'] == 'jquery') {
+            $src[] = sprintf('https://code.jquery.com/jquery-%s.min.js', $versions['JQ_VERSION']);
+            $src[] = sprintf('https://code.jquery.com/jquery-migrate-%s.min.js', $versions['JQM_VERSION']);
+            $src[] = sprintf('https://code.jquery.com/ui/%s/jquery-ui.min.js', $versions['JQUI_VERSION']);
+        } elseif($conf['jquerycdn'] == 'cdnjs') {
+            $src[] = sprintf('https://cdnjs.cloudflare.com/ajax/libs/jquery/%s/jquery.min.js', $versions['JQ_VERSION']);
+            $src[] = sprintf('https://cdnjs.cloudflare.com/ajax/libs/jquery-migrate/%s/jquery-migrate.min.js', $versions['JQM_VERSION']);
+            $src[] = sprintf('https://cdnjs.cloudflare.com/ajax/libs/jqueryui/%s/jquery-ui.min.js', $versions['JQUI_VERSION']);
+        }
+    }
+    $event->advise_after();
+
+    return $src;
+}
+
+/**
+ * returns array of wordblock patterns
+ *
+ */
+function getWordblocks() {
+    static $wordblocks = null;
+    if ( !$wordblocks ) {
+        $wordblocks = retrieveConfig('wordblock','file',null,'array_merge_with_removal');
+    }
+    return $wordblocks;
+}
+
+/**
+ * Gets the list of configured schemes
+ *
+ * @return array the schemes
+ */
+function getSchemes() {
+    static $schemes = null;
+    if ( !$schemes ) {
+        $schemes = retrieveConfig('scheme','file',null,'array_merge_with_removal');
+        $schemes = array_map('trim', $schemes);
+        $schemes = preg_replace('/^#.*/', '', $schemes);
+        $schemes = array_filter($schemes);
+    }
+    return $schemes;
+}
+
+/**
+ * Builds a hash from an array of lines
+ *
+ * If $lower is set to true all hash keys are converted to
+ * lower case.
+ *
+ * @author Harry Fuecks <hfuecks@gmail.com>
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @author Gina Haeussge <gina@foosel.net>
+ *
+ * @param array $lines
+ * @param bool $lower
+ *
+ * @return array
+ */
+function linesToHash($lines, $lower = false) {
+    $conf = array();
+    // remove BOM
+    if(isset($lines[0]) && substr($lines[0], 0, 3) == pack('CCC', 0xef, 0xbb, 0xbf))
+        $lines[0] = substr($lines[0], 3);
+    foreach($lines as $line) {
+        //ignore comments (except escaped ones)
+        $line = preg_replace('/(?<![&\\\\])#.*$/', '', $line);
+        $line = str_replace('\\#', '#', $line);
+        $line = trim($line);
+        if($line === '') continue;
+        $line = preg_split('/\s+/', $line, 2);
+        $line = array_pad($line, 2, '');
+        // Build the associative array
+        if($lower) {
+            $conf[strtolower($line[0])] = $line[1];
+        } else {
+            $conf[$line[0]] = $line[1];
+        }
+    }
+
+    return $conf;
+}
+
+/**
+ * Builds a hash from a configfile
+ *
+ * If $lower is set to true all hash keys are converted to
+ * lower case.
+ *
+ * @author Harry Fuecks <hfuecks@gmail.com>
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @author Gina Haeussge <gina@foosel.net>
+ *
+ * @param string $file
+ * @param bool $lower
+ *
+ * @return array
+ */
+function confToHash($file,$lower=false) {
+    $conf = array();
+    $lines = @file( $file );
+    if ( !$lines ) return $conf;
+
+    return linesToHash($lines, $lower);
+}
+
+/**
+ * Read a json config file into an array
+ *
+ * @param string $file
+ * @return array
+ */
+function jsonToArray($file)
+{
+    $json = file_get_contents($file);
+
+    $conf = json_decode($json, true);
+
+    if ($conf === null) {
+        return [];
+    }
+
+    return $conf;
+}
+
+/**
+ * Retrieve the requested configuration information
+ *
+ * @author Chris Smith <chris@jalakai.co.uk>
+ *
+ * @param  string   $type     the configuration settings to be read, must correspond to a key/array in $config_cascade
+ * @param  callback $fn       the function used to process the configuration file into an array
+ * @param  array    $params   optional additional params to pass to the callback
+ * @param  callback $combine  the function used to combine arrays of values read from different configuration files;
+ *                            the function takes two parameters,
+ *                               $combined - the already read & merged configuration values
+ *                               $new - array of config values from the config cascade file being currently processed
+ *                            and returns an array of the merged configuration values.
+ * @return array    configuration values
+ */
+function retrieveConfig($type,$fn,$params=null,$combine='array_merge') {
+    global $config_cascade;
+
+    if(!is_array($params)) $params = array();
+
+    $combined = array();
+    if (!is_array($config_cascade[$type])) trigger_error('Missing config cascade for "'.$type.'"',E_USER_WARNING);
+    foreach (array('default','local','protected') as $config_group) {
+        if (empty($config_cascade[$type][$config_group])) continue;
+        foreach ($config_cascade[$type][$config_group] as $file) {
+            if (file_exists($file)) {
+                $config = call_user_func_array($fn,array_merge(array($file),$params));
+                $combined = $combine($combined, $config);
+            }
+        }
+    }
+
+    return $combined;
+}
+
+/**
+ * Include the requested configuration information
+ *
+ * @author Chris Smith <chris@jalakai.co.uk>
+ *
+ * @param  string   $type     the configuration settings to be read, must correspond to a key/array in $config_cascade
+ * @return array              list of files, default before local before protected
+ */
+function getConfigFiles($type) {
+    global $config_cascade;
+    $files = array();
+
+    if (!is_array($config_cascade[$type])) trigger_error('Missing config cascade for "'.$type.'"',E_USER_WARNING);
+    foreach (array('default','local','protected') as $config_group) {
+        if (empty($config_cascade[$type][$config_group])) continue;
+        $files = array_merge($files, $config_cascade[$type][$config_group]);
+    }
+
+    return $files;
+}
+
+/**
+ * check if the given action was disabled in config
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @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 DokuWiki_Auth_Plugin $auth */
+        global $auth;
+
+        // prepare disabled actions array and handle legacy options
+        $disabled = explode(',',$conf['disableactions']);
+        $disabled = array_map('trim',$disabled);
+        if((isset($conf['openregister']) && !$conf['openregister']) || is_null($auth) || !$auth->canDo('addUser')) {
+            $disabled[] = 'register';
+        }
+        if((isset($conf['resendpasswd']) && !$conf['resendpasswd']) || is_null($auth) || !$auth->canDo('modPass')) {
+            $disabled[] = 'resendpwd';
+        }
+        if((isset($conf['subscribers']) && !$conf['subscribers']) || is_null($auth)) {
+            $disabled[] = 'subscribe';
+        }
+        if (is_null($auth) || !$auth->canDo('Profile')) {
+            $disabled[] = 'profile';
+        }
+        if (is_null($auth) || !$auth->canDo('delUser')) {
+            $disabled[] = 'profile_delete';
+        }
+        if (is_null($auth)) {
+            $disabled[] = 'login';
+        }
+        if (is_null($auth) || !$auth->canDo('logout')) {
+            $disabled[] = 'logout';
+        }
+        $disabled = array_unique($disabled);
+    }
+
+    return !in_array($action,$disabled);
+}
+
+/**
+ * check if headings should be used as link text for the specified link type
+ *
+ * @author Chris Smith <chris@jalakai.co.uk>
+ *
+ * @param   string  $linktype   'content'|'navigation', content applies to links in wiki text
+ *                                                      navigation applies to all other links
+ * @return  boolean             true if headings should be used for $linktype, false otherwise
+ */
+function useHeading($linktype) {
+    static $useHeading = null;
+    if(defined('DOKU_UNITTEST')) $useHeading = null; // don't cache during unit tests
+
+    if (is_null($useHeading)) {
+        global $conf;
+
+        if (!empty($conf['useheading'])) {
+            switch ($conf['useheading']) {
+                case 'content':
+                    $useHeading['content'] = true;
+                    break;
+
+                case 'navigation':
+                    $useHeading['navigation'] = true;
+                    break;
+                default:
+                    $useHeading['content'] = true;
+                    $useHeading['navigation'] = true;
+            }
+        } else {
+            $useHeading = array();
+        }
+    }
+
+    return (!empty($useHeading[$linktype]));
+}
+
+/**
+ * obscure config data so information isn't plain text
+ *
+ * @param string       $str     data to be encoded
+ * @param string       $code    encoding method, values: plain, base64, uuencode.
+ * @return string               the encoded value
+ */
+function conf_encodeString($str,$code) {
+    switch ($code) {
+        case 'base64'   : return '<b>'.base64_encode($str);
+        case 'uuencode' : return '<u>'.convert_uuencode($str);
+        case 'plain':
+        default:
+                          return $str;
+    }
+}
+/**
+ * return obscured data as plain text
+ *
+ * @param  string      $str   encoded data
+ * @return string             plain text
+ */
+function conf_decodeString($str) {
+    switch (substr($str,0,3)) {
+        case '<b>' : return base64_decode(substr($str,3));
+        case '<u>' : return convert_uudecode(substr($str,3));
+        default:  // not encoded (or unknown)
+                     return $str;
+    }
+}
+
+/**
+ * array combination function to remove negated values (prefixed by !)
+ *
+ * @param  array $current
+ * @param  array $new
+ *
+ * @return array the combined array, numeric keys reset
+ */
+function array_merge_with_removal($current, $new) {
+    foreach ($new as $val) {
+        if (substr($val,0,1) == DOKU_CONF_NEGATION) {
+            $idx = array_search(trim(substr($val,1)),$current);
+            if ($idx !== false) {
+                unset($current[$idx]);
+            }
+        } else {
+            $current[] = trim($val);
+        }
+    }
+
+    return array_slice($current,0);
+}
+//Setup VIM: ex: et ts=4 :
diff --git a/wiki/inc/events.php b/wiki/inc/events.php
new file mode 100644
index 0000000..034414f
--- /dev/null
+++ b/wiki/inc/events.php
@@ -0,0 +1,257 @@
+<?php
+/**
+ * DokuWiki Events
+ *
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author     Christopher Smith <chris@jalakai.co.uk>
+ */
+
+if(!defined('DOKU_INC')) die('meh.');
+
+/**
+ * The event
+ */
+class Doku_Event {
+
+    // public properties
+    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
+    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
+    protected $_default = true;     // whether or not to carry out the default action associated with the event
+    protected $_continue = true;    // whether or not to continue propagating the event to other handlers
+
+    /**
+     * event constructor
+     *
+     * @param string $name
+     * @param mixed $data
+     */
+    function __construct($name, &$data) {
+
+        $this->name = $name;
+        $this->data =& $data;
+
+    }
+
+    /**
+     * @return string
+     */
+    function __toString() {
+        return $this->name;
+    }
+
+    /**
+     * advise functions
+     *
+     * advise all registered handlers of this event
+     *
+     * if these methods are used by functions outside of this object, they must
+     * properly handle correct processing of any default action and issue an
+     * advise_after() signal. e.g.
+     *    $evt = new Doku_Event(name, data);
+     *    if ($evt->advise_before(canPreventDefault) {
+     *      // default action code block
+     *    }
+     *    $evt->advise_after();
+     *    unset($evt);
+     *
+     * @param bool $enablePreventDefault
+     * @return bool results of processing the event, usually $this->_default
+     */
+    function advise_before($enablePreventDefault=true) {
+        global $EVENT_HANDLER;
+
+        $this->canPreventDefault = $enablePreventDefault;
+        $EVENT_HANDLER->process_event($this,'BEFORE');
+
+        return (!$enablePreventDefault || $this->_default);
+    }
+
+    function advise_after() {
+        global $EVENT_HANDLER;
+
+        $this->_continue = true;
+        $EVENT_HANDLER->process_event($this,'AFTER');
+    }
+
+    /**
+     * trigger
+     *
+     * - advise all registered (<event>_BEFORE) handlers that this event is about to take place
+     * - carry out the default action using $this->data based on $enablePrevent and
+     *   $this->_default, all of which may have been modified by the event handlers.
+     * - advise all registered (<event>_AFTER) handlers that the event has taken place
+     *
+     * @param null|callable $action
+     * @param bool $enablePrevent
+     * @return  mixed $event->results
+     *          the value set by any <event>_before or <event> handlers if the default action is prevented
+     *          or the results of the default action (as modified by <event>_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_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)) {
+                list($obj,$method) = $action;
+                $this->result = $obj->$method($this->data);
+            } else {
+                $this->result = $action($this->data);
+            }
+        }
+
+        $this->advise_after();
+
+        return $this->result;
+    }
+
+    /**
+     * stopPropagation
+     *
+     * stop any further processing of the event by event handlers
+     * this function does not prevent the default action taking place
+     */
+    public function stopPropagation() {
+        $this->_continue = false;
+    }
+
+    /**
+     * may the event propagate to the next handler?
+     *
+     * @return bool
+     */
+    public function mayPropagate() {
+        return $this->_continue;
+    }
+
+    /**
+     * preventDefault
+     *
+     * prevent the default action taking place
+     */
+    public function preventDefault() {
+        $this->_default = false;
+    }
+
+    /**
+     * should the default action be executed?
+     *
+     * @return bool
+     */
+    public function mayRunDefault() {
+        return $this->_default;
+    }
+}
+
+/**
+ * Controls the registration and execution of all events,
+ */
+class Doku_Event_Handler {
+
+    // public properties:  none
+
+    // private properties
+    protected $_hooks = array();          // array of events and their registered handlers
+
+    /**
+     * event_handler
+     *
+     * constructor, loads all action plugins and calls their register() method giving them
+     * an opportunity to register any hooks they require
+     */
+    function __construct() {
+
+        // load action plugins
+        /** @var DokuWiki_Action_Plugin $plugin */
+        $plugin = null;
+        $pluginlist = plugin_list('action');
+
+        foreach ($pluginlist as $plugin_name) {
+            $plugin = plugin_load('action',$plugin_name);
+
+            if ($plugin !== null) $plugin->register($this);
+        }
+    }
+
+    /**
+     * register_hook
+     *
+     * register a hook for an event
+     *
+     * @param  string   $event   string   name used by the event, (incl '_before' or '_after' for triggers)
+     * @param  string   $advise
+     * @param  object   $obj     object in whose scope method is to be executed,
+     *                             if NULL, method is assumed to be a globally available function
+     * @param  string   $method  event handler function
+     * @param  mixed    $param   data passed to the event handler
+     * @param  int      $seq     sequence number for ordering hook execution (ascending)
+     */
+    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]);
+        }
+    }
+
+    /**
+     * 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 $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 (!$event->mayPropagate()) return;
+                }
+            }
+        }
+    }
+}
+
+/**
+ * trigger_event
+ *
+ * function wrapper to process (create, trigger and destroy) an event
+ *
+ * @param  string   $name               name for the event
+ * @param  mixed    $data               event data
+ * @param  callback $action             (optional, default=NULL) default action, a php callback function
+ * @param  bool     $canPreventDefault  (optional, default=true) can hooks prevent the default action
+ *
+ * @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
+ */
+function trigger_event($name, &$data, $action=null, $canPreventDefault=true) {
+
+    $evt = new Doku_Event($name, $data);
+    return $evt->trigger($action, $canPreventDefault);
+}
diff --git a/wiki/inc/farm.php b/wiki/inc/farm.php
new file mode 100644
index 0000000..0cd9d4f
--- /dev/null
+++ b/wiki/inc/farm.php
@@ -0,0 +1,150 @@
+<?php
+/**
+ * This overwrites DOKU_CONF. Each animal gets its own configuration and data directory.
+ * This can be used together with preload.php. See preload.php.dist for an example setup.
+ * For more information see http://www.dokuwiki.org/farms.
+ *
+ * The farm directory (constant DOKU_FARMDIR) can be any directory and needs to be set.
+ * Animals are direct subdirectories of the farm directory.
+ * There are two different approaches:
+ *  * An .htaccess based setup can use any animal directory name:
+ *    http://example.org/<path_to_farm>/subdir/ will need the subdirectory '$farm/subdir/'.
+ *  * A virtual host based setup needs animal directory names which have to reflect
+ *    the domain name: If an animal resides in http://www.example.org:8080/mysite/test/,
+ *    directories that will match range from '$farm/8080.www.example.org.mysite.test/'
+ *    to a simple '$farm/domain/'.
+ *
+ * @author Anika Henke <anika@selfthinker.org>
+ * @author Michael Klier <chi@chimeric.de>
+ * @author Christopher Smith <chris@jalakai.co.uk>
+ * @author virtual host part of farm_confpath() based on conf_path() from Drupal.org's /includes/bootstrap.inc
+ *   (see https://github.com/drupal/drupal/blob/7.x/includes/bootstrap.inc#L537)
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ */
+
+// DOKU_FARMDIR needs to be set in preload.php, here the fallback is the same as DOKU_INC would be (if it was set already)
+if(!defined('DOKU_FARMDIR')) define('DOKU_FARMDIR', fullpath(dirname(__FILE__).'/../').'/');
+if(!defined('DOKU_CONF')) define('DOKU_CONF', farm_confpath(DOKU_FARMDIR));
+if(!defined('DOKU_FARM')) define('DOKU_FARM', false);
+
+
+/**
+ * Find the appropriate configuration directory.
+ *
+ * If the .htaccess based setup is used, the configuration directory can be
+ * any subdirectory of the farm directory.
+ *
+ * Otherwise try finding a matching configuration directory by stripping the
+ * website's hostname from left to right and pathname from right to left. The
+ * first configuration file found will be used; the remaining will ignored.
+ * If no configuration file is found, return the default confdir './conf'.
+ *
+ * @param string $farm
+ *
+ * @return string
+ */
+function farm_confpath($farm) {
+
+    // htaccess based or cli
+    // cli usage example: animal=your_animal bin/indexer.php
+    if(isset($_REQUEST['animal']) || ('cli' == php_sapi_name() && isset($_SERVER['animal']))) {
+        $mode = isset($_REQUEST['animal']) ? 'htaccess' : 'cli';
+        $animal = $mode == 'htaccess' ? $_REQUEST['animal'] : $_SERVER['animal'];
+        // check that $animal is a string and just a directory name and not a path
+        if (!is_string($animal) || strpbrk($animal, '\\/') !== false)
+            nice_die('Sorry! Invalid animal name!');
+        if(!is_dir($farm.'/'.$animal))
+            nice_die("Sorry! This Wiki doesn't exist!");
+        if(!defined('DOKU_FARM')) define('DOKU_FARM', $mode);
+        return $farm.'/'.$animal.'/conf/';
+    }
+
+    // virtual host based
+    $uri = explode('/', $_SERVER['SCRIPT_NAME'] ? $_SERVER['SCRIPT_NAME'] : $_SERVER['SCRIPT_FILENAME']);
+    $server = explode('.', implode('.', array_reverse(explode(':', rtrim($_SERVER['HTTP_HOST'], '.')))));
+    for ($i = count($uri) - 1; $i > 0; $i--) {
+        for ($j = count($server); $j > 0; $j--) {
+            $dir = implode('.', array_slice($server, -$j)) . implode('.', array_slice($uri, 0, $i));
+            if(is_dir("$farm/$dir/conf/")) {
+                if(!defined('DOKU_FARM')) define('DOKU_FARM', 'virtual');
+                return "$farm/$dir/conf/";
+            }
+        }
+    }
+
+    // default conf directory in farm
+    if(is_dir("$farm/default/conf/")) {
+        if(!defined('DOKU_FARM')) define('DOKU_FARM', 'default');
+        return "$farm/default/conf/";
+    }
+    // farmer
+    return DOKU_INC.'conf/';
+}
+
+/* Use default config files and local animal config files */
+$config_cascade = array(
+    'main' => array(
+        'default'   => array(DOKU_INC.'conf/dokuwiki.php'),
+        'local'     => array(DOKU_CONF.'local.php'),
+        'protected' => array(DOKU_CONF.'local.protected.php'),
+    ),
+    'acronyms'  => array(
+        'default'   => array(DOKU_INC.'conf/acronyms.conf'),
+        'local'     => array(DOKU_CONF.'acronyms.local.conf'),
+    ),
+    'entities'  => array(
+        'default'   => array(DOKU_INC.'conf/entities.conf'),
+        'local'     => array(DOKU_CONF.'entities.local.conf'),
+    ),
+    'interwiki' => array(
+        'default'   => array(DOKU_INC.'conf/interwiki.conf'),
+        'local'     => array(DOKU_CONF.'interwiki.local.conf'),
+    ),
+    'license' => array(
+        'default'   => array(DOKU_INC.'conf/license.php'),
+        'local'     => array(DOKU_CONF.'license.local.php'),
+    ),
+    'mediameta' => array(
+        'default'   => array(DOKU_INC.'conf/mediameta.php'),
+        'local'     => array(DOKU_CONF.'mediameta.local.php'),
+    ),
+    'mime'      => array(
+        'default'   => array(DOKU_INC.'conf/mime.conf'),
+        'local'     => array(DOKU_CONF.'mime.local.conf'),
+    ),
+    'scheme'    => array(
+        'default'   => array(DOKU_INC.'conf/scheme.conf'),
+        'local'     => array(DOKU_CONF.'scheme.local.conf'),
+    ),
+    'smileys'   => array(
+        'default'   => array(DOKU_INC.'conf/smileys.conf'),
+        'local'     => array(DOKU_CONF.'smileys.local.conf'),
+    ),
+    'wordblock' => array(
+        'default'   => array(DOKU_INC.'conf/wordblock.conf'),
+        'local'     => array(DOKU_CONF.'wordblock.local.conf'),
+    ),
+    'acl'       => array(
+        'default'   => DOKU_CONF.'acl.auth.php',
+    ),
+    'plainauth.users' => array(
+        'default'   => DOKU_CONF.'users.auth.php',
+    ),
+    'plugins' => array( // needed since Angua
+        'default'   => array(DOKU_INC.'conf/plugins.php'),
+        'local'     => array(DOKU_CONF.'plugins.local.php'),
+        'protected' => array(
+            DOKU_INC.'conf/plugins.required.php',
+            DOKU_CONF.'plugins.protected.php',
+        ),
+    ),
+    'userstyle' => array(
+        'screen'    => array(DOKU_CONF . 'userstyle.css', DOKU_CONF . 'userstyle.less'),
+        'print'     => array(DOKU_CONF . 'userprint.css', DOKU_CONF . 'userprint.less'),
+        'feed'      => array(DOKU_CONF . 'userfeed.css', DOKU_CONF . 'userfeed.less'),
+        'all'       => array(DOKU_CONF . 'userall.css', DOKU_CONF . 'userall.less')
+    ),
+    'userscript' => array(
+        'default'   => array(DOKU_CONF . 'userscript.js')
+    ),
+);
diff --git a/wiki/inc/fetch.functions.php b/wiki/inc/fetch.functions.php
new file mode 100644
index 0000000..b8e75ea
--- /dev/null
+++ b/wiki/inc/fetch.functions.php
@@ -0,0 +1,186 @@
+<?php
+/**
+ * Functions used by lib/exe/fetch.php
+ * (not included by other parts of dokuwiki)
+ */
+
+/**
+ * Set headers and send the file to the client
+ *
+ * The $cache parameter influences how long files may be kept in caches, the $public parameter
+ * influences if this caching may happen in public proxis or in the browser cache only FS#2734
+ *
+ * This function will abort the current script when a 304 is sent or file sending is handled
+ * through x-sendfile
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @author Ben Coburn <btcoburn@silicodon.net>
+ * @author Gerry Weissbach <dokuwiki@gammaproduction.de>
+ *
+ * @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, $orig = null) {
+    global $conf;
+    // send mime headers
+    header("Content-Type: $mime");
+
+    // calculate cache times
+    if($cache == -1) {
+        $maxage  = max($conf['cachetime'], 3600); // cachetime or one hour
+        $expires = time() + $maxage;
+    } else if($cache > 0) {
+        $maxage  = $cache; // given time
+        $expires = time() + $maxage;
+    } else { // $cache == 0
+        $maxage  = 0;
+        $expires = 0; // 1970-01-01
+    }
+
+    // smart http caching headers
+    if($maxage) {
+        if($public) {
+            // cache publically
+            header('Expires: '.gmdate("D, d M Y H:i:s", $expires).' GMT');
+            header('Cache-Control: public, proxy-revalidate, no-transform, max-age='.$maxage);
+        } else {
+            // cache in browser
+            header('Expires: '.gmdate("D, d M Y H:i:s", $expires).' GMT');
+            header('Cache-Control: private, no-transform, max-age='.$maxage);
+        }
+    } else {
+        // no cache at all
+        header('Expires: Thu, 01 Jan 1970 00:00:00 GMT');
+        header('Cache-Control: no-cache, no-transform');
+    }
+
+    //send important headers first, script stops here if '304 Not Modified' response
+    $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;'.rfc2231_encode('filename', utf8_basename($orig)).';');
+    } else {
+        header('Content-Disposition: inline;'.rfc2231_encode('filename', utf8_basename($orig)).';');
+    }
+
+    //use x-sendfile header to pass the delivery to compatible webservers
+    http_sendfile($file);
+
+    // send file contents
+    $fp = @fopen($file, "rb");
+    if($fp) {
+        http_rangeRequest($fp, filesize($file), $mime);
+    } else {
+        http_status(500);
+        print "Could not read $file - bad permissions?";
+    }
+}
+
+/**
+ * Try an rfc2231 compatible encoding. This ensures correct
+ * interpretation of filenames outside of the ASCII set.
+ * This seems to be needed for file names with e.g. umlauts that
+ * would otherwise decode wrongly in IE.
+ *
+ * There is no additional checking, just the encoding and setting the key=value for usage in headers
+ *
+ * @author Gerry Weissbach <gerry.w@gammaproduction.de>
+ * @param string $name      name of the field to be set in the header() call
+ * @param string $value     value of the field to be set in the header() call
+ * @param string $charset   used charset for the encoding of value
+ * @param string $lang      language used.
+ * @return string           in the format " name=value" for values WITHOUT special characters
+ * @return string           in the format " name*=charset'lang'value" for values WITH special characters
+ */
+function rfc2231_encode($name, $value, $charset='utf-8', $lang='en') {
+    $internal = preg_replace_callback('/[\x00-\x20*\'%()<>@,;:\\\\"\/[\]?=\x80-\xFF]/', function($match) { return rawurlencode($match[0]); }, $value);
+    if ( $value != $internal ) {
+        return ' '.$name.'*='.$charset."'".$lang."'".$internal;
+    } else {
+        return ' '.$name.'="'.$value.'"';
+    }
+}
+
+/**
+ * Check for media for preconditions and return correct status code
+ *
+ * READ: MEDIA, MIME, EXT, CACHE
+ * WRITE: MEDIA, FILE, array( STATUS, STATUSMESSAGE )
+ *
+ * @author Gerry Weissbach <gerry.w@gammaproduction.de>
+ *
+ * @param string $media  reference to the media id
+ * @param string $file   reference to the file variable
+ * @param string $rev
+ * @param int    $width
+ * @param int    $height
+ * @return array as array(STATUS, STATUSMESSAGE)
+ */
+function checkFileStatus(&$media, &$file, $rev = '', $width=0, $height=0) {
+    global $MIME, $EXT, $CACHE, $INPUT;
+
+    //media to local file
+    if(media_isexternal($media)) {
+        //check token for external image and additional for resized and cached images
+        if(media_get_token($media, $width, $height) !== $INPUT->str('tok')) {
+            return array(412, 'Precondition Failed');
+        }
+        //handle external images
+        if(strncmp($MIME, 'image/', 6) == 0) $file = media_get_from_URL($media, $EXT, $CACHE);
+        if(!$file) {
+            //download failed - redirect to original URL
+            return array(302, $media);
+        }
+    } else {
+        $media = cleanID($media);
+        if(empty($media)) {
+            return array(400, 'Bad request');
+        }
+        // check token for resized images
+        if (($width || $height) && media_get_token($media, $width, $height) !== $INPUT->str('tok')) {
+            return array(412, 'Precondition Failed');
+        }
+
+        //check permissions (namespace only)
+        if(auth_quickaclcheck(getNS($media).':X') < AUTH_READ) {
+            return array(403, 'Forbidden');
+        }
+        $file = mediaFN($media, $rev);
+    }
+
+    //check file existance
+    if(!file_exists($file)) {
+        return array(404, 'Not Found');
+    }
+
+    return array(200, null);
+}
+
+/**
+ * Returns the wanted cachetime in seconds
+ *
+ * Resolves named constants
+ *
+ * @author  Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param string $cache
+ * @return int cachetime in seconds
+ */
+function calc_cache($cache) {
+    global $conf;
+
+    if(strtolower($cache) == 'nocache') return 0; //never cache
+    if(strtolower($cache) == 'recache') return $conf['cachetime']; //use standard cache
+    return -1; //cache endless
+}
diff --git a/wiki/inc/form.php b/wiki/inc/form.php
new file mode 100644
index 0000000..7afb0ba
--- /dev/null
+++ b/wiki/inc/form.php
@@ -0,0 +1,1098 @@
+<?php
+/**
+ * DokuWiki XHTML Form
+ *
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author     Tom N Harris <tnharris@whoopdedo.org>
+ */
+
+if(!defined('DOKU_INC')) die('meh.');
+
+/**
+ * Class for creating simple HTML forms.
+ *
+ * The forms is built from a list of pseudo-tags (arrays with expected keys).
+ * Every pseudo-tag must have the key '_elem' set to the name of the element.
+ * When printed, the form class calls functions named 'form_$type' for each
+ * element it contains.
+ *
+ * Standard practice is for non-attribute keys in a pseudo-element to start
+ * with '_'. Other keys are HTML attributes that will be included in the element
+ * tag. That way, the element output functions can pass the pseudo-element
+ * directly to buildAttributes.
+ *
+ * See the form_make* functions later in this file.
+ *
+ * @author Tom N Harris <tnharris@whoopdedo.org>
+ */
+class Doku_Form {
+
+    // Form id attribute
+    public $params = array();
+
+    // Draw a border around form fields.
+    // Adds <fieldset></fieldset> around the elements
+    public $_infieldset = false;
+
+    // Hidden form fields.
+    public $_hidden = array();
+
+    // Array of pseudo-tags
+    public $_content = array();
+
+    /**
+     * Constructor
+     *
+     * Sets parameters and autoadds a security token. The old calling convention
+     * 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 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 <tnharris@whoopdedo.org>
+     */
+    function __construct($params, $action=false, $method=false, $enctype=false) {
+        if(!is_array($params)) {
+            $this->params = array('id' => $params);
+            if ($action !== false) $this->params['action'] = $action;
+            if ($method !== false) $this->params['method'] = strtolower($method);
+            if ($enctype !== false) $this->params['enctype'] = $enctype;
+        } else {
+            $this->params = $params;
+        }
+
+        if (!isset($this->params['method'])) {
+            $this->params['method'] = 'post';
+        } else {
+            $this->params['method'] = strtolower($this->params['method']);
+        }
+
+        if (!isset($this->params['action'])) {
+            $this->params['action'] = '';
+        }
+
+        $this->addHidden('sectok', getSecurityToken());
+    }
+
+    /**
+     * startFieldset
+     *
+     * Add <fieldset></fieldset> tags around fields.
+     * Usually results in a border drawn around the form.
+     *
+     * @param   string  $legend Label that will be printed with the border.
+     *
+     * @author  Tom N Harris <tnharris@whoopdedo.org>
+     */
+    function startFieldset($legend) {
+        if ($this->_infieldset) {
+            $this->addElement(array('_elem'=>'closefieldset'));
+        }
+        $this->addElement(array('_elem'=>'openfieldset', '_legend'=>$legend));
+        $this->_infieldset = true;
+    }
+
+    /**
+     * endFieldset
+     *
+     * @author  Tom N Harris <tnharris@whoopdedo.org>
+     */
+    function endFieldset() {
+        if ($this->_infieldset) {
+            $this->addElement(array('_elem'=>'closefieldset'));
+        }
+        $this->_infieldset = false;
+    }
+
+    /**
+     * addHidden
+     *
+     * Adds a name/value pair as a hidden field.
+     * The value of the field (but not the name) will be passed to
+     * formText() before printing.
+     *
+     * @param   string  $name   Field name.
+     * @param   string  $value  Field value. If null, remove a previously added field.
+     *
+     * @author  Tom N Harris <tnharris@whoopdedo.org>
+     */
+    function addHidden($name, $value) {
+        if (is_null($value))
+            unset($this->_hidden[$name]);
+        else
+            $this->_hidden[$name] = $value;
+    }
+
+    /**
+     * addElement
+     *
+     * Appends a content element to the form.
+     * The element can be either a pseudo-tag or string.
+     * If string, it is printed without escaping special chars.   *
+     *
+     * @param   string|array  $elem   Pseudo-tag or string to add to the form.
+     *
+     * @author  Tom N Harris <tnharris@whoopdedo.org>
+     */
+    function addElement($elem) {
+        $this->_content[] = $elem;
+    }
+
+    /**
+     * insertElement
+     *
+     * Inserts a content element at a position.
+     *
+     * @param   string       $pos  0-based index where the element will be inserted.
+     * @param   string|array $elem Pseudo-tag or string to add to the form.
+     *
+     * @author  Tom N Harris <tnharris@whoopdedo.org>
+     */
+    function insertElement($pos, $elem) {
+        array_splice($this->_content, $pos, 0, array($elem));
+    }
+
+    /**
+     * replaceElement
+     *
+     * Replace with NULL to remove an element.
+     *
+     * @param   int          $pos  0-based index the element will be placed at.
+     * @param   string|array $elem Pseudo-tag or string to add to the form.
+     *
+     * @author  Tom N Harris <tnharris@whoopdedo.org>
+     */
+    function replaceElement($pos, $elem) {
+        $rep = array();
+        if (!is_null($elem)) $rep[] = $elem;
+        array_splice($this->_content, $pos, 1, $rep);
+    }
+
+    /**
+     * findElementByType
+     *
+     * Gets the position of the first of a type of element.
+     *
+     * @param   string  $type   Element type to look for.
+     * @return  int|false     position of element if found, otherwise false
+     *
+     * @author  Tom N Harris <tnharris@whoopdedo.org>
+     */
+    function findElementByType($type) {
+        foreach ($this->_content as $pos=>$elem) {
+            if (is_array($elem) && $elem['_elem'] == $type)
+                return $pos;
+        }
+        return false;
+    }
+
+    /**
+     * findElementById
+     *
+     * Gets the position of the element with an ID attribute.
+     *
+     * @param   string  $id     ID of the element to find.
+     * @return  int|false     position of element if found, otherwise false
+     *
+     * @author  Tom N Harris <tnharris@whoopdedo.org>
+     */
+    function findElementById($id) {
+        foreach ($this->_content as $pos=>$elem) {
+            if (is_array($elem) && isset($elem['id']) && $elem['id'] == $id)
+                return $pos;
+        }
+        return false;
+    }
+
+    /**
+     * findElementByAttribute
+     *
+     * Gets the position of the first element with a matching attribute value.
+     *
+     * @param   string  $name   Attribute name.
+     * @param   string  $value  Attribute value.
+     * @return  int|false     position of element if found, otherwise false
+     *
+     * @author  Tom N Harris <tnharris@whoopdedo.org>
+     */
+    function findElementByAttribute($name, $value) {
+        foreach ($this->_content as $pos=>$elem) {
+            if (is_array($elem) && isset($elem[$name]) && $elem[$name] == $value)
+                return $pos;
+        }
+        return false;
+    }
+
+    /**
+     * getElementAt
+     *
+     * Returns a reference to the element at a position.
+     * A position out-of-bounds will return either the
+     * first (underflow) or last (overflow) element.
+     *
+     * @param   int     $pos    0-based index
+     * @return  array reference  pseudo-element
+     *
+     * @author  Tom N Harris <tnharris@whoopdedo.org>
+     */
+    function &getElementAt($pos) {
+        if ($pos < 0) $pos = count($this->_content) + $pos;
+        if ($pos < 0) $pos = 0;
+        if ($pos >= count($this->_content)) $pos = count($this->_content) - 1;
+        return $this->_content[$pos];
+    }
+
+    /**
+     * Return the assembled HTML for the form.
+     *
+     * Each element in the form will be passed to a function named
+     * 'form_$type'. The function should return the HTML to be printed.
+     *
+     * @author  Tom N Harris <tnharris@whoopdedo.org>
+     *
+     * @return string html of the form
+     */
+    function getForm() {
+        global $lang;
+        $form = '';
+        $this->params['accept-charset'] = $lang['encoding'];
+        $form .= '<form ' . buildAttributes($this->params,false) . '><div class="no">' . DOKU_LF;
+        if (!empty($this->_hidden)) {
+            foreach ($this->_hidden as $name=>$value)
+                $form .= form_hidden(array('name'=>$name, 'value'=>$value));
+        }
+        foreach ($this->_content as $element) {
+            if (is_array($element)) {
+                $elem_type = $element['_elem'];
+                if (function_exists('form_'.$elem_type)) {
+                    $form .= call_user_func('form_'.$elem_type, $element).DOKU_LF;
+                }
+            } else {
+                $form .= $element;
+            }
+        }
+        if ($this->_infieldset) $form .= form_closefieldset().DOKU_LF;
+        $form .= '</div></form>'.DOKU_LF;
+
+        return $form;
+    }
+
+    /**
+     * Print the assembled form
+     *
+     * wraps around getForm()
+     */
+    function printForm(){
+        echo $this->getForm();
+    }
+
+    /**
+     * Add a radio set
+     *
+     * This function adds a set of radio buttons to the form. If $_POST[$name]
+     * is set, this radio is preselected, else the first radio button.
+     *
+     * @param string    $name    The HTML field name
+     * @param array     $entries An array of entries $value => $caption
+     *
+     * @author Adrian Lang <lang@cosmocode.de>
+     */
+
+    function addRadioSet($name, $entries) {
+        global $INPUT;
+        $value = (array_key_exists($INPUT->post->str($name), $entries)) ?
+                 $INPUT->str($name) : key($entries);
+        foreach($entries as $val => $cap) {
+            $data = ($value === $val) ? array('checked' => 'checked') : array();
+            $this->addElement(form_makeRadioField($name, $val, $cap, '', '', $data));
+        }
+    }
+
+}
+
+/**
+ * form_makeTag
+ *
+ * Create a form element for a non-specific empty tag.
+ *
+ * @param   string  $tag    Tag name.
+ * @param   array   $attrs  Optional attributes.
+ * @return  array   pseudo-tag
+ *
+ * @author  Tom N Harris <tnharris@whoopdedo.org>
+ */
+function form_makeTag($tag, $attrs=array()) {
+    $elem = array('_elem'=>'tag', '_tag'=>$tag);
+    return array_merge($elem, $attrs);
+}
+
+/**
+ * form_makeOpenTag
+ *
+ * Create a form element for a non-specific opening tag.
+ * Remember to put a matching close tag after this as well.
+ *
+ * @param   string  $tag    Tag name.
+ * @param   array   $attrs  Optional attributes.
+ * @return  array   pseudo-tag
+ *
+ * @author  Tom N Harris <tnharris@whoopdedo.org>
+ */
+function form_makeOpenTag($tag, $attrs=array()) {
+    $elem = array('_elem'=>'opentag', '_tag'=>$tag);
+    return array_merge($elem, $attrs);
+}
+
+/**
+ * form_makeCloseTag
+ *
+ * Create a form element for a non-specific closing tag.
+ * Careless use of this will result in invalid XHTML.
+ *
+ * @param   string  $tag    Tag name.
+ * @return  array   pseudo-tag
+ *
+ * @author  Tom N Harris <tnharris@whoopdedo.org>
+ */
+function form_makeCloseTag($tag) {
+    return array('_elem'=>'closetag', '_tag'=>$tag);
+}
+
+/**
+ * form_makeWikiText
+ *
+ * Create a form element for a textarea containing wiki text.
+ * Only one wikitext element is allowed on a page. It will have
+ * a name of 'wikitext' and id 'wiki__text'. The text will
+ * be passed to formText() before printing.
+ *
+ * @param   string  $text   Text to fill the field with.
+ * @param   array   $attrs  Optional attributes.
+ * @return  array   pseudo-tag
+ *
+ * @author  Tom N Harris <tnharris@whoopdedo.org>
+ */
+function form_makeWikiText($text, $attrs=array()) {
+    $elem = array('_elem'=>'wikitext', '_text'=>$text,
+                        'class'=>'edit', 'cols'=>'80', 'rows'=>'10');
+    return array_merge($elem, $attrs);
+}
+
+/**
+ * form_makeButton
+ *
+ * Create a form element for an action button.
+ * A title will automatically be generated using the value and
+ * accesskey attributes, unless you provide one.
+ *
+ * @param   string  $type   Type attribute. 'submit' or 'cancel'
+ * @param   string  $act    Wiki action of the button, will be used as the do= parameter
+ * @param   string  $value  (optional) Displayed label. Uses $act if not provided.
+ * @param   array   $attrs  Optional attributes.
+ * @return  array   pseudo-tag
+ *
+ * @author  Tom N Harris <tnharris@whoopdedo.org>
+ */
+function form_makeButton($type, $act, $value='', $attrs=array()) {
+    if ($value == '') $value = $act;
+    $elem = array('_elem'=>'button', 'type'=>$type, '_action'=>$act,
+                        'value'=>$value);
+    if (!empty($attrs['accesskey']) && empty($attrs['title'])) {
+        $attrs['title'] = $value . ' ['.strtoupper($attrs['accesskey']).']';
+    }
+    return array_merge($elem, $attrs);
+}
+
+/**
+ * form_makeField
+ *
+ * Create a form element for a labelled input element.
+ * The label text will be printed before the input.
+ *
+ * @param   string  $type   Type attribute of input.
+ * @param   string  $name   Name attribute of the input.
+ * @param   string  $value  (optional) Default value.
+ * @param   string  $class  Class attribute of the label. If this is 'block',
+ *                          then a line break will be added after the field.
+ * @param   string  $label  Label that will be printed before the input.
+ * @param   string  $id     ID attribute of the input. If set, the label will
+ *                          reference it with a 'for' attribute.
+ * @param   array   $attrs  Optional attributes.
+ * @return  array   pseudo-tag
+ *
+ * @author  Tom N Harris <tnharris@whoopdedo.org>
+ */
+function form_makeField($type, $name, $value='', $label=null, $id='', $class='', $attrs=array()) {
+    if (is_null($label)) $label = $name;
+    $elem = array('_elem'=>'field', '_text'=>$label, '_class'=>$class,
+                        'type'=>$type, 'id'=>$id, 'name'=>$name, 'value'=>$value);
+    return array_merge($elem, $attrs);
+}
+
+/**
+ * form_makeFieldRight
+ *
+ * Create a form element for a labelled input element.
+ * The label text will be printed after the input.
+ *
+ * @see     form_makeField
+ * @author  Tom N Harris <tnharris@whoopdedo.org>
+ *
+ * @param string $type
+ * @param string $name
+ * @param string $value
+ * @param null|string $label
+ * @param string $id
+ * @param string $class
+ * @param array $attrs
+ *
+ * @return array
+ */
+function form_makeFieldRight($type, $name, $value='', $label=null, $id='', $class='', $attrs=array()) {
+    if (is_null($label)) $label = $name;
+    $elem = array('_elem'=>'fieldright', '_text'=>$label, '_class'=>$class,
+                        'type'=>$type, 'id'=>$id, 'name'=>$name, 'value'=>$value);
+    return array_merge($elem, $attrs);
+}
+
+/**
+ * form_makeTextField
+ *
+ * Create a form element for a text input element with label.
+ *
+ * @see     form_makeField
+ * @author  Tom N Harris <tnharris@whoopdedo.org>
+ *
+ * @param string $name
+ * @param string $value
+ * @param null|string $label
+ * @param string $id
+ * @param string $class
+ * @param array $attrs
+ *
+ * @return array
+ */
+function form_makeTextField($name, $value='', $label=null, $id='', $class='', $attrs=array()) {
+    if (is_null($label)) $label = $name;
+    $elem = array('_elem'=>'textfield', '_text'=>$label, '_class'=>$class,
+                        'id'=>$id, 'name'=>$name, 'value'=>$value, 'class'=>'edit');
+    return array_merge($elem, $attrs);
+}
+
+/**
+ * form_makePasswordField
+ *
+ * Create a form element for a password input element with label.
+ * Password elements have no default value, for obvious reasons.
+ *
+ * @see     form_makeField
+ * @author  Tom N Harris <tnharris@whoopdedo.org>
+ *
+ * @param string $name
+ * @param null|string $label
+ * @param string $id
+ * @param string $class
+ * @param array $attrs
+ *
+ * @return array
+ */
+function form_makePasswordField($name, $label=null, $id='', $class='', $attrs=array()) {
+    if (is_null($label)) $label = $name;
+    $elem = array('_elem'=>'passwordfield', '_text'=>$label, '_class'=>$class,
+                        'id'=>$id, 'name'=>$name, 'class'=>'edit');
+    return array_merge($elem, $attrs);
+}
+
+/**
+ * form_makeFileField
+ *
+ * Create a form element for a file input element with label
+ *
+ * @see     form_makeField
+ * @author  Michael Klier <chi@chimeric.de>
+ *
+ * @param string $name
+ * @param null|string $label
+ * @param string $id
+ * @param string $class
+ * @param array $attrs
+ *
+ * @return array
+ */
+function form_makeFileField($name, $label=null, $id='', $class='', $attrs=array()) {
+    if (is_null($label)) $label = $name;
+    $elem = array('_elem'=>'filefield', '_text'=>$label, '_class'=>$class,
+                        'id'=>$id, 'name'=>$name, 'class'=>'edit');
+    return array_merge($elem, $attrs);
+}
+
+/**
+ * form_makeCheckboxField
+ *
+ * Create a form element for a checkbox input element with label.
+ * If $value is an array, a hidden field with the same name and the value
+ * $value[1] is constructed as well.
+ *
+ * @see     form_makeFieldRight
+ * @author  Tom N Harris <tnharris@whoopdedo.org>
+ *
+ * @param string $name
+ * @param string $value
+ * @param null|string $label
+ * @param string $id
+ * @param string $class
+ * @param array $attrs
+ *
+ * @return array
+ */
+function form_makeCheckboxField($name, $value='1', $label=null, $id='', $class='', $attrs=array()) {
+    if (is_null($label)) $label = $name;
+    if (is_null($value) || $value=='') $value='0';
+    $elem = array('_elem'=>'checkboxfield', '_text'=>$label, '_class'=>$class,
+                        'id'=>$id, 'name'=>$name, 'value'=>$value);
+    return array_merge($elem, $attrs);
+}
+
+/**
+ * form_makeRadioField
+ *
+ * Create a form element for a radio button input element with label.
+ *
+ * @see     form_makeFieldRight
+ * @author  Tom N Harris <tnharris@whoopdedo.org>
+ *
+ * @param string $name
+ * @param string $value
+ * @param null|string $label
+ * @param string $id
+ * @param string $class
+ * @param array $attrs
+ *
+ * @return array
+ */
+function form_makeRadioField($name, $value='1', $label=null, $id='', $class='', $attrs=array()) {
+    if (is_null($label)) $label = $name;
+    if (is_null($value) || $value=='') $value='0';
+    $elem = array('_elem'=>'radiofield', '_text'=>$label, '_class'=>$class,
+                        'id'=>$id, 'name'=>$name, 'value'=>$value);
+    return array_merge($elem, $attrs);
+}
+
+/**
+ * form_makeMenuField
+ *
+ * Create a form element for a drop-down menu with label.
+ * The list of values can be strings, arrays of (value,text),
+ * or an associative array with the values as keys and labels as values.
+ * An item is selected by supplying its value or integer index.
+ * If the list of values is an associative array, the selected item must be
+ * a string.
+ *
+ * @author  Tom N Harris <tnharris@whoopdedo.org>
+ *
+ * @param string           $name     Name attribute of the input.
+ * @param string[]|array[] $values   The list of values can be strings, arrays of (value,text),
+ *                                   or an associative array with the values as keys and labels as values.
+ * @param string|int       $selected default selected value, string or index number
+ * @param string           $class    Class attribute of the label. If this is 'block',
+ *                                   then a line break will be added after the field.
+ * @param string           $label    Label that will be printed before the input.
+ * @param string           $id       ID attribute of the input. If set, the label will
+ *                                   reference it with a 'for' attribute.
+ * @param array            $attrs    Optional attributes.
+ * @return array   pseudo-tag
+ */
+function form_makeMenuField($name, $values, $selected='', $label=null, $id='', $class='', $attrs=array()) {
+    if (is_null($label)) $label = $name;
+    $options = array();
+    reset($values);
+    // FIXME: php doesn't know the difference between a string and an integer
+    if (is_string(key($values))) {
+        foreach ($values as $val=>$text) {
+            $options[] = array($val,$text, (!is_null($selected) && $val==$selected));
+        }
+    } else {
+        if (is_integer($selected)) $selected = $values[$selected];
+        foreach ($values as $val) {
+            if (is_array($val))
+                @list($val,$text) = $val;
+            else
+                $text = null;
+            $options[] = array($val,$text,$val===$selected);
+        }
+    }
+    $elem = array('_elem'=>'menufield', '_options'=>$options, '_text'=>$label, '_class'=>$class,
+                        'id'=>$id, 'name'=>$name);
+    return array_merge($elem, $attrs);
+}
+
+/**
+ * form_makeListboxField
+ *
+ * Create a form element for a list box with label.
+ * The list of values can be strings, arrays of (value,text),
+ * or an associative array with the values as keys and labels as values.
+ * Items are selected by supplying its value or an array of values.
+ *
+ * @author  Tom N Harris <tnharris@whoopdedo.org>
+ *
+ * @param string           $name     Name attribute of the input.
+ * @param string[]|array[] $values   The list of values can be strings, arrays of (value,text),
+ *                                   or an associative array with the values as keys and labels as values.
+ * @param array|string     $selected value or array of values of the items that need to be selected
+ * @param string           $class    Class attribute of the label. If this is 'block',
+ *                                   then a line break will be added after the field.
+ * @param string           $label    Label that will be printed before the input.
+ * @param string           $id       ID attribute of the input. If set, the label will
+ *                                   reference it with a 'for' attribute.
+ * @param array            $attrs    Optional attributes.
+ * @return array   pseudo-tag
+ */
+function form_makeListboxField($name, $values, $selected='', $label=null, $id='', $class='', $attrs=array()) {
+    if (is_null($label)) $label = $name;
+    $options = array();
+    reset($values);
+    if (is_null($selected) || $selected == '') {
+        $selected = array();
+    } 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) {
+            $options[] = array($val,$text,in_array($val,$selected));
+        }
+    } else {
+        foreach ($values as $val) {
+            $disabled = false;
+            if (is_array($val)) {
+                @list($val,$text,$disabled) = $val;
+            } else {
+                $text = null;
+            }
+            $options[] = array($val,$text,in_array($val,$selected),$disabled);
+        }
+    }
+    $elem = array('_elem'=>'listboxfield', '_options'=>$options, '_text'=>$label, '_class'=>$class,
+                        'id'=>$id, 'name'=>$name);
+    return array_merge($elem, $attrs);
+}
+
+/**
+ * form_tag
+ *
+ * Print the HTML for a generic empty tag.
+ * Requires '_tag' key with name of the tag.
+ * Attributes are passed to buildAttributes()
+ *
+ * @author  Tom N Harris <tnharris@whoopdedo.org>
+ *
+ * @param array $attrs attributes
+ * @return string html of tag
+ */
+function form_tag($attrs) {
+    return '<'.$attrs['_tag'].' '.buildAttributes($attrs,true).'/>';
+}
+
+/**
+ * form_opentag
+ *
+ * Print the HTML for a generic opening tag.
+ * Requires '_tag' key with name of the tag.
+ * Attributes are passed to buildAttributes()
+ *
+ * @author  Tom N Harris <tnharris@whoopdedo.org>
+ *
+ * @param array $attrs attributes
+ * @return string html of tag
+ */
+function form_opentag($attrs) {
+    return '<'.$attrs['_tag'].' '.buildAttributes($attrs,true).'>';
+}
+
+/**
+ * form_closetag
+ *
+ * Print the HTML for a generic closing tag.
+ * Requires '_tag' key with name of the tag.
+ * There are no attributes.
+ *
+ * @author  Tom N Harris <tnharris@whoopdedo.org>
+ *
+ * @param array $attrs attributes
+ * @return string html of tag
+ */
+function form_closetag($attrs) {
+    return '</'.$attrs['_tag'].'>';
+}
+
+/**
+ * form_openfieldset
+ *
+ * Print the HTML for an opening fieldset tag.
+ * Uses the '_legend' key.
+ * Attributes are passed to buildAttributes()
+ *
+ * @author  Tom N Harris <tnharris@whoopdedo.org>
+ *
+ * @param array $attrs attributes
+ * @return string html
+ */
+function form_openfieldset($attrs) {
+    $s = '<fieldset '.buildAttributes($attrs,true).'>';
+    if (!is_null($attrs['_legend'])) $s .= '<legend>'.$attrs['_legend'].'</legend>';
+    return $s;
+}
+
+/**
+ * form_closefieldset
+ *
+ * Print the HTML for a closing fieldset tag.
+ * There are no attributes.
+ *
+ * @author  Tom N Harris <tnharris@whoopdedo.org>
+ *
+ * @return string html
+ */
+function form_closefieldset() {
+    return '</fieldset>';
+}
+
+/**
+ * form_hidden
+ *
+ * Print the HTML for a hidden input element.
+ * Uses only 'name' and 'value' attributes.
+ * Value is passed to formText()
+ *
+ * @author  Tom N Harris <tnharris@whoopdedo.org>
+ *
+ * @param array $attrs attributes
+ * @return string html
+ */
+function form_hidden($attrs) {
+    return '<input type="hidden" name="'.$attrs['name'].'" value="'.formText($attrs['value']).'" />';
+}
+
+/**
+ * form_wikitext
+ *
+ * Print the HTML for the wiki textarea.
+ * Requires '_text' with default text of the field.
+ * Text will be passed to formText(), attributes to buildAttributes()
+ *
+ * @author  Tom N Harris <tnharris@whoopdedo.org>
+ *
+ * @param array $attrs attributes
+ * @return string html
+ */
+function form_wikitext($attrs) {
+    // mandatory attributes
+    unset($attrs['name']);
+    unset($attrs['id']);
+    return '<textarea name="wikitext" id="wiki__text" dir="auto" '
+                 .buildAttributes($attrs,true).'>'.DOKU_LF
+                 .formText($attrs['_text'])
+                 .'</textarea>';
+}
+
+/**
+ * form_button
+ *
+ * Print the HTML for a form button.
+ * If '_action' is set, the button name will be "do[_action]".
+ * Other attributes are passed to buildAttributes()
+ *
+ * @author  Tom N Harris <tnharris@whoopdedo.org>
+ *
+ * @param array $attrs attributes
+ * @return string html
+ */
+function form_button($attrs) {
+    $p = (!empty($attrs['_action'])) ? 'name="do['.$attrs['_action'].']" ' : '';
+    $value = $attrs['value'];
+    unset($attrs['value']);
+    return '<button '.$p.buildAttributes($attrs,true).'>'.$value.'</button>';
+}
+
+/**
+ * form_field
+ *
+ * Print the HTML for a form input field.
+ *   _class : class attribute used on the label tag
+ *   _text  : Text to display before the input. Not escaped.
+ * Other attributes are passed to buildAttributes() for the input tag.
+ *
+ * @author  Tom N Harris <tnharris@whoopdedo.org>
+ *
+ * @param array $attrs attributes
+ * @return string html
+ */
+function form_field($attrs) {
+    $s = '<label';
+    if ($attrs['_class']) $s .= ' class="'.$attrs['_class'].'"';
+    if (!empty($attrs['id'])) $s .= ' for="'.$attrs['id'].'"';
+    $s .= '><span>'.$attrs['_text'].'</span>';
+    $s .= ' <input '.buildAttributes($attrs,true).' /></label>';
+    if (preg_match('/(^| )block($| )/', $attrs['_class']))
+        $s .= '<br />';
+    return $s;
+}
+
+/**
+ * form_fieldright
+ *
+ * Print the HTML for a form input field. (right-aligned)
+ *   _class : class attribute used on the label tag
+ *   _text  : Text to display after the input. Not escaped.
+ * Other attributes are passed to buildAttributes() for the input tag.
+ *
+ * @author  Tom N Harris <tnharris@whoopdedo.org>
+ *
+ * @param array $attrs attributes
+ * @return string html
+ */
+function form_fieldright($attrs) {
+    $s = '<label';
+    if ($attrs['_class']) $s .= ' class="'.$attrs['_class'].'"';
+    if (!empty($attrs['id'])) $s .= ' for="'.$attrs['id'].'"';
+    $s .= '><input '.buildAttributes($attrs,true).' />';
+    $s .= ' <span>'.$attrs['_text'].'</span></label>';
+    if (preg_match('/(^| )block($| )/', $attrs['_class']))
+        $s .= '<br />';
+    return $s;
+}
+
+/**
+ * form_textfield
+ *
+ * Print the HTML for a text input field.
+ *   _class : class attribute used on the label tag
+ *   _text  : Text to display before the input. Not escaped.
+ * Other attributes are passed to buildAttributes() for the input tag.
+ *
+ * @author  Tom N Harris <tnharris@whoopdedo.org>
+ *
+ * @param array $attrs attributes
+ * @return string html
+ */
+function form_textfield($attrs) {
+    // mandatory attributes
+    unset($attrs['type']);
+    $s = '<label';
+    if ($attrs['_class']) $s .= ' class="'.$attrs['_class'].'"';
+    if (!empty($attrs['id'])) $s .= ' for="'.$attrs['id'].'"';
+    $s .= '><span>'.$attrs['_text'].'</span> ';
+    $s .= '<input type="text" '.buildAttributes($attrs,true).' /></label>';
+    if (preg_match('/(^| )block($| )/', $attrs['_class']))
+        $s .= '<br />';
+    return $s;
+}
+
+/**
+ * form_passwordfield
+ *
+ * Print the HTML for a password input field.
+ *   _class : class attribute used on the label tag
+ *   _text  : Text to display before the input. Not escaped.
+ * Other attributes are passed to buildAttributes() for the input tag.
+ *
+ * @author  Tom N Harris <tnharris@whoopdedo.org>
+ *
+ * @param array $attrs attributes
+ * @return string html
+ */
+function form_passwordfield($attrs) {
+    // mandatory attributes
+    unset($attrs['type']);
+    $s = '<label';
+    if ($attrs['_class']) $s .= ' class="'.$attrs['_class'].'"';
+    if (!empty($attrs['id'])) $s .= ' for="'.$attrs['id'].'"';
+    $s .= '><span>'.$attrs['_text'].'</span> ';
+    $s .= '<input type="password" '.buildAttributes($attrs,true).' /></label>';
+    if (preg_match('/(^| )block($| )/', $attrs['_class']))
+        $s .= '<br />';
+    return $s;
+}
+
+/**
+ * form_filefield
+ *
+ * Print the HTML for a file input field.
+ *   _class     : class attribute used on the label tag
+ *   _text      : Text to display before the input. Not escaped
+ *   _maxlength : Allowed size in byte
+ *   _accept    : Accepted mime-type
+ * Other attributes are passed to buildAttributes() for the input tag
+ *
+ * @author  Michael Klier <chi@chimeric.de>
+ *
+ * @param array $attrs attributes
+ * @return string html
+ */
+function form_filefield($attrs) {
+    $s = '<label';
+    if ($attrs['_class']) $s .= ' class="'.$attrs['_class'].'"';
+    if (!empty($attrs['id'])) $s .= ' for="'.$attrs['id'].'"';
+    $s .= '><span>'.$attrs['_text'].'</span> ';
+    $s .= '<input type="file" '.buildAttributes($attrs,true);
+    if (!empty($attrs['_maxlength'])) $s .= ' maxlength="'.$attrs['_maxlength'].'"';
+    if (!empty($attrs['_accept'])) $s .= ' accept="'.$attrs['_accept'].'"';
+    $s .= ' /></label>';
+    if (preg_match('/(^| )block($| )/', $attrs['_class']))
+        $s .= '<br />';
+    return $s;
+}
+
+/**
+ * form_checkboxfield
+ *
+ * Print the HTML for a checkbox input field.
+ *   _class : class attribute used on the label tag
+ *   _text  : Text to display after the input. Not escaped.
+ * Other attributes are passed to buildAttributes() for the input tag.
+ * If value is an array, a hidden field with the same name and the value
+ * $attrs['value'][1] is constructed as well.
+ *
+ * @author  Tom N Harris <tnharris@whoopdedo.org>
+ *
+ * @param array $attrs attributes
+ * @return string html
+ */
+function form_checkboxfield($attrs) {
+    // mandatory attributes
+    unset($attrs['type']);
+    $s = '<label';
+    if ($attrs['_class']) $s .= ' class="'.$attrs['_class'].'"';
+    if (!empty($attrs['id'])) $s .= ' for="'.$attrs['id'].'"';
+    $s .= '>';
+    if (is_array($attrs['value'])) {
+        echo '<input type="hidden" name="' . hsc($attrs['name']) .'"'
+                 . ' value="' . hsc($attrs['value'][1]) . '" />';
+        $attrs['value'] = $attrs['value'][0];
+    }
+    $s .= '<input type="checkbox" '.buildAttributes($attrs,true).' />';
+    $s .= ' <span>'.$attrs['_text'].'</span></label>';
+    if (preg_match('/(^| )block($| )/', $attrs['_class']))
+        $s .= '<br />';
+    return $s;
+}
+
+/**
+ * form_radiofield
+ *
+ * Print the HTML for a radio button input field.
+ *   _class : class attribute used on the label tag
+ *   _text  : Text to display after the input. Not escaped.
+ * Other attributes are passed to buildAttributes() for the input tag.
+ *
+ * @author  Tom N Harris <tnharris@whoopdedo.org>
+ *
+ * @param array $attrs attributes
+ * @return string html
+ */
+function form_radiofield($attrs) {
+    // mandatory attributes
+    unset($attrs['type']);
+    $s = '<label';
+    if ($attrs['_class']) $s .= ' class="'.$attrs['_class'].'"';
+    if (!empty($attrs['id'])) $s .= ' for="'.$attrs['id'].'"';
+    $s .= '><input type="radio" '.buildAttributes($attrs,true).' />';
+    $s .= ' <span>'.$attrs['_text'].'</span></label>';
+    if (preg_match('/(^| )block($| )/', $attrs['_class']))
+        $s .= '<br />';
+    return $s;
+}
+
+/**
+ * form_menufield
+ *
+ * Print the HTML for a drop-down menu.
+ *   _options : Array of (value,text,selected) for the menu.
+ *              Text can be omitted. Text and value are passed to formText()
+ *              Only one item can be selected.
+ *   _class : class attribute used on the label tag
+ *   _text  : Text to display before the menu. Not escaped.
+ * Other attributes are passed to buildAttributes() for the input tag.
+ *
+ * @author  Tom N Harris <tnharris@whoopdedo.org>
+ *
+ * @param array $attrs attributes
+ * @return string html
+ */
+function form_menufield($attrs) {
+    $attrs['size'] = '1';
+    $s = '<label';
+    if ($attrs['_class']) $s .= ' class="'.$attrs['_class'].'"';
+    if (!empty($attrs['id'])) $s .= ' for="'.$attrs['id'].'"';
+    $s .= '><span>'.$attrs['_text'].'</span>';
+    $s .= ' <select '.buildAttributes($attrs,true).'>'.DOKU_LF;
+    if (!empty($attrs['_options'])) {
+        $selected = false;
+
+        $cnt = count($attrs['_options']);
+        for($n=0; $n < $cnt; $n++){
+            @list($value,$text,$select) = $attrs['_options'][$n];
+            $p = '';
+            if (!is_null($text))
+                $p .= ' value="'.formText($value).'"';
+            else
+                $text = $value;
+            if (!empty($select) && !$selected) {
+                $p .= ' selected="selected"';
+                $selected = true;
+            }
+            $s .= '<option'.$p.'>'.formText($text).'</option>';
+        }
+    } else {
+        $s .= '<option></option>';
+    }
+    $s .= DOKU_LF.'</select></label>';
+    if (preg_match('/(^| )block($| )/', $attrs['_class']))
+        $s .= '<br />';
+    return $s;
+}
+
+/**
+ * form_listboxfield
+ *
+ * Print the HTML for a list box.
+ *   _options : Array of (value,text,selected) for the list.
+ *              Text can be omitted. Text and value are passed to formText()
+ *   _class : class attribute used on the label tag
+ *   _text  : Text to display before the menu. Not escaped.
+ * Other attributes are passed to buildAttributes() for the input tag.
+ *
+ * @author  Tom N Harris <tnharris@whoopdedo.org>
+ *
+ * @param array $attrs attributes
+ * @return string html
+ */
+function form_listboxfield($attrs) {
+    $s = '<label';
+    if ($attrs['_class']) $s .= ' class="'.$attrs['_class'].'"';
+    if (!empty($attrs['id'])) $s .= ' for="'.$attrs['id'].'"';
+    $s .= '><span>'.$attrs['_text'].'</span> ';
+    $s .= '<select '.buildAttributes($attrs,true).'>'.DOKU_LF;
+    if (!empty($attrs['_options'])) {
+        foreach ($attrs['_options'] as $opt) {
+            @list($value,$text,$select,$disabled) = $opt;
+            $p = '';
+            if(is_null($text)) $text = $value;
+            $p .= ' value="'.formText($value).'"';
+            if (!empty($select)) $p .= ' selected="selected"';
+            if ($disabled) $p .= ' disabled="disabled"';
+            $s .= '<option'.$p.'>'.formText($text).'</option>';
+        }
+    } else {
+        $s .= '<option></option>';
+    }
+    $s .= DOKU_LF.'</select></label>';
+    if (preg_match('/(^| )block($| )/', $attrs['_class']))
+        $s .= '<br />';
+    return $s;
+}
diff --git a/wiki/inc/fulltext.php b/wiki/inc/fulltext.php
new file mode 100644
index 0000000..dba11d0
--- /dev/null
+++ b/wiki/inc/fulltext.php
@@ -0,0 +1,919 @@
+<?php
+/**
+ * DokuWiki fulltextsearch functions using the index
+ *
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author     Andreas Gohr <andi@splitbrain.org>
+ */
+
+if(!defined('DOKU_INC')) die('meh.');
+
+/**
+ * create snippets for the first few results only
+ */
+if(!defined('FT_SNIPPET_NUMBER')) define('FT_SNIPPET_NUMBER',15);
+
+/**
+ * The fulltext search
+ *
+ * Returns a list of matching documents for the given query
+ *
+ * refactored into ft_pageSearch(), _ft_pageSearch() and trigger_event()
+ *
+ * @param string     $query
+ * @param array      $highlight
+ * @param string     $sort
+ * @param int|string $after  only show results with an modified time after this date, accepts timestap or strtotime arguments
+ * @param int|string $before only show results with an modified time before this date, accepts timestap or strtotime arguments
+ *
+ * @return array
+ */
+function ft_pageSearch($query,&$highlight, $sort = null, $after = null, $before = null){
+
+    if ($sort === null) {
+        $sort = 'hits';
+    }
+    $data = [
+        'query' => $query,
+        'sort' => $sort,
+        'after' => $after,
+        'before' => $before
+    ];
+    $data['highlight'] =& $highlight;
+
+    return trigger_event('SEARCH_QUERY_FULLPAGE', $data, '_ft_pageSearch');
+}
+
+/**
+ * Returns a list of matching documents for the given query
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @author Kazutaka Miyasaka <kazmiya@gmail.com>
+ *
+ * @param array $data event data
+ * @return array matching documents
+ */
+function _ft_pageSearch(&$data) {
+    $Indexer = idx_get_indexer();
+
+    // parse the given query
+    $q = ft_queryParser($Indexer, $data['query']);
+    $data['highlight'] = $q['highlight'];
+
+    if (empty($q['parsed_ary'])) return array();
+
+    // lookup all words found in the query
+    $lookup = $Indexer->lookup($q['words']);
+
+    // get all pages in this dokuwiki site (!: includes nonexistent pages)
+    $pages_all = array();
+    foreach ($Indexer->getPages() as $id) {
+        $pages_all[$id] = 0; // base: 0 hit
+    }
+
+    // process the query
+    $stack = array();
+    foreach ($q['parsed_ary'] as $token) {
+        switch (substr($token, 0, 3)) {
+            case 'W+:':
+            case 'W-:':
+            case 'W_:': // word
+                $word    = substr($token, 3);
+                $stack[] = (array) $lookup[$word];
+                break;
+            case 'P+:':
+            case 'P-:': // phrase
+                $phrase = substr($token, 3);
+                // since phrases are always parsed as ((W1)(W2)...(P)),
+                // the end($stack) always points the pages that contain
+                // all words in this phrase
+                $pages  = end($stack);
+                $pages_matched = array();
+                foreach(array_keys($pages) as $id){
+                    $evdata = array(
+                        'id' => $id,
+                        'phrase' => $phrase,
+                        'text' => rawWiki($id)
+                    );
+                    $evt = new Doku_Event('FULLTEXT_PHRASE_MATCH',$evdata);
+                    if ($evt->advise_before() && $evt->result !== true) {
+                        $text = utf8_strtolower($evdata['text']);
+                        if (strpos($text, $phrase) !== false) {
+                            $evt->result = true;
+                        }
+                    }
+                    $evt->advise_after();
+                    if ($evt->result === true) {
+                        $pages_matched[$id] = 0; // phrase: always 0 hit
+                    }
+                }
+                $stack[] = $pages_matched;
+                break;
+            case 'N+:':
+            case 'N-:': // namespace
+                $ns = cleanID(substr($token, 3)) . ':';
+                $pages_matched = array();
+                foreach (array_keys($pages_all) as $id) {
+                    if (strpos($id, $ns) === 0) {
+                        $pages_matched[$id] = 0; // namespace: always 0 hit
+                    }
+                }
+                $stack[] = $pages_matched;
+                break;
+            case 'AND': // and operation
+                list($pages1, $pages2) = array_splice($stack, -2);
+                $stack[] = ft_resultCombine(array($pages1, $pages2));
+                break;
+            case 'OR':  // or operation
+                list($pages1, $pages2) = array_splice($stack, -2);
+                $stack[] = ft_resultUnite(array($pages1, $pages2));
+                break;
+            case 'NOT': // not operation (unary)
+                $pages   = array_pop($stack);
+                $stack[] = ft_resultComplement(array($pages_all, $pages));
+                break;
+        }
+    }
+    $docs = array_pop($stack);
+
+    if (empty($docs)) return array();
+
+    // check: settings, acls, existence
+    foreach (array_keys($docs) as $id) {
+        if (isHiddenPage($id) || auth_quickaclcheck($id) < AUTH_READ || !page_exists($id, '', false)) {
+            unset($docs[$id]);
+        }
+    }
+
+    $docs = _ft_filterResultsByTime($docs, $data['after'], $data['before']);
+
+    if ($data['sort'] === 'mtime') {
+        uksort($docs, 'ft_pagemtimesorter');
+    } else {
+        // sort docs by count
+        arsort($docs);
+    }
+
+    return $docs;
+}
+
+/**
+ * Returns the backlinks for a given page
+ *
+ * Uses the metadata index.
+ *
+ * @param string $id           The id for which links shall be returned
+ * @param bool   $ignore_perms Ignore the fact that pages are hidden or read-protected
+ * @return array The pages that contain links to the given page
+ */
+function ft_backlinks($id, $ignore_perms = false){
+    $result = idx_get_indexer()->lookupKey('relation_references', $id);
+
+    if(!count($result)) return $result;
+
+    // check ACL permissions
+    foreach(array_keys($result) as $idx){
+        if(($ignore_perms !== true && (
+                isHiddenPage($result[$idx]) || auth_quickaclcheck($result[$idx]) < AUTH_READ
+            )) || !page_exists($result[$idx], '', false)){
+            unset($result[$idx]);
+        }
+    }
+
+    sort($result);
+    return $result;
+}
+
+/**
+ * Returns the pages that use a given media file
+ *
+ * Uses the relation media metadata property and the metadata index.
+ *
+ * Note that before 2013-07-31 the second parameter was the maximum number of results and
+ * permissions were ignored. That's why the parameter is now checked to be explicitely set
+ * to true (with type bool) in order to be compatible with older uses of the function.
+ *
+ * @param string $id           The media id to look for
+ * @param bool   $ignore_perms Ignore hidden pages and acls (optional, default: false)
+ * @return array A list of pages that use the given media file
+ */
+function ft_mediause($id, $ignore_perms = false){
+    $result = idx_get_indexer()->lookupKey('relation_media', $id);
+
+    if(!count($result)) return $result;
+
+    // check ACL permissions
+    foreach(array_keys($result) as $idx){
+        if(($ignore_perms !== true && (
+                    isHiddenPage($result[$idx]) || auth_quickaclcheck($result[$idx]) < AUTH_READ
+                )) || !page_exists($result[$idx], '', false)){
+            unset($result[$idx]);
+        }
+    }
+
+    sort($result);
+    return $result;
+}
+
+
+/**
+ * Quicksearch for pagenames
+ *
+ * By default it only matches the pagename and ignores the
+ * namespace. This can be changed with the second parameter.
+ * The third parameter allows to search in titles as well.
+ *
+ * The function always returns titles as well
+ *
+ * @triggers SEARCH_QUERY_PAGELOOKUP
+ * @author   Andreas Gohr <andi@splitbrain.org>
+ * @author   Adrian Lang <lang@cosmocode.de>
+ *
+ * @param string     $id       page id
+ * @param bool       $in_ns    match against namespace as well?
+ * @param bool       $in_title search in title?
+ * @param int|string $after    only show results with an modified time after this date, accepts timestap or strtotime arguments
+ * @param int|string $before   only show results with an modified time before this date, accepts timestap or strtotime arguments
+ *
+ * @return string[]
+ */
+function ft_pageLookup($id, $in_ns=false, $in_title=false, $after = null, $before = null){
+    $data = [
+        'id' => $id,
+        'in_ns' => $in_ns,
+        'in_title' => $in_title,
+        'after' => $after,
+        'before' => $before
+    ];
+    $data['has_titles'] = true; // for plugin backward compatibility check
+    return trigger_event('SEARCH_QUERY_PAGELOOKUP', $data, '_ft_pageLookup');
+}
+
+/**
+ * Returns list of pages as array(pageid => First Heading)
+ *
+ * @param array &$data event data
+ * @return string[]
+ */
+function _ft_pageLookup(&$data){
+    // split out original parameters
+    $id = $data['id'];
+    $Indexer = idx_get_indexer();
+    $parsedQuery = ft_queryParser($Indexer, $id);
+    if (count($parsedQuery['ns']) > 0) {
+        $ns = cleanID($parsedQuery['ns'][0]) . ':';
+        $id = implode(' ', $parsedQuery['highlight']);
+    }
+
+    $in_ns    = $data['in_ns'];
+    $in_title = $data['in_title'];
+    $cleaned = cleanID($id);
+
+    $Indexer = idx_get_indexer();
+    $page_idx = $Indexer->getPages();
+
+    $pages = array();
+    if ($id !== '' && $cleaned !== '') {
+        foreach ($page_idx as $p_id) {
+            if ((strpos($in_ns ? $p_id : noNSorNS($p_id), $cleaned) !== false)) {
+                if (!isset($pages[$p_id]))
+                    $pages[$p_id] = p_get_first_heading($p_id, METADATA_DONT_RENDER);
+            }
+        }
+        if ($in_title) {
+            foreach ($Indexer->lookupKey('title', $id, '_ft_pageLookupTitleCompare') as $p_id) {
+                if (!isset($pages[$p_id]))
+                    $pages[$p_id] = p_get_first_heading($p_id, METADATA_DONT_RENDER);
+            }
+        }
+    }
+
+    if (isset($ns)) {
+        foreach (array_keys($pages) as $p_id) {
+            if (strpos($p_id, $ns) !== 0) {
+                unset($pages[$p_id]);
+            }
+        }
+    }
+
+    // discard hidden pages
+    // discard nonexistent pages
+    // check ACL permissions
+    foreach(array_keys($pages) as $idx){
+        if(!isVisiblePage($idx) || !page_exists($idx) ||
+           auth_quickaclcheck($idx) < AUTH_READ) {
+            unset($pages[$idx]);
+        }
+    }
+
+    $pages = _ft_filterResultsByTime($pages, $data['after'], $data['before']);
+
+    uksort($pages,'ft_pagesorter');
+    return $pages;
+}
+
+
+/**
+ * @param array      $results search results in the form pageid => value
+ * @param int|string $after   only returns results with an modified time after this date, accepts timestap or strtotime arguments
+ * @param int|string $before  only returns results with an modified time after this date, accepts timestap or strtotime arguments
+ *
+ * @return array
+ */
+function _ft_filterResultsByTime(array $results, $after, $before) {
+    if ($after || $before) {
+        $after = is_int($after) ? $after : strtotime($after);
+        $before = is_int($before) ? $before : strtotime($before);
+
+        foreach ($results as $id => $value) {
+            $mTime = filemtime(wikiFN($id));
+            if ($after && $after > $mTime) {
+                unset($results[$id]);
+                continue;
+            }
+            if ($before && $before < $mTime) {
+                unset($results[$id]);
+            }
+        }
+    }
+
+    return $results;
+}
+
+/**
+ * Tiny helper function for comparing the searched title with the title
+ * from the search index. This function is a wrapper around stripos with
+ * adapted argument order and return value.
+ *
+ * @param string $search searched title
+ * @param string $title  title from index
+ * @return bool
+ */
+function _ft_pageLookupTitleCompare($search, $title) {
+    return stripos($title, $search) !== false;
+}
+
+/**
+ * Sort pages based on their namespace level first, then on their string
+ * values. This makes higher hierarchy pages rank higher than lower hierarchy
+ * pages.
+ *
+ * @param string $a
+ * @param string $b
+ * @return int Returns < 0 if $a is less than $b; > 0 if $a is greater than $b, and 0 if they are equal.
+ */
+function ft_pagesorter($a, $b){
+    $ac = count(explode(':',$a));
+    $bc = count(explode(':',$b));
+    if($ac < $bc){
+        return -1;
+    }elseif($ac > $bc){
+        return 1;
+    }
+    return strcmp ($a,$b);
+}
+
+/**
+ * Sort pages by their mtime, from newest to oldest
+ *
+ * @param string $a
+ * @param string $b
+ *
+ * @return int Returns < 0 if $a is newer than $b, > 0 if $b is newer than $a and 0 if they are of the same age
+ */
+function ft_pagemtimesorter($a, $b) {
+    $mtimeA = filemtime(wikiFN($a));
+    $mtimeB = filemtime(wikiFN($b));
+    return $mtimeB - $mtimeA;
+}
+
+/**
+ * Creates a snippet extract
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @triggers FULLTEXT_SNIPPET_CREATE
+ *
+ * @param string $id page id
+ * @param array $highlight
+ * @return mixed
+ */
+function ft_snippet($id,$highlight){
+    $text = rawWiki($id);
+    $text = str_replace("\xC2\xAD",'',$text); // remove soft-hyphens
+    $evdata = array(
+            'id'        => $id,
+            'text'      => &$text,
+            'highlight' => &$highlight,
+            'snippet'   => '',
+            );
+
+    $evt = new Doku_Event('FULLTEXT_SNIPPET_CREATE',$evdata);
+    if ($evt->advise_before()) {
+        $match = array();
+        $snippets = array();
+        $utf8_offset = $offset = $end = 0;
+        $len = utf8_strlen($text);
+
+        // build a regexp from the phrases to highlight
+        $re1 = '('.join('|',array_map('ft_snippet_re_preprocess', array_map('preg_quote_cb',array_filter((array) $highlight)))).')';
+        $re2 = "$re1.{0,75}(?!\\1)$re1";
+        $re3 = "$re1.{0,45}(?!\\1)$re1.{0,45}(?!\\1)(?!\\2)$re1";
+
+        for ($cnt=4; $cnt--;) {
+            if (0) {
+            } else if (preg_match('/'.$re3.'/iu',$text,$match,PREG_OFFSET_CAPTURE,$offset)) {
+            } else if (preg_match('/'.$re2.'/iu',$text,$match,PREG_OFFSET_CAPTURE,$offset)) {
+            } else if (preg_match('/'.$re1.'/iu',$text,$match,PREG_OFFSET_CAPTURE,$offset)) {
+            } else {
+                break;
+            }
+
+            list($str,$idx) = $match[0];
+
+            // convert $idx (a byte offset) into a utf8 character offset
+            $utf8_idx = utf8_strlen(substr($text,0,$idx));
+            $utf8_len = utf8_strlen($str);
+
+            // establish context, 100 bytes surrounding the match string
+            // first look to see if we can go 100 either side,
+            // then drop to 50 adding any excess if the other side can't go to 50,
+            $pre = min($utf8_idx-$utf8_offset,100);
+            $post = min($len-$utf8_idx-$utf8_len,100);
+
+            if ($pre>50 && $post>50) {
+                $pre = $post = 50;
+            } else if ($pre>50) {
+                $pre = min($pre,100-$post);
+            } else if ($post>50) {
+                $post = min($post, 100-$pre);
+            } else if ($offset == 0) {
+                // both are less than 50, means the context is the whole string
+                // make it so and break out of this loop - there is no need for the
+                // complex snippet calculations
+                $snippets = array($text);
+                break;
+            }
+
+            // establish context start and end points, try to append to previous
+            // context if possible
+            $start = $utf8_idx - $pre;
+            $append = ($start < $end) ? $end : false;  // still the end of the previous context snippet
+            $end = $utf8_idx + $utf8_len + $post;      // now set it to the end of this context
+
+            if ($append) {
+                $snippets[count($snippets)-1] .= utf8_substr($text,$append,$end-$append);
+            } else {
+                $snippets[] = utf8_substr($text,$start,$end-$start);
+            }
+
+            // set $offset for next match attempt
+            // continue matching after the current match
+            // if the current match is not the longest possible match starting at the current offset
+            // this prevents further matching of this snippet but for possible matches of length
+            // smaller than match length + context (at least 50 characters) this match is part of the context
+            $utf8_offset = $utf8_idx + $utf8_len;
+            $offset = $idx + strlen(utf8_substr($text,$utf8_idx,$utf8_len));
+            $offset = utf8_correctIdx($text,$offset);
+        }
+
+        $m = "\1";
+        $snippets = preg_replace('/'.$re1.'/iu',$m.'$1'.$m,$snippets);
+        $snippet = preg_replace('/'.$m.'([^'.$m.']*?)'.$m.'/iu','<strong class="search_hit">$1</strong>',hsc(join('... ',$snippets)));
+
+        $evdata['snippet'] = $snippet;
+    }
+    $evt->advise_after();
+    unset($evt);
+
+    return $evdata['snippet'];
+}
+
+/**
+ * Wraps a search term in regex boundary checks.
+ *
+ * @param string $term
+ * @return string
+ */
+function ft_snippet_re_preprocess($term) {
+    // do not process asian terms where word boundaries are not explicit
+    if(preg_match('/'.IDX_ASIAN.'/u',$term)){
+        return $term;
+    }
+
+    if (UTF8_PROPERTYSUPPORT) {
+        // unicode word boundaries
+        // see http://stackoverflow.com/a/2449017/172068
+        $BL = '(?<!\pL)';
+        $BR = '(?!\pL)';
+    } else {
+        // not as correct as above, but at least won't break
+        $BL = '\b';
+        $BR = '\b';
+    }
+
+    if(substr($term,0,2) == '\\*'){
+        $term = substr($term,2);
+    }else{
+        $term = $BL.$term;
+    }
+
+    if(substr($term,-2,2) == '\\*'){
+        $term = substr($term,0,-2);
+    }else{
+        $term = $term.$BR;
+    }
+
+    if($term == $BL || $term == $BR || $term == $BL.$BR) $term = '';
+    return $term;
+}
+
+/**
+ * Combine found documents and sum up their scores
+ *
+ * This function is used to combine searched words with a logical
+ * AND. Only documents available in all arrays are returned.
+ *
+ * based upon PEAR's PHP_Compat function for array_intersect_key()
+ *
+ * @param array $args An array of page arrays
+ * @return array
+ */
+function ft_resultCombine($args){
+    $array_count = count($args);
+    if($array_count == 1){
+        return $args[0];
+    }
+
+    $result = array();
+    if ($array_count > 1) {
+        foreach ($args[0] as $key => $value) {
+            $result[$key] = $value;
+            for ($i = 1; $i !== $array_count; $i++) {
+                if (!isset($args[$i][$key])) {
+                    unset($result[$key]);
+                    break;
+                }
+                $result[$key] += $args[$i][$key];
+            }
+        }
+    }
+    return $result;
+}
+
+/**
+ * Unites found documents and sum up their scores
+ *
+ * based upon ft_resultCombine() function
+ *
+ * @param array $args An array of page arrays
+ * @return array
+ *
+ * @author Kazutaka Miyasaka <kazmiya@gmail.com>
+ */
+function ft_resultUnite($args) {
+    $array_count = count($args);
+    if ($array_count === 1) {
+        return $args[0];
+    }
+
+    $result = $args[0];
+    for ($i = 1; $i !== $array_count; $i++) {
+        foreach (array_keys($args[$i]) as $id) {
+            $result[$id] += $args[$i][$id];
+        }
+    }
+    return $result;
+}
+
+/**
+ * Computes the difference of documents using page id for comparison
+ *
+ * nearly identical to PHP5's array_diff_key()
+ *
+ * @param array $args An array of page arrays
+ * @return array
+ *
+ * @author Kazutaka Miyasaka <kazmiya@gmail.com>
+ */
+function ft_resultComplement($args) {
+    $array_count = count($args);
+    if ($array_count === 1) {
+        return $args[0];
+    }
+
+    $result = $args[0];
+    foreach (array_keys($result) as $id) {
+        for ($i = 1; $i !== $array_count; $i++) {
+            if (isset($args[$i][$id])) unset($result[$id]);
+        }
+    }
+    return $result;
+}
+
+/**
+ * Parses a search query and builds an array of search formulas
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @author Kazutaka Miyasaka <kazmiya@gmail.com>
+ *
+ * @param Doku_Indexer $Indexer
+ * @param string $query search query
+ * @return array of search formulas
+ */
+function ft_queryParser($Indexer, $query){
+    /**
+     * parse a search query and transform it into intermediate representation
+     *
+     * in a search query, you can use the following expressions:
+     *
+     *   words:
+     *     include
+     *     -exclude
+     *   phrases:
+     *     "phrase to be included"
+     *     -"phrase you want to exclude"
+     *   namespaces:
+     *     @include:namespace (or ns:include:namespace)
+     *     ^exclude:namespace (or -ns:exclude:namespace)
+     *   groups:
+     *     ()
+     *     -()
+     *   operators:
+     *     and ('and' is the default operator: you can always omit this)
+     *     or  (or pipe symbol '|', lower precedence than 'and')
+     *
+     * e.g. a query [ aa "bb cc" @dd:ee ] means "search pages which contain
+     *      a word 'aa', a phrase 'bb cc' and are within a namespace 'dd:ee'".
+     *      this query is equivalent to [ -(-aa or -"bb cc" or -ns:dd:ee) ]
+     *      as long as you don't mind hit counts.
+     *
+     * intermediate representation consists of the following parts:
+     *
+     *   ( )           - group
+     *   AND           - logical and
+     *   OR            - logical or
+     *   NOT           - logical not
+     *   W+:, W-:, W_: - word      (underscore: no need to highlight)
+     *   P+:, P-:      - phrase    (minus sign: logically in NOT group)
+     *   N+:, N-:      - namespace
+     */
+    $parsed_query = '';
+    $parens_level = 0;
+    $terms = preg_split('/(-?".*?")/u', utf8_strtolower($query), -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
+
+    foreach ($terms as $term) {
+        $parsed = '';
+        if (preg_match('/^(-?)"(.+)"$/u', $term, $matches)) {
+            // phrase-include and phrase-exclude
+            $not = $matches[1] ? 'NOT' : '';
+            $parsed = $not.ft_termParser($Indexer, $matches[2], false, true);
+        } else {
+            // fix incomplete phrase
+            $term = str_replace('"', ' ', $term);
+
+            // fix parentheses
+            $term = str_replace(')'  , ' ) ', $term);
+            $term = str_replace('('  , ' ( ', $term);
+            $term = str_replace('- (', ' -(', $term);
+
+            // treat pipe symbols as 'OR' operators
+            $term = str_replace('|', ' or ', $term);
+
+            // treat ideographic spaces (U+3000) as search term separators
+            // FIXME: some more separators?
+            $term = preg_replace('/[ \x{3000}]+/u', ' ',  $term);
+            $term = trim($term);
+            if ($term === '') continue;
+
+            $tokens = explode(' ', $term);
+            foreach ($tokens as $token) {
+                if ($token === '(') {
+                    // parenthesis-include-open
+                    $parsed .= '(';
+                    ++$parens_level;
+                } elseif ($token === '-(') {
+                    // parenthesis-exclude-open
+                    $parsed .= 'NOT(';
+                    ++$parens_level;
+                } elseif ($token === ')') {
+                    // parenthesis-any-close
+                    if ($parens_level === 0) continue;
+                    $parsed .= ')';
+                    $parens_level--;
+                } elseif ($token === 'and') {
+                    // logical-and (do nothing)
+                } elseif ($token === 'or') {
+                    // logical-or
+                    $parsed .= 'OR';
+                } elseif (preg_match('/^(?:\^|-ns:)(.+)$/u', $token, $matches)) {
+                    // namespace-exclude
+                    $parsed .= 'NOT(N+:'.$matches[1].')';
+                } elseif (preg_match('/^(?:@|ns:)(.+)$/u', $token, $matches)) {
+                    // namespace-include
+                    $parsed .= '(N+:'.$matches[1].')';
+                } elseif (preg_match('/^-(.+)$/', $token, $matches)) {
+                    // word-exclude
+                    $parsed .= 'NOT('.ft_termParser($Indexer, $matches[1]).')';
+                } else {
+                    // word-include
+                    $parsed .= ft_termParser($Indexer, $token);
+                }
+            }
+        }
+        $parsed_query .= $parsed;
+    }
+
+    // cleanup (very sensitive)
+    $parsed_query .= str_repeat(')', $parens_level);
+    do {
+        $parsed_query_old = $parsed_query;
+        $parsed_query = preg_replace('/(NOT)?\(\)/u', '', $parsed_query);
+    } while ($parsed_query !== $parsed_query_old);
+    $parsed_query = preg_replace('/(NOT|OR)+\)/u', ')'      , $parsed_query);
+    $parsed_query = preg_replace('/(OR)+/u'      , 'OR'     , $parsed_query);
+    $parsed_query = preg_replace('/\(OR/u'       , '('      , $parsed_query);
+    $parsed_query = preg_replace('/^OR|OR$/u'    , ''       , $parsed_query);
+    $parsed_query = preg_replace('/\)(NOT)?\(/u' , ')AND$1(', $parsed_query);
+
+    // adjustment: make highlightings right
+    $parens_level     = 0;
+    $notgrp_levels    = array();
+    $parsed_query_new = '';
+    $tokens = preg_split('/(NOT\(|[()])/u', $parsed_query, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
+    foreach ($tokens as $token) {
+        if ($token === 'NOT(') {
+            $notgrp_levels[] = ++$parens_level;
+        } elseif ($token === '(') {
+            ++$parens_level;
+        } elseif ($token === ')') {
+            if ($parens_level-- === end($notgrp_levels)) array_pop($notgrp_levels);
+        } elseif (count($notgrp_levels) % 2 === 1) {
+            // turn highlight-flag off if terms are logically in "NOT" group
+            $token = preg_replace('/([WPN])\+\:/u', '$1-:', $token);
+        }
+        $parsed_query_new .= $token;
+    }
+    $parsed_query = $parsed_query_new;
+
+    /**
+     * convert infix notation string into postfix (Reverse Polish notation) array
+     * by Shunting-yard algorithm
+     *
+     * see: http://en.wikipedia.org/wiki/Reverse_Polish_notation
+     * see: http://en.wikipedia.org/wiki/Shunting-yard_algorithm
+     */
+    $parsed_ary     = array();
+    $ope_stack      = array();
+    $ope_precedence = array(')' => 1, 'OR' => 2, 'AND' => 3, 'NOT' => 4, '(' => 5);
+    $ope_regex      = '/([()]|OR|AND|NOT)/u';
+
+    $tokens = preg_split($ope_regex, $parsed_query, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
+    foreach ($tokens as $token) {
+        if (preg_match($ope_regex, $token)) {
+            // operator
+            $last_ope = end($ope_stack);
+            while ($last_ope !== false && $ope_precedence[$token] <= $ope_precedence[$last_ope] && $last_ope != '(') {
+                $parsed_ary[] = array_pop($ope_stack);
+                $last_ope = end($ope_stack);
+            }
+            if ($token == ')') {
+                array_pop($ope_stack); // this array_pop always deletes '('
+            } else {
+                $ope_stack[] = $token;
+            }
+        } else {
+            // operand
+            $token_decoded = str_replace(array('OP', 'CP'), array('(', ')'), $token);
+            $parsed_ary[] = $token_decoded;
+        }
+    }
+    $parsed_ary = array_values(array_merge($parsed_ary, array_reverse($ope_stack)));
+
+    // cleanup: each double "NOT" in RPN array actually does nothing
+    $parsed_ary_count = count($parsed_ary);
+    for ($i = 1; $i < $parsed_ary_count; ++$i) {
+        if ($parsed_ary[$i] === 'NOT' && $parsed_ary[$i - 1] === 'NOT') {
+            unset($parsed_ary[$i], $parsed_ary[$i - 1]);
+        }
+    }
+    $parsed_ary = array_values($parsed_ary);
+
+    // build return value
+    $q = array();
+    $q['query']      = $query;
+    $q['parsed_str'] = $parsed_query;
+    $q['parsed_ary'] = $parsed_ary;
+
+    foreach ($q['parsed_ary'] as $token) {
+        if ($token[2] !== ':') continue;
+        $body = substr($token, 3);
+
+        switch (substr($token, 0, 3)) {
+            case 'N+:':
+                     $q['ns'][]        = $body; // for backward compatibility
+                     break;
+            case 'N-:':
+                     $q['notns'][]     = $body; // for backward compatibility
+                     break;
+            case 'W_:':
+                     $q['words'][]     = $body;
+                     break;
+            case 'W-:':
+                     $q['words'][]     = $body;
+                     $q['not'][]       = $body; // for backward compatibility
+                     break;
+            case 'W+:':
+                     $q['words'][]     = $body;
+                     $q['highlight'][] = $body;
+                     $q['and'][]       = $body; // for backward compatibility
+                     break;
+            case 'P-:':
+                     $q['phrases'][]   = $body;
+                     break;
+            case 'P+:':
+                     $q['phrases'][]   = $body;
+                     $q['highlight'][] = $body;
+                     break;
+        }
+    }
+    foreach (array('words', 'phrases', 'highlight', 'ns', 'notns', 'and', 'not') as $key) {
+        $q[$key] = empty($q[$key]) ? array() : array_values(array_unique($q[$key]));
+    }
+
+    return $q;
+}
+
+/**
+ * Transforms given search term into intermediate representation
+ *
+ * This function is used in ft_queryParser() and not for general purpose use.
+ *
+ * @author Kazutaka Miyasaka <kazmiya@gmail.com>
+ *
+ * @param Doku_Indexer $Indexer
+ * @param string       $term
+ * @param bool         $consider_asian
+ * @param bool         $phrase_mode
+ * @return string
+ */
+function ft_termParser($Indexer, $term, $consider_asian = true, $phrase_mode = false) {
+    $parsed = '';
+    if ($consider_asian) {
+        // successive asian characters need to be searched as a phrase
+        $words = preg_split('/('.IDX_ASIAN.'+)/u', $term, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
+        foreach ($words as $word) {
+            $phrase_mode = $phrase_mode ? true : preg_match('/'.IDX_ASIAN.'/u', $word);
+            $parsed .= ft_termParser($Indexer, $word, false, $phrase_mode);
+        }
+    } else {
+        $term_noparen = str_replace(array('(', ')'), ' ', $term);
+        $words = $Indexer->tokenizer($term_noparen, true);
+
+        // W_: no need to highlight
+        if (empty($words)) {
+            $parsed = '()'; // important: do not remove
+        } elseif ($words[0] === $term) {
+            $parsed = '(W+:'.$words[0].')';
+        } elseif ($phrase_mode) {
+            $term_encoded = str_replace(array('(', ')'), array('OP', 'CP'), $term);
+            $parsed = '((W_:'.implode(')(W_:', $words).')(P+:'.$term_encoded.'))';
+        } else {
+            $parsed = '((W+:'.implode(')(W+:', $words).'))';
+        }
+    }
+    return $parsed;
+}
+
+/**
+ * Recreate a search query string based on parsed parts, doesn't support negated phrases and `OR` searches
+ *
+ * @param array $and
+ * @param array $not
+ * @param array $phrases
+ * @param array $ns
+ * @param array $notns
+ *
+ * @return string
+ */
+function ft_queryUnparser_simple(array $and, array $not, array $phrases, array $ns, array $notns) {
+    $query = implode(' ', $and);
+    if (!empty($not)) {
+        $query .= ' -' . implode(' -', $not);
+    }
+
+    if (!empty($phrases)) {
+        $query .= ' "' . implode('" "', $phrases) . '"';
+    }
+
+    if (!empty($ns)) {
+        $query .= ' @' . implode(' @', $ns);
+    }
+
+    if (!empty($notns)) {
+        $query .= ' ^' . implode(' ^', $notns);
+    }
+
+    return $query;
+}
+
+//Setup VIM: ex: et ts=4 :
diff --git a/wiki/inc/html.php b/wiki/inc/html.php
new file mode 100644
index 0000000..7bd38eb
--- /dev/null
+++ b/wiki/inc/html.php
@@ -0,0 +1,2255 @@
+<?php
+/**
+ * HTML output functions
+ *
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author     Andreas Gohr <andi@splitbrain.org>
+ */
+
+if(!defined('DOKU_INC')) die('meh.');
+if(!defined('NL')) define('NL',"\n");
+if (!defined('SEC_EDIT_PATTERN')) {
+    define('SEC_EDIT_PATTERN', '#<!-- EDIT({.*?}) -->#');
+}
+
+
+/**
+ * Convenience function to quickly build a wikilink
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @param string  $id      id of the target page
+ * @param string  $name    the name of the link, i.e. the text that is displayed
+ * @param string|array  $search  search string(s) that shall be highlighted in the target page
+ * @return string the HTML code of the link
+ */
+function html_wikilink($id,$name=null,$search=''){
+    /** @var Doku_Renderer_xhtml $xhtml_renderer */
+    static $xhtml_renderer = null;
+    if(is_null($xhtml_renderer)){
+        $xhtml_renderer = p_get_renderer('xhtml');
+    }
+
+    return $xhtml_renderer->internallink($id,$name,$search,true,'navigation');
+}
+
+/**
+ * The loginform
+ *
+ * @author   Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param bool $svg Whether to show svg icons in the register and resendpwd links or not
+ */
+function html_login($svg = false){
+    global $lang;
+    global $conf;
+    global $ID;
+    global $INPUT;
+
+    print p_locale_xhtml('login');
+    print '<div class="centeralign">'.NL;
+    $form = new Doku_Form(array('id' => 'dw__login'));
+    $form->startFieldset($lang['btn_login']);
+    $form->addHidden('id', $ID);
+    $form->addHidden('do', 'login');
+    $form->addElement(form_makeTextField('u', ((!$INPUT->bool('http_credentials')) ? $INPUT->str('u') : ''), $lang['user'], 'focus__this', 'block'));
+    $form->addElement(form_makePasswordField('p', $lang['pass'], '', 'block'));
+    if($conf['rememberme']) {
+        $form->addElement(form_makeCheckboxField('r', '1', $lang['remember'], 'remember__me', 'simple'));
+    }
+    $form->addElement(form_makeButton('submit', '', $lang['btn_login']));
+    $form->endFieldset();
+
+    if(actionOK('register')){
+        $registerLink = (new \dokuwiki\Menu\Item\Register())->asHtmlLink('', $svg);
+        $form->addElement('<p>'.$lang['reghere'].': '. $registerLink .'</p>');
+    }
+
+    if (actionOK('resendpwd')) {
+        $resendPwLink = (new \dokuwiki\Menu\Item\Resendpwd())->asHtmlLink('', $svg);
+        $form->addElement('<p>'.$lang['pwdforget'].': '. $resendPwLink .'</p>');
+    }
+
+    html_form('login', $form);
+    print '</div>'.NL;
+}
+
+
+/**
+ * Denied page content
+ *
+ * @return string html
+ */
+function html_denied() {
+    print p_locale_xhtml('denied');
+
+    if(empty($_SERVER['REMOTE_USER'])){
+        html_login();
+    }
+}
+
+/**
+ * inserts section edit buttons if wanted or removes the markers
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param string $text
+ * @param bool   $show show section edit buttons?
+ * @return string
+ */
+function html_secedit($text,$show=true){
+    global $INFO;
+
+    if(!$INFO['writable'] || !$show || $INFO['rev']){
+        return preg_replace(SEC_EDIT_PATTERN,'',$text);
+    }
+
+    return preg_replace_callback(SEC_EDIT_PATTERN,
+                'html_secedit_button', $text);
+}
+
+/**
+ * prepares section edit button data for event triggering
+ * used as a callback in html_secedit
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param array $matches matches with regexp
+ * @return string
+ * @triggers HTML_SECEDIT_BUTTON
+ */
+function html_secedit_button($matches){
+    $json = htmlspecialchars_decode($matches[1], ENT_QUOTES);
+    $data = json_decode($json, true);
+    if ($data == NULL) {
+        return;
+    }
+    $data ['target'] = strtolower($data['target']);
+    $data ['hid'] = strtolower($data['hid']);
+
+    return trigger_event('HTML_SECEDIT_BUTTON', $data,
+                         'html_secedit_get_button');
+}
+
+/**
+ * prints a section editing button
+ * used as default action form HTML_SECEDIT_BUTTON
+ *
+ * @author Adrian Lang <lang@cosmocode.de>
+ *
+ * @param array $data name, section id and target
+ * @return string html
+ */
+function html_secedit_get_button($data) {
+    global $ID;
+    global $INFO;
+
+    if (!isset($data['name']) || $data['name'] === '') return '';
+
+    $name = $data['name'];
+    unset($data['name']);
+
+    $secid = $data['secid'];
+    unset($data['secid']);
+
+    return "<div class='secedit editbutton_" . $data['target'] .
+                       " editbutton_" . $secid . "'>" .
+           html_btn('secedit', $ID, '',
+                    array_merge(array('do'  => 'edit',
+                                      'rev' => $INFO['lastmod'],
+                                      'summary' => '['.$name.'] '), $data),
+                    'post', $name) . '</div>';
+}
+
+/**
+ * Just the back to top button (in its own form)
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @return string html
+ */
+function html_topbtn(){
+    global $lang;
+
+    $ret  = '<a class="nolink" href="#dokuwiki__top"><button class="button" onclick="window.scrollTo(0, 0)" title="'.$lang['btn_top'].'">'.$lang['btn_top'].'</button></a>';
+
+    return $ret;
+}
+
+/**
+ * Displays a button (using its own form)
+ * If tooltip exists, the access key tooltip is replaced.
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param string         $name
+ * @param string         $id
+ * @param string         $akey   access key
+ * @param string[] $params key-value pairs added as hidden inputs
+ * @param string         $method
+ * @param string         $tooltip
+ * @param bool|string    $label  label text, false: lookup btn_$name in localization
+ * @param string         $svg (optional) svg code, inserted into the button
+ * @return string
+ */
+function html_btn($name, $id, $akey, $params, $method='get', $tooltip='', $label=false, $svg=null){
+    global $conf;
+    global $lang;
+
+    if (!$label)
+        $label = $lang['btn_'.$name];
+
+    $ret = '';
+
+    //filter id (without urlencoding)
+    $id = idfilter($id,false);
+
+    //make nice URLs even for buttons
+    if($conf['userewrite'] == 2){
+        $script = DOKU_BASE.DOKU_SCRIPT.'/'.$id;
+    }elseif($conf['userewrite']){
+        $script = DOKU_BASE.$id;
+    }else{
+        $script = DOKU_BASE.DOKU_SCRIPT;
+        $params['id'] = $id;
+    }
+
+    $ret .= '<form class="button btn_'.$name.'" method="'.$method.'" action="'.$script.'"><div class="no">';
+
+    if(is_array($params)){
+        foreach($params as $key => $val) {
+            $ret .= '<input type="hidden" name="'.$key.'" ';
+            $ret .= 'value="'.hsc($val).'" />';
+        }
+    }
+
+    if ($tooltip!='') {
+        $tip = hsc($tooltip);
+    }else{
+        $tip = hsc($label);
+    }
+
+    $ret .= '<button type="submit" ';
+    if($akey){
+        $tip .= ' ['.strtoupper($akey).']';
+        $ret .= 'accesskey="'.$akey.'" ';
+    }
+    $ret .= 'title="'.$tip.'">';
+    if ($svg) {
+        $ret .= '<span>' . hsc($label) . '</span>';
+        $ret .= inlineSVG($svg);
+    } else {
+        $ret .= hsc($label);
+    }
+    $ret .= '</button>';
+    $ret .= '</div></form>';
+
+    return $ret;
+}
+/**
+ * show a revision warning
+ *
+ * @author Szymon Olewniczak <dokuwiki@imz.re>
+ */
+function html_showrev() {
+    print p_locale_xhtml('showrev');
+}
+
+/**
+ * Show a wiki page
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param null|string $txt wiki text or null for showing $ID
+ */
+function html_show($txt=null){
+    global $ID;
+    global $REV;
+    global $HIGH;
+    global $INFO;
+    global $DATE_AT;
+    //disable section editing for old revisions or in preview
+    if($txt || $REV){
+        $secedit = false;
+    }else{
+        $secedit = true;
+    }
+
+    if (!is_null($txt)){
+        //PreviewHeader
+        echo '<br id="scroll__here" />';
+        echo p_locale_xhtml('preview');
+        echo '<div class="preview"><div class="pad">';
+        $html = html_secedit(p_render('xhtml',p_get_instructions($txt),$info),$secedit);
+        if($INFO['prependTOC']) $html = tpl_toc(true).$html;
+        echo $html;
+        echo '<div class="clearer"></div>';
+        echo '</div></div>';
+
+    }else{
+        if ($REV||$DATE_AT){
+            $data = array('rev' => &$REV, 'date_at' => &$DATE_AT);
+            trigger_event('HTML_SHOWREV_OUTPUT', $data, 'html_showrev');
+        }
+        $html = p_wiki_xhtml($ID,$REV,true,$DATE_AT);
+        $html = html_secedit($html,$secedit);
+        if($INFO['prependTOC']) $html = tpl_toc(true).$html;
+        $html = html_hilight($html,$HIGH);
+        echo $html;
+    }
+}
+
+/**
+ * ask the user about how to handle an exisiting draft
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+function html_draft(){
+    global $INFO;
+    global $ID;
+    global $lang;
+    $draft = unserialize(io_readFile($INFO['draft'],false));
+    $text  = cleanText(con($draft['prefix'],$draft['text'],$draft['suffix'],true));
+
+    print p_locale_xhtml('draft');
+    html_diff($text, false);
+    $form = new Doku_Form(array('id' => 'dw__editform'));
+    $form->addHidden('id', $ID);
+    $form->addHidden('date', $draft['date']);
+    $form->addHidden('wikitext', $text);
+    $form->addElement(form_makeOpenTag('div', array('id'=>'draft__status')));
+    $form->addElement($lang['draftdate'].' '. dformat(filemtime($INFO['draft'])));
+    $form->addElement(form_makeCloseTag('div'));
+    $form->addElement(form_makeButton('submit', 'recover', $lang['btn_recover'], array('tabindex'=>'1')));
+    $form->addElement(form_makeButton('submit', 'draftdel', $lang['btn_draftdel'], array('tabindex'=>'2')));
+    $form->addElement(form_makeButton('submit', 'show', $lang['btn_cancel'], array('tabindex'=>'3')));
+    html_form('draft', $form);
+}
+
+/**
+ * Highlights searchqueries in HTML code
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @author Harry Fuecks <hfuecks@gmail.com>
+ *
+ * @param string $html
+ * @param array|string $phrases
+ * @return string html
+ */
+function html_hilight($html,$phrases){
+    $phrases = (array) $phrases;
+    $phrases = array_map('preg_quote_cb', $phrases);
+    $phrases = array_map('ft_snippet_re_preprocess', $phrases);
+    $phrases = array_filter($phrases);
+    $regex = join('|',$phrases);
+
+    if ($regex === '') return $html;
+    if (!utf8_check($regex)) return $html;
+    $html = @preg_replace_callback("/((<[^>]*)|$regex)/ui",'html_hilight_callback',$html);
+    return $html;
+}
+
+/**
+ * Callback used by html_hilight()
+ *
+ * @author Harry Fuecks <hfuecks@gmail.com>
+ *
+ * @param array $m matches
+ * @return string html
+ */
+function html_hilight_callback($m) {
+    $hlight = unslash($m[0]);
+    if ( !isset($m[2])) {
+        $hlight = '<span class="search_hit">'.$hlight.'</span>';
+    }
+    return $hlight;
+}
+
+/**
+ * Display error on locked pages
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+function html_locked(){
+    global $ID;
+    global $conf;
+    global $lang;
+    global $INFO;
+
+    $locktime = filemtime(wikiLockFN($ID));
+    $expire = dformat($locktime + $conf['locktime']);
+    $min    = round(($conf['locktime'] - (time() - $locktime) )/60);
+
+    print p_locale_xhtml('locked');
+    print '<ul>';
+    print '<li><div class="li"><strong>'.$lang['lockedby'].'</strong> '.editorinfo($INFO['locked']).'</div></li>';
+    print '<li><div class="li"><strong>'.$lang['lockexpire'].'</strong> '.$expire.' ('.$min.' min)</div></li>';
+    print '</ul>';
+}
+
+/**
+ * list old revisions
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @author Ben Coburn <btcoburn@silicodon.net>
+ * @author Kate Arzamastseva <pshns@ukr.net>
+ *
+ * @param int $first skip the first n changelog lines
+ * @param bool|string $media_id id of media, or false for current page
+ */
+function html_revisions($first=0, $media_id = false){
+    global $ID;
+    global $INFO;
+    global $conf;
+    global $lang;
+    $id = $ID;
+    if ($media_id) {
+        $id = $media_id;
+        $changelog = new MediaChangeLog($id);
+    } else {
+        $changelog = new PageChangeLog($id);
+    }
+
+    /* we need to get one additional log entry to be able to
+     * decide if this is the last page or is there another one.
+     * see html_recent()
+     */
+
+    $revisions = $changelog->getRevisions($first, $conf['recent']+1);
+
+    if(count($revisions)==0 && $first!=0){
+        $first=0;
+        $revisions = $changelog->getRevisions($first, $conf['recent']+1);
+    }
+    $hasNext = false;
+    if (count($revisions)>$conf['recent']) {
+        $hasNext = true;
+        array_pop($revisions); // remove extra log entry
+    }
+
+    if (!$media_id) print p_locale_xhtml('revisions');
+
+    $params = array('id' => 'page__revisions', 'class' => 'changes');
+    if($media_id) {
+        $params['action'] = media_managerURL(array('image' => $media_id), '&');
+    }
+
+    if(!$media_id) {
+        $exists = $INFO['exists'];
+        $display_name = useHeading('navigation') ? hsc(p_get_first_heading($id)) : $id;
+        if(!$display_name) {
+            $display_name = $id;
+        }
+    } else {
+        $exists = file_exists(mediaFN($id));
+        $display_name = $id;
+    }
+
+    $form = new Doku_Form($params);
+    $form->addElement(form_makeOpenTag('ul'));
+
+    if($exists && $first == 0) {
+        $minor = false;
+        if($media_id) {
+            $date = dformat(@filemtime(mediaFN($id)));
+            $href = media_managerURL(array('image' => $id, 'tab_details' => 'view'), '&');
+
+            $changelog->setChunkSize(1024);
+            $revinfo = $changelog->getRevisionInfo(@filemtime(fullpath(mediaFN($id))));
+
+            $summary = $revinfo['sum'];
+            if($revinfo['user']) {
+                $editor = $revinfo['user'];
+            } else {
+                $editor = $revinfo['ip'];
+            }
+            $sizechange = $revinfo['sizechange'];
+        } else {
+            $date = dformat($INFO['lastmod']);
+            if(isset($INFO['meta']) && isset($INFO['meta']['last_change'])) {
+                if($INFO['meta']['last_change']['type'] === DOKU_CHANGE_TYPE_MINOR_EDIT) {
+                    $minor = true;
+                }
+                if(isset($INFO['meta']['last_change']['sizechange'])) {
+                    $sizechange = $INFO['meta']['last_change']['sizechange'];
+                } else {
+                    $sizechange = null;
+                }
+            }
+            $pagelog = new PageChangeLog($ID);
+            $latestrev = $pagelog->getRevisions(-1, 1);
+            $latestrev = array_pop($latestrev);
+            $href = wl($id,"rev=$latestrev",false,'&');
+            $summary = $INFO['sum'];
+            $editor = $INFO['editor'];
+        }
+
+        $form->addElement(form_makeOpenTag('li', array('class' => ($minor ? 'minor' : ''))));
+        $form->addElement(form_makeOpenTag('div', array('class' => 'li')));
+        $form->addElement(form_makeTag('input', array(
+                        'type' => 'checkbox',
+                        'name' => 'rev2[]',
+                        'value' => 'current')));
+
+        $form->addElement(form_makeOpenTag('span', array('class' => 'date')));
+        $form->addElement($date);
+        $form->addElement(form_makeCloseTag('span'));
+
+        $form->addElement('<img src="'.DOKU_BASE.'lib/images/blank.gif" width="15" height="11" alt="" />');
+
+        $form->addElement(form_makeOpenTag('a', array(
+                        'class' => 'wikilink1',
+                        'href'  => $href)));
+        $form->addElement($display_name);
+        $form->addElement(form_makeCloseTag('a'));
+
+        if ($media_id) $form->addElement(form_makeOpenTag('div'));
+
+        if($summary) {
+            $form->addElement(form_makeOpenTag('span', array('class' => 'sum')));
+            if(!$media_id) $form->addElement(' – ');
+            $form->addElement('<bdi>' . hsc($summary) . '</bdi>');
+            $form->addElement(form_makeCloseTag('span'));
+        }
+
+        $form->addElement(form_makeOpenTag('span', array('class' => 'user')));
+        $form->addElement((empty($editor))?('('.$lang['external_edit'].')'):'<bdi>'.editorinfo($editor).'</bdi>');
+        $form->addElement(form_makeCloseTag('span'));
+
+        html_sizechange($sizechange, $form);
+
+        $form->addElement('('.$lang['current'].')');
+
+        if ($media_id) $form->addElement(form_makeCloseTag('div'));
+
+        $form->addElement(form_makeCloseTag('div'));
+        $form->addElement(form_makeCloseTag('li'));
+    }
+
+    foreach($revisions as $rev) {
+        $date = dformat($rev);
+        $info = $changelog->getRevisionInfo($rev);
+        if($media_id) {
+            $exists = file_exists(mediaFN($id, $rev));
+        } else {
+            $exists = page_exists($id, $rev);
+        }
+
+        $class = '';
+        if($info['type'] === DOKU_CHANGE_TYPE_MINOR_EDIT) {
+            $class = 'minor';
+        }
+        $form->addElement(form_makeOpenTag('li', array('class' => $class)));
+        $form->addElement(form_makeOpenTag('div', array('class' => 'li')));
+        if($exists){
+            $form->addElement(form_makeTag('input', array(
+                            'type' => 'checkbox',
+                            'name' => 'rev2[]',
+                            'value' => $rev)));
+        }else{
+            $form->addElement('<img src="'.DOKU_BASE.'lib/images/blank.gif" width="15" height="11" alt="" />');
+        }
+
+        $form->addElement(form_makeOpenTag('span', array('class' => 'date')));
+        $form->addElement($date);
+        $form->addElement(form_makeCloseTag('span'));
+
+        if($exists){
+            if (!$media_id) {
+                $href = wl($id,"rev=$rev,do=diff", false, '&');
+            } else {
+                $href = media_managerURL(array('image' => $id, 'rev' => $rev, 'mediado' => 'diff'), '&');
+            }
+            $form->addElement(form_makeOpenTag('a', array(
+                            'class' => 'diff_link',
+                            'href' => $href)));
+            $form->addElement(form_makeTag('img', array(
+                            'src'    => DOKU_BASE.'lib/images/diff.png',
+                            'width'  => 15,
+                            'height' => 11,
+                            'title'  => $lang['diff'],
+                            'alt'    => $lang['diff'])));
+            $form->addElement(form_makeCloseTag('a'));
+
+            if (!$media_id) {
+                $href = wl($id,"rev=$rev",false,'&');
+            } else {
+                $href = media_managerURL(array('image' => $id, 'tab_details' => 'view', 'rev' => $rev), '&');
+            }
+            $form->addElement(form_makeOpenTag('a', array(
+                            'class' => 'wikilink1',
+                            'href' => $href)));
+            $form->addElement($display_name);
+            $form->addElement(form_makeCloseTag('a'));
+        }else{
+            $form->addElement('<img src="'.DOKU_BASE.'lib/images/blank.gif" width="15" height="11" alt="" />');
+            $form->addElement($display_name);
+        }
+
+        if ($media_id) $form->addElement(form_makeOpenTag('div'));
+
+        if ($info['sum']) {
+            $form->addElement(form_makeOpenTag('span', array('class' => 'sum')));
+            if(!$media_id) $form->addElement(' – ');
+            $form->addElement('<bdi>'.hsc($info['sum']).'</bdi>');
+            $form->addElement(form_makeCloseTag('span'));
+        }
+
+        $form->addElement(form_makeOpenTag('span', array('class' => 'user')));
+        if($info['user']){
+            $form->addElement('<bdi>'.editorinfo($info['user']).'</bdi>');
+            if(auth_ismanager()){
+                $form->addElement(' <bdo dir="ltr">('.$info['ip'].')</bdo>');
+            }
+        }else{
+            $form->addElement('<bdo dir="ltr">'.$info['ip'].'</bdo>');
+        }
+        $form->addElement(form_makeCloseTag('span'));
+
+        html_sizechange($info['sizechange'], $form);
+
+        if ($media_id) $form->addElement(form_makeCloseTag('div'));
+
+        $form->addElement(form_makeCloseTag('div'));
+        $form->addElement(form_makeCloseTag('li'));
+    }
+    $form->addElement(form_makeCloseTag('ul'));
+    if (!$media_id) {
+        $form->addElement(form_makeButton('submit', 'diff', $lang['diff2']));
+    } else {
+        $form->addHidden('mediado', 'diff');
+        $form->addElement(form_makeButton('submit', '', $lang['diff2']));
+    }
+    html_form('revisions', $form);
+
+    print '<div class="pagenav">';
+    $last = $first + $conf['recent'];
+    if ($first > 0) {
+        $first -= $conf['recent'];
+        if ($first < 0) $first = 0;
+        print '<div class="pagenav-prev">';
+        if ($media_id) {
+            print html_btn('newer',$media_id,"p",media_managerURL(array('first' => $first), '&amp;', false, true));
+        } else {
+            print html_btn('newer',$id,"p",array('do' => 'revisions', 'first' => $first));
+        }
+        print '</div>';
+    }
+    if ($hasNext) {
+        print '<div class="pagenav-next">';
+        if ($media_id) {
+            print html_btn('older',$media_id,"n",media_managerURL(array('first' => $last), '&amp;', false, true));
+        } else {
+            print html_btn('older',$id,"n",array('do' => 'revisions', 'first' => $last));
+        }
+        print '</div>';
+    }
+    print '</div>';
+
+}
+
+/**
+ * display recent changes
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
+ * @author Ben Coburn <btcoburn@silicodon.net>
+ * @author Kate Arzamastseva <pshns@ukr.net>
+ *
+ * @param int $first
+ * @param string $show_changes
+ */
+function html_recent($first = 0, $show_changes = 'both') {
+    global $conf;
+    global $lang;
+    global $ID;
+    /* we need to get one additionally log entry to be able to
+     * decide if this is the last page or is there another one.
+     * This is the cheapest solution to get this information.
+     */
+    $flags = 0;
+    if($show_changes == 'mediafiles' && $conf['mediarevisions']) {
+        $flags = RECENTS_MEDIA_CHANGES;
+    } elseif($show_changes == 'pages') {
+        $flags = 0;
+    } elseif($conf['mediarevisions']) {
+        $show_changes = 'both';
+        $flags = RECENTS_MEDIA_PAGES_MIXED;
+    }
+
+    $recents = getRecents($first, $conf['recent'] + 1, getNS($ID), $flags);
+    if(count($recents) == 0 && $first != 0) {
+        $first = 0;
+        $recents = getRecents($first, $conf['recent'] + 1, getNS($ID), $flags);
+    }
+    $hasNext = false;
+    if(count($recents) > $conf['recent']) {
+        $hasNext = true;
+        array_pop($recents); // remove extra log entry
+    }
+
+    print p_locale_xhtml('recent');
+
+    if(getNS($ID) != '') {
+        print '<div class="level1"><p>' . sprintf($lang['recent_global'], getNS($ID), wl('', 'do=recent')) . '</p></div>';
+    }
+
+    $form = new Doku_Form(array('id' => 'dw__recent', 'method' => 'GET', 'class' => 'changes'));
+    $form->addHidden('sectok', null);
+    $form->addHidden('do', 'recent');
+    $form->addHidden('id', $ID);
+
+    if($conf['mediarevisions']) {
+        $form->addElement('<div class="changeType">');
+        $form->addElement(form_makeListboxField(
+                    'show_changes',
+                    array(
+                        'pages'      => $lang['pages_changes'],
+                        'mediafiles' => $lang['media_changes'],
+                        'both'       => $lang['both_changes']
+                    ),
+                    $show_changes,
+                    $lang['changes_type'],
+                    '', '',
+                    array('class' => 'quickselect')));
+
+        $form->addElement(form_makeButton('submit', 'recent', $lang['btn_apply']));
+        $form->addElement('</div>');
+    }
+
+    $form->addElement(form_makeOpenTag('ul'));
+
+    foreach($recents as $recent) {
+        $date = dformat($recent['date']);
+
+        $class = '';
+        if($recent['type'] === DOKU_CHANGE_TYPE_MINOR_EDIT) {
+            $class = 'minor';
+        }
+        $form->addElement(form_makeOpenTag('li', array('class' => $class)));
+        $form->addElement(form_makeOpenTag('div', array('class' => 'li')));
+
+        if(!empty($recent['media'])) {
+            $form->addElement(media_printicon($recent['id']));
+        } else {
+            $icon = DOKU_BASE . 'lib/images/fileicons/file.png';
+            $form->addElement('<img src="' . $icon . '" alt="' . $recent['id'] . '" class="icon" />');
+        }
+
+        $form->addElement(form_makeOpenTag('span', array('class' => 'date')));
+        $form->addElement($date);
+        $form->addElement(form_makeCloseTag('span'));
+
+        $diff = false;
+        $href = '';
+
+        if(!empty($recent['media'])) {
+            $changelog = new MediaChangeLog($recent['id']);
+            $revs = $changelog->getRevisions(0, 1);
+            $diff = (count($revs) && file_exists(mediaFN($recent['id'])));
+            if($diff) {
+                $href = media_managerURL(array(
+                                            'tab_details' => 'history',
+                                            'mediado' => 'diff',
+                                            'image' => $recent['id'],
+                                            'ns' => getNS($recent['id'])
+                                        ), '&');
+            }
+        } else {
+            $href = wl($recent['id'], "do=diff", false, '&');
+        }
+
+        if(!empty($recent['media']) && !$diff) {
+            $form->addElement('<img src="' . DOKU_BASE . 'lib/images/blank.gif" width="15" height="11" alt="" />');
+        } else {
+            $form->addElement(form_makeOpenTag('a', array('class' => 'diff_link', 'href' => $href)));
+            $form->addElement(form_makeTag('img', array(
+                            'src'    => DOKU_BASE . 'lib/images/diff.png',
+                            'width'  => 15,
+                            'height' => 11,
+                            'title'  => $lang['diff'],
+                            'alt'    => $lang['diff']
+                        )));
+            $form->addElement(form_makeCloseTag('a'));
+        }
+
+        if(!empty($recent['media'])) {
+            $href = media_managerURL(array('tab_details' => 'history', 'image' => $recent['id'], 'ns' => getNS($recent['id'])), '&');
+        } else {
+            $href = wl($recent['id'], "do=revisions", false, '&');
+        }
+        $form->addElement(form_makeOpenTag('a', array(
+                        'class' => 'revisions_link',
+                        'href'  => $href)));
+        $form->addElement(form_makeTag('img', array(
+                        'src'    => DOKU_BASE . 'lib/images/history.png',
+                        'width'  => 12,
+                        'height' => 14,
+                        'title'  => $lang['btn_revs'],
+                        'alt'    => $lang['btn_revs']
+                    )));
+        $form->addElement(form_makeCloseTag('a'));
+
+        if(!empty($recent['media'])) {
+            $href = media_managerURL(array('tab_details' => 'view', 'image' => $recent['id'], 'ns' => getNS($recent['id'])), '&');
+            $class = file_exists(mediaFN($recent['id'])) ? 'wikilink1' : 'wikilink2';
+            $form->addElement(form_makeOpenTag('a', array(
+                        'class' => $class,
+                        'href'  => $href)));
+            $form->addElement($recent['id']);
+            $form->addElement(form_makeCloseTag('a'));
+        } else {
+            $form->addElement(html_wikilink(':' . $recent['id'], useHeading('navigation') ? null : $recent['id']));
+        }
+        $form->addElement(form_makeOpenTag('span', array('class' => 'sum')));
+        $form->addElement(' – ' . hsc($recent['sum']));
+        $form->addElement(form_makeCloseTag('span'));
+
+        $form->addElement(form_makeOpenTag('span', array('class' => 'user')));
+        if($recent['user']) {
+            $form->addElement('<bdi>' . editorinfo($recent['user']) . '</bdi>');
+            if(auth_ismanager()) {
+                $form->addElement(' <bdo dir="ltr">(' . $recent['ip'] . ')</bdo>');
+            }
+        } else {
+            $form->addElement('<bdo dir="ltr">' . $recent['ip'] . '</bdo>');
+        }
+        $form->addElement(form_makeCloseTag('span'));
+
+        html_sizechange($recent['sizechange'], $form);
+
+        $form->addElement(form_makeCloseTag('div'));
+        $form->addElement(form_makeCloseTag('li'));
+    }
+    $form->addElement(form_makeCloseTag('ul'));
+
+    $form->addElement(form_makeOpenTag('div', array('class' => 'pagenav')));
+    $last = $first + $conf['recent'];
+    if($first > 0) {
+        $first -= $conf['recent'];
+        if($first < 0) $first = 0;
+        $form->addElement(form_makeOpenTag('div', array('class' => 'pagenav-prev')));
+        $form->addElement(form_makeOpenTag('button', array(
+                        'type'      => 'submit',
+                        'name'      => 'first[' . $first . ']',
+                        'accesskey' => 'n',
+                        'title'     => $lang['btn_newer'] . ' [N]',
+                        'class'     => 'button show'
+                    )));
+        $form->addElement($lang['btn_newer']);
+        $form->addElement(form_makeCloseTag('button'));
+        $form->addElement(form_makeCloseTag('div'));
+    }
+    if($hasNext) {
+        $form->addElement(form_makeOpenTag('div', array('class' => 'pagenav-next')));
+        $form->addElement(form_makeOpenTag('button', array(
+                        'type'      => 'submit',
+                        'name'      => 'first[' . $last . ']',
+                        'accesskey' => 'p',
+                        'title'     => $lang['btn_older'] . ' [P]',
+                        'class'     => 'button show'
+                    )));
+        $form->addElement($lang['btn_older']);
+        $form->addElement(form_makeCloseTag('button'));
+        $form->addElement(form_makeCloseTag('div'));
+    }
+    $form->addElement(form_makeCloseTag('div'));
+    html_form('recent', $form);
+}
+
+/**
+ * Display page index
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param string $ns
+ */
+function html_index($ns){
+    global $conf;
+    global $ID;
+    $ns  = cleanID($ns);
+    if(empty($ns)){
+        $ns = getNS($ID);
+        if($ns === false) $ns ='';
+    }
+    $ns  = utf8_encodeFN(str_replace(':','/',$ns));
+
+    echo p_locale_xhtml('index');
+    echo '<div id="index__tree" class="index__tree">';
+
+    $data = array();
+    search($data,$conf['datadir'],'search_index',array('ns' => $ns));
+    echo html_buildlist($data,'idx','html_list_index','html_li_index');
+
+    echo '</div>';
+}
+
+/**
+ * Index item formatter
+ *
+ * User function for html_buildlist()
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param array $item
+ * @return string
+ */
+function html_list_index($item){
+    global $ID, $conf;
+
+    // prevent searchbots needlessly following links
+    $nofollow = ($ID != $conf['start'] || $conf['sitemap']) ? ' rel="nofollow"' : '';
+
+    $ret = '';
+    $base = ':'.$item['id'];
+    $base = substr($base,strrpos($base,':')+1);
+    if($item['type']=='d'){
+        // FS#2766, no need for search bots to follow namespace links in the index
+        $ret .= '<a href="'.wl($ID,'idx='.rawurlencode($item['id'])).'" title="' . $item['id'] . '" class="idx_dir"' . $nofollow . '><strong>';
+        $ret .= $base;
+        $ret .= '</strong></a>';
+    }else{
+        // default is noNSorNS($id), but we want noNS($id) when useheading is off FS#2605
+        $ret .= html_wikilink(':'.$item['id'], useHeading('navigation') ? null : noNS($item['id']));
+    }
+    return $ret;
+}
+
+/**
+ * Index List item
+ *
+ * This user function is used in html_buildlist to build the
+ * <li> tags for namespaces when displaying the page index
+ * it gives different classes to opened or closed "folders"
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param array $item
+ * @return string html
+ */
+function html_li_index($item){
+    global $INFO;
+    global $ACT;
+
+    $class = '';
+    $id = '';
+
+    if($item['type'] == "f"){
+        // scroll to the current item
+        if($item['id'] == $INFO['id'] && $ACT == 'index') {
+            $id = ' id="scroll__here"';
+            $class = ' bounce';
+        }
+        return '<li class="level'.$item['level'].$class.'" '.$id.'>';
+    }elseif($item['open']){
+        return '<li class="open">';
+    }else{
+        return '<li class="closed">';
+    }
+}
+
+/**
+ * Default List item
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param array $item
+ * @return string html
+ */
+function html_li_default($item){
+    return '<li class="level'.$item['level'].'">';
+}
+
+/**
+ * Build an unordered list
+ *
+ * Build an unordered list from the given $data array
+ * Each item in the array has to have a 'level' property
+ * the item itself gets printed by the given $func user
+ * function. The second and optional function is used to
+ * print the <li> tag. Both user function need to accept
+ * a single item.
+ *
+ * Both user functions can be given as array to point to
+ * a member of an object.
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param array    $data  array with item arrays
+ * @param string   $class class of ul wrapper
+ * @param callable $func  callback to print an list item
+ * @param callable $lifunc callback to the opening li tag
+ * @param bool     $forcewrapper Trigger building a wrapper ul if the first level is
+ *                               0 (we have a root object) or 1 (just the root content)
+ * @return string html of an unordered list
+ */
+function html_buildlist($data,$class,$func,$lifunc='html_li_default',$forcewrapper=false){
+    if (count($data) === 0) {
+        return '';
+    }
+
+    $firstElement = reset($data);
+    $start_level = $firstElement['level'];
+    $level = $start_level;
+    $ret   = '';
+    $open  = 0;
+
+    foreach ($data as $item){
+
+        if( $item['level'] > $level ){
+            //open new list
+            for($i=0; $i<($item['level'] - $level); $i++){
+                if ($i) $ret .= "<li class=\"clear\">";
+                $ret .= "\n<ul class=\"$class\">\n";
+                $open++;
+            }
+            $level = $item['level'];
+
+        }elseif( $item['level'] < $level ){
+            //close last item
+            $ret .= "</li>\n";
+            while( $level > $item['level'] && $open > 0 ){
+                //close higher lists
+                $ret .= "</ul>\n</li>\n";
+                $level--;
+                $open--;
+            }
+        } elseif ($ret !== '') {
+            //close previous item
+            $ret .= "</li>\n";
+        }
+
+        //print item
+        $ret .= call_user_func($lifunc,$item);
+        $ret .= '<div class="li">';
+
+        $ret .= call_user_func($func,$item);
+        $ret .= '</div>';
+    }
+
+    //close remaining items and lists
+    $ret .= "</li>\n";
+    while($open-- > 0) {
+        $ret .= "</ul></li>\n";
+    }
+
+    if ($forcewrapper || $start_level < 2) {
+        // Trigger building a wrapper ul if the first level is
+        // 0 (we have a root object) or 1 (just the root content)
+        $ret = "\n<ul class=\"$class\">\n".$ret."</ul>\n";
+    }
+
+    return $ret;
+}
+
+/**
+ * display backlinks
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @author Michael Klier <chi@chimeric.de>
+ */
+function html_backlinks(){
+    global $ID;
+    global $lang;
+
+    print p_locale_xhtml('backlinks');
+
+    $data = ft_backlinks($ID);
+
+    if(!empty($data)) {
+        print '<ul class="idx">';
+        foreach($data as $blink){
+            print '<li><div class="li">';
+            print html_wikilink(':'.$blink,useHeading('navigation')?null:$blink);
+            print '</div></li>';
+        }
+        print '</ul>';
+    } else {
+        print '<div class="level1"><p>' . $lang['nothingfound'] . '</p></div>';
+    }
+}
+
+/**
+ * Get header of diff HTML
+ *
+ * @param string $l_rev   Left revisions
+ * @param string $r_rev   Right revision
+ * @param string $id      Page id, if null $ID is used
+ * @param bool   $media   If it is for media files
+ * @param bool   $inline  Return the header on a single line
+ * @return string[] HTML snippets for diff header
+ */
+function html_diff_head($l_rev, $r_rev, $id = null, $media = false, $inline = false) {
+    global $lang;
+    if ($id === null) {
+        global $ID;
+        $id = $ID;
+    }
+    $head_separator = $inline ? ' ' : '<br />';
+    $media_or_wikiFN = $media ? 'mediaFN' : 'wikiFN';
+    $ml_or_wl = $media ? 'ml' : 'wl';
+    $l_minor = $r_minor = '';
+
+    if($media) {
+        $changelog = new MediaChangeLog($id);
+    } else {
+        $changelog = new PageChangeLog($id);
+    }
+    if(!$l_rev){
+        $l_head = '&mdash;';
+    }else{
+        $l_info   = $changelog->getRevisionInfo($l_rev);
+        if($l_info['user']){
+            $l_user = '<bdi>'.editorinfo($l_info['user']).'</bdi>';
+            if(auth_ismanager()) $l_user .= ' <bdo dir="ltr">('.$l_info['ip'].')</bdo>';
+        } else {
+            $l_user = '<bdo dir="ltr">'.$l_info['ip'].'</bdo>';
+        }
+        $l_user  = '<span class="user">'.$l_user.'</span>';
+        $l_sum   = ($l_info['sum']) ? '<span class="sum"><bdi>'.hsc($l_info['sum']).'</bdi></span>' : '';
+        if ($l_info['type']===DOKU_CHANGE_TYPE_MINOR_EDIT) $l_minor = 'class="minor"';
+
+        $l_head_title = ($media) ? dformat($l_rev) : $id.' ['.dformat($l_rev).']';
+        $l_head = '<bdi><a class="wikilink1" href="'.$ml_or_wl($id,"rev=$l_rev").'">'.
+        $l_head_title.'</a></bdi>'.
+        $head_separator.$l_user.' '.$l_sum;
+    }
+
+    if($r_rev){
+        $r_info   = $changelog->getRevisionInfo($r_rev);
+        if($r_info['user']){
+            $r_user = '<bdi>'.editorinfo($r_info['user']).'</bdi>';
+            if(auth_ismanager()) $r_user .= ' <bdo dir="ltr">('.$r_info['ip'].')</bdo>';
+        } else {
+            $r_user = '<bdo dir="ltr">'.$r_info['ip'].'</bdo>';
+        }
+        $r_user = '<span class="user">'.$r_user.'</span>';
+        $r_sum  = ($r_info['sum']) ? '<span class="sum"><bdi>'.hsc($r_info['sum']).'</bdi></span>' : '';
+        if ($r_info['type']===DOKU_CHANGE_TYPE_MINOR_EDIT) $r_minor = 'class="minor"';
+
+        $r_head_title = ($media) ? dformat($r_rev) : $id.' ['.dformat($r_rev).']';
+        $r_head = '<bdi><a class="wikilink1" href="'.$ml_or_wl($id,"rev=$r_rev").'">'.
+        $r_head_title.'</a></bdi>'.
+        $head_separator.$r_user.' '.$r_sum;
+    }elseif($_rev = @filemtime($media_or_wikiFN($id))){
+        $_info   = $changelog->getRevisionInfo($_rev);
+        if($_info['user']){
+            $_user = '<bdi>'.editorinfo($_info['user']).'</bdi>';
+            if(auth_ismanager()) $_user .= ' <bdo dir="ltr">('.$_info['ip'].')</bdo>';
+        } else {
+            $_user = '<bdo dir="ltr">'.$_info['ip'].'</bdo>';
+        }
+        $_user = '<span class="user">'.$_user.'</span>';
+        $_sum  = ($_info['sum']) ? '<span class="sum"><bdi>'.hsc($_info['sum']).'</span></bdi>' : '';
+        if ($_info['type']===DOKU_CHANGE_TYPE_MINOR_EDIT) $r_minor = 'class="minor"';
+
+        $r_head_title = ($media) ? dformat($_rev) : $id.' ['.dformat($_rev).']';
+        $r_head  = '<bdi><a class="wikilink1" href="'.$ml_or_wl($id).'">'.
+        $r_head_title.'</a></bdi> '.
+        '('.$lang['current'].')'.
+        $head_separator.$_user.' '.$_sum;
+    }else{
+        $r_head = '&mdash; ('.$lang['current'].')';
+    }
+
+    return array($l_head, $r_head, $l_minor, $r_minor);
+}
+
+/**
+ * Show diff
+ * between current page version and provided $text
+ * or between the revisions provided via GET or POST
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @param  string $text  when non-empty: compare with this text with most current version
+ * @param  bool   $intro display the intro text
+ * @param  string $type  type of the diff (inline or sidebyside)
+ */
+function html_diff($text = '', $intro = true, $type = null) {
+    global $ID;
+    global $REV;
+    global $lang;
+    global $INPUT;
+    global $INFO;
+    $pagelog = new PageChangeLog($ID);
+
+    /*
+     * Determine diff type
+     */
+    if(!$type) {
+        $type = $INPUT->str('difftype');
+        if(empty($type)) {
+            $type = get_doku_pref('difftype', $type);
+            if(empty($type) && $INFO['ismobile']) {
+                $type = 'inline';
+            }
+        }
+    }
+    if($type != 'inline') $type = 'sidebyside';
+
+    /*
+     * Determine requested revision(s)
+     */
+    // we're trying to be clever here, revisions to compare can be either
+    // given as rev and rev2 parameters, with rev2 being optional. Or in an
+    // array in rev2.
+    $rev1 = $REV;
+
+    $rev2 = $INPUT->ref('rev2');
+    if(is_array($rev2)) {
+        $rev1 = (int) $rev2[0];
+        $rev2 = (int) $rev2[1];
+
+        if(!$rev1) {
+            $rev1 = $rev2;
+            unset($rev2);
+        }
+    } else {
+        $rev2 = $INPUT->int('rev2');
+    }
+
+    /*
+     * Determine left and right revision, its texts and the header
+     */
+    $r_minor = '';
+    $l_minor = '';
+
+    if($text) { // compare text to the most current revision
+        $l_rev = '';
+        $l_text = rawWiki($ID, '');
+        $l_head = '<a class="wikilink1" href="' . wl($ID) . '">' .
+            $ID . ' ' . dformat((int) @filemtime(wikiFN($ID))) . '</a> ' .
+            $lang['current'];
+
+        $r_rev = '';
+        $r_text = cleanText($text);
+        $r_head = $lang['yours'];
+    } else {
+        if($rev1 && isset($rev2) && $rev2) { // two specific revisions wanted
+            // make sure order is correct (older on the left)
+            if($rev1 < $rev2) {
+                $l_rev = $rev1;
+                $r_rev = $rev2;
+            } else {
+                $l_rev = $rev2;
+                $r_rev = $rev1;
+            }
+        } elseif($rev1) { // single revision given, compare to current
+            $r_rev = '';
+            $l_rev = $rev1;
+        } else { // no revision was given, compare previous to current
+            $r_rev = '';
+            $revs = $pagelog->getRevisions(0, 1);
+            $l_rev = $revs[0];
+            $REV = $l_rev; // store revision back in $REV
+        }
+
+        // when both revisions are empty then the page was created just now
+        if(!$l_rev && !$r_rev) {
+            $l_text = '';
+        } else {
+            $l_text = rawWiki($ID, $l_rev);
+        }
+        $r_text = rawWiki($ID, $r_rev);
+
+        list($l_head, $r_head, $l_minor, $r_minor) = html_diff_head($l_rev, $r_rev, null, false, $type == 'inline');
+    }
+
+    /*
+     * Build navigation
+     */
+    $l_nav = '';
+    $r_nav = '';
+    if(!$text) {
+        list($l_nav, $r_nav) = html_diff_navigation($pagelog, $type, $l_rev, $r_rev);
+    }
+    /*
+     * Create diff object and the formatter
+     */
+    $diff = new Diff(explode("\n", $l_text), explode("\n", $r_text));
+
+    if($type == 'inline') {
+        $diffformatter = new InlineDiffFormatter();
+    } else {
+        $diffformatter = new TableDiffFormatter();
+    }
+    /*
+     * Display intro
+     */
+    if($intro) print p_locale_xhtml('diff');
+
+    /*
+     * Display type and exact reference
+     */
+    if(!$text) {
+        ptln('<div class="diffoptions group">');
+
+
+        $form = new Doku_Form(array('action' => wl()));
+        $form->addHidden('id', $ID);
+        $form->addHidden('rev2[0]', $l_rev);
+        $form->addHidden('rev2[1]', $r_rev);
+        $form->addHidden('do', 'diff');
+        $form->addElement(
+             form_makeListboxField(
+                 'difftype',
+                 array(
+                     'sidebyside' => $lang['diff_side'],
+                     'inline' => $lang['diff_inline']
+                 ),
+                 $type,
+                 $lang['diff_type'],
+                 '', '',
+                 array('class' => 'quickselect')
+             )
+        );
+        $form->addElement(form_makeButton('submit', 'diff', 'Go'));
+        $form->printForm();
+
+        ptln('<p>');
+        // link to exactly this view FS#2835
+        echo html_diff_navigationlink($type, 'difflink', $l_rev, $r_rev ? $r_rev : $INFO['currentrev']);
+        ptln('</p>');
+
+        ptln('</div>'); // .diffoptions
+    }
+
+    /*
+     * Display diff view table
+     */
+    ?>
+    <div class="table">
+    <table class="diff diff_<?php echo $type ?>">
+
+        <?php
+        //navigation and header
+        if($type == 'inline') {
+            if(!$text) { ?>
+                <tr>
+                    <td class="diff-lineheader">-</td>
+                    <td class="diffnav"><?php echo $l_nav ?></td>
+                </tr>
+                <tr>
+                    <th class="diff-lineheader">-</th>
+                    <th <?php echo $l_minor ?>>
+                        <?php echo $l_head ?>
+                    </th>
+                </tr>
+            <?php } ?>
+            <tr>
+                <td class="diff-lineheader">+</td>
+                <td class="diffnav"><?php echo $r_nav ?></td>
+            </tr>
+            <tr>
+                <th class="diff-lineheader">+</th>
+                <th <?php echo $r_minor ?>>
+                    <?php echo $r_head ?>
+                </th>
+            </tr>
+        <?php } else {
+            if(!$text) { ?>
+                <tr>
+                    <td colspan="2" class="diffnav"><?php echo $l_nav ?></td>
+                    <td colspan="2" class="diffnav"><?php echo $r_nav ?></td>
+                </tr>
+            <?php } ?>
+            <tr>
+                <th colspan="2" <?php echo $l_minor ?>>
+                    <?php echo $l_head ?>
+                </th>
+                <th colspan="2" <?php echo $r_minor ?>>
+                    <?php echo $r_head ?>
+                </th>
+            </tr>
+        <?php }
+
+        //diff view
+        echo html_insert_softbreaks($diffformatter->format($diff)); ?>
+
+    </table>
+    </div>
+<?php
+}
+
+/**
+ * Create html for revision navigation
+ *
+ * @param PageChangeLog $pagelog changelog object of current page
+ * @param string        $type    inline vs sidebyside
+ * @param int           $l_rev   left revision timestamp
+ * @param int           $r_rev   right revision timestamp
+ * @return string[] html of left and right navigation elements
+ */
+function html_diff_navigation($pagelog, $type, $l_rev, $r_rev) {
+    global $INFO, $ID;
+
+    // last timestamp is not in changelog, retrieve timestamp from metadata
+    // note: when page is removed, the metadata timestamp is zero
+    if(!$r_rev) {
+        if(isset($INFO['meta']['last_change']['date'])) {
+            $r_rev = $INFO['meta']['last_change']['date'];
+        } else {
+            $r_rev = 0;
+        }
+    }
+
+    //retrieve revisions with additional info
+    list($l_revs, $r_revs) = $pagelog->getRevisionsAround($l_rev, $r_rev);
+    $l_revisions = array();
+    if(!$l_rev) {
+        $l_revisions[0] = array(0, "", false); //no left revision given, add dummy
+    }
+    foreach($l_revs as $rev) {
+        $info = $pagelog->getRevisionInfo($rev);
+        $l_revisions[$rev] = array(
+            $rev,
+            dformat($info['date']) . ' ' . editorinfo($info['user'], true) . ' ' . $info['sum'],
+            $r_rev ? $rev >= $r_rev : false //disable?
+        );
+    }
+    $r_revisions = array();
+    if(!$r_rev) {
+        $r_revisions[0] = array(0, "", false); //no right revision given, add dummy
+    }
+    foreach($r_revs as $rev) {
+        $info = $pagelog->getRevisionInfo($rev);
+        $r_revisions[$rev] = array(
+            $rev,
+            dformat($info['date']) . ' ' . editorinfo($info['user'], true) . ' ' . $info['sum'],
+            $rev <= $l_rev //disable?
+        );
+    }
+
+    //determine previous/next revisions
+    $l_index = array_search($l_rev, $l_revs);
+    $l_prev = $l_revs[$l_index + 1];
+    $l_next = $l_revs[$l_index - 1];
+    if($r_rev) {
+        $r_index = array_search($r_rev, $r_revs);
+        $r_prev = $r_revs[$r_index + 1];
+        $r_next = $r_revs[$r_index - 1];
+    } else {
+        //removed page
+        if($l_next) {
+            $r_prev = $r_revs[0];
+        } else {
+            $r_prev = null;
+        }
+        $r_next = null;
+    }
+
+    /*
+     * Left side:
+     */
+    $l_nav = '';
+    //move back
+    if($l_prev) {
+        $l_nav .= html_diff_navigationlink($type, 'diffbothprevrev', $l_prev, $r_prev);
+        $l_nav .= html_diff_navigationlink($type, 'diffprevrev', $l_prev, $r_rev);
+    }
+    //dropdown
+    $form = new Doku_Form(array('action' => wl()));
+    $form->addHidden('id', $ID);
+    $form->addHidden('difftype', $type);
+    $form->addHidden('rev2[1]', $r_rev);
+    $form->addHidden('do', 'diff');
+    $form->addElement(
+         form_makeListboxField(
+             'rev2[0]',
+             $l_revisions,
+             $l_rev,
+             '', '', '',
+             array('class' => 'quickselect')
+         )
+    );
+    $form->addElement(form_makeButton('submit', 'diff', 'Go'));
+    $l_nav .= $form->getForm();
+    //move forward
+    if($l_next && ($l_next < $r_rev || !$r_rev)) {
+        $l_nav .= html_diff_navigationlink($type, 'diffnextrev', $l_next, $r_rev);
+    }
+
+    /*
+     * Right side:
+     */
+    $r_nav = '';
+    //move back
+    if($l_rev < $r_prev) {
+        $r_nav .= html_diff_navigationlink($type, 'diffprevrev', $l_rev, $r_prev);
+    }
+    //dropdown
+    $form = new Doku_Form(array('action' => wl()));
+    $form->addHidden('id', $ID);
+    $form->addHidden('rev2[0]', $l_rev);
+    $form->addHidden('difftype', $type);
+    $form->addHidden('do', 'diff');
+    $form->addElement(
+         form_makeListboxField(
+             'rev2[1]',
+             $r_revisions,
+             $r_rev,
+             '', '', '',
+             array('class' => 'quickselect')
+         )
+    );
+    $form->addElement(form_makeButton('submit', 'diff', 'Go'));
+    $r_nav .= $form->getForm();
+    //move forward
+    if($r_next) {
+        if($pagelog->isCurrentRevision($r_next)) {
+            $r_nav .= html_diff_navigationlink($type, 'difflastrev', $l_rev); //last revision is diff with current page
+        } else {
+            $r_nav .= html_diff_navigationlink($type, 'diffnextrev', $l_rev, $r_next);
+        }
+        $r_nav .= html_diff_navigationlink($type, 'diffbothnextrev', $l_next, $r_next);
+    }
+    return array($l_nav, $r_nav);
+}
+
+/**
+ * Create html link to a diff defined by two revisions
+ *
+ * @param string $difftype display type
+ * @param string $linktype
+ * @param int $lrev oldest revision
+ * @param int $rrev newest revision or null for diff with current revision
+ * @return string html of link to a diff
+ */
+function html_diff_navigationlink($difftype, $linktype, $lrev, $rrev = null) {
+    global $ID, $lang;
+    if(!$rrev) {
+        $urlparam = array(
+            'do' => 'diff',
+            'rev' => $lrev,
+            'difftype' => $difftype,
+        );
+    } else {
+        $urlparam = array(
+            'do' => 'diff',
+            'rev2[0]' => $lrev,
+            'rev2[1]' => $rrev,
+            'difftype' => $difftype,
+        );
+    }
+    return  '<a class="' . $linktype . '" href="' . wl($ID, $urlparam) . '" title="' . $lang[$linktype] . '">' .
+                '<span>' . $lang[$linktype] . '</span>' .
+            '</a>' . "\n";
+}
+
+/**
+ * Insert soft breaks in diff html
+ *
+ * @param string $diffhtml
+ * @return string
+ */
+function html_insert_softbreaks($diffhtml) {
+    // search the diff html string for both:
+    // - html tags, so these can be ignored
+    // - long strings of characters without breaking characters
+    return preg_replace_callback('/<[^>]*>|[^<> ]{12,}/','html_softbreak_callback',$diffhtml);
+}
+
+/**
+ * callback which adds softbreaks
+ *
+ * @param array $match array with first the complete match
+ * @return string the replacement
+ */
+function html_softbreak_callback($match){
+    // if match is an html tag, return it intact
+    if ($match[0]{0} == '<') return $match[0];
+
+    // its a long string without a breaking character,
+    // make certain characters into breaking characters by inserting a
+    // breaking character (zero length space, U+200B / #8203) in front them.
+    $regex = <<< REGEX
+(?(?=                                 # start a conditional expression with a positive look ahead ...
+&\#?\\w{1,6};)                        # ... for html entities - we don't want to split them (ok to catch some invalid combinations)
+&\#?\\w{1,6};                         # yes pattern - a quicker match for the html entity, since we know we have one
+|
+[?/,&\#;:]                            # no pattern - any other group of 'special' characters to insert a breaking character after
+)+                                    # end conditional expression
+REGEX;
+
+    return preg_replace('<'.$regex.'>xu','\0&#8203;',$match[0]);
+}
+
+/**
+ * show warning on conflict detection
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param string $text
+ * @param string $summary
+ */
+function html_conflict($text,$summary){
+    global $ID;
+    global $lang;
+
+    print p_locale_xhtml('conflict');
+    $form = new Doku_Form(array('id' => 'dw__editform'));
+    $form->addHidden('id', $ID);
+    $form->addHidden('wikitext', $text);
+    $form->addHidden('summary', $summary);
+    $form->addElement(form_makeButton('submit', 'save', $lang['btn_save'], array('accesskey'=>'s')));
+    $form->addElement(form_makeButton('submit', 'cancel', $lang['btn_cancel']));
+    html_form('conflict', $form);
+    print '<br /><br /><br /><br />'.NL;
+}
+
+/**
+ * Prints the global message array
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+function html_msgarea(){
+    global $MSG, $MSG_shown;
+    /** @var array $MSG */
+    // store if the global $MSG has already been shown and thus HTML output has been started
+    $MSG_shown = true;
+
+    if(!isset($MSG)) return;
+
+    $shown = array();
+    foreach($MSG as $msg){
+        $hash = md5($msg['msg']);
+        if(isset($shown[$hash])) continue; // skip double messages
+        if(info_msg_allowed($msg)){
+            print '<div class="'.$msg['lvl'].'">';
+            print $msg['msg'];
+            print '</div>';
+        }
+        $shown[$hash] = 1;
+    }
+
+    unset($GLOBALS['MSG']);
+}
+
+/**
+ * Prints the registration form
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+function html_register(){
+    global $lang;
+    global $conf;
+    global $INPUT;
+
+    $base_attrs = array('size'=>50,'required'=>'required');
+    $email_attrs = $base_attrs + array('type'=>'email','class'=>'edit');
+
+    print p_locale_xhtml('register');
+    print '<div class="centeralign">'.NL;
+    $form = new Doku_Form(array('id' => 'dw__register'));
+    $form->startFieldset($lang['btn_register']);
+    $form->addHidden('do', 'register');
+    $form->addHidden('save', '1');
+    $form->addElement(form_makeTextField('login', $INPUT->post->str('login'), $lang['user'], '', 'block', $base_attrs));
+    if (!$conf['autopasswd']) {
+        $form->addElement(form_makePasswordField('pass', $lang['pass'], '', 'block', $base_attrs));
+        $form->addElement(form_makePasswordField('passchk', $lang['passchk'], '', 'block', $base_attrs));
+    }
+    $form->addElement(form_makeTextField('fullname', $INPUT->post->str('fullname'), $lang['fullname'], '', 'block', $base_attrs));
+    $form->addElement(form_makeField('email','email', $INPUT->post->str('email'), $lang['email'], '', 'block', $email_attrs));
+    $form->addElement(form_makeButton('submit', '', $lang['btn_register']));
+    $form->endFieldset();
+    html_form('register', $form);
+
+    print '</div>'.NL;
+}
+
+/**
+ * Print the update profile form
+ *
+ * @author Christopher Smith <chris@jalakai.co.uk>
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+function html_updateprofile(){
+    global $lang;
+    global $conf;
+    global $INPUT;
+    global $INFO;
+    /** @var DokuWiki_Auth_Plugin $auth */
+    global $auth;
+
+    print p_locale_xhtml('updateprofile');
+    print '<div class="centeralign">'.NL;
+
+    $fullname = $INPUT->post->str('fullname', $INFO['userinfo']['name'], true);
+    $email = $INPUT->post->str('email', $INFO['userinfo']['mail'], true);
+    $form = new Doku_Form(array('id' => 'dw__register'));
+    $form->startFieldset($lang['profile']);
+    $form->addHidden('do', 'profile');
+    $form->addHidden('save', '1');
+    $form->addElement(form_makeTextField('login', $_SERVER['REMOTE_USER'], $lang['user'], '', 'block', array('size'=>'50', 'disabled'=>'disabled')));
+    $attr = array('size'=>'50');
+    if (!$auth->canDo('modName')) $attr['disabled'] = 'disabled';
+    $form->addElement(form_makeTextField('fullname', $fullname, $lang['fullname'], '', 'block', $attr));
+    $attr = array('size'=>'50', 'class'=>'edit');
+    if (!$auth->canDo('modMail')) $attr['disabled'] = 'disabled';
+    $form->addElement(form_makeField('email','email', $email, $lang['email'], '', 'block', $attr));
+    $form->addElement(form_makeTag('br'));
+    if ($auth->canDo('modPass')) {
+        $form->addElement(form_makePasswordField('newpass', $lang['newpass'], '', 'block', array('size'=>'50')));
+        $form->addElement(form_makePasswordField('passchk', $lang['passchk'], '', 'block', array('size'=>'50')));
+    }
+    if ($conf['profileconfirm']) {
+        $form->addElement(form_makeTag('br'));
+        $form->addElement(form_makePasswordField('oldpass', $lang['oldpass'], '', 'block', array('size'=>'50', 'required' => 'required')));
+    }
+    $form->addElement(form_makeButton('submit', '', $lang['btn_save']));
+    $form->addElement(form_makeButton('reset', '', $lang['btn_reset']));
+
+    $form->endFieldset();
+    html_form('updateprofile', $form);
+
+    if ($auth->canDo('delUser') && actionOK('profile_delete')) {
+        $form_profiledelete = new Doku_Form(array('id' => 'dw__profiledelete'));
+        $form_profiledelete->startFieldset($lang['profdeleteuser']);
+        $form_profiledelete->addHidden('do', 'profile_delete');
+        $form_profiledelete->addHidden('delete', '1');
+        $form_profiledelete->addElement(form_makeCheckboxField('confirm_delete', '1', $lang['profconfdelete'],'dw__confirmdelete','', array('required' => 'required')));
+        if ($conf['profileconfirm']) {
+            $form_profiledelete->addElement(form_makeTag('br'));
+            $form_profiledelete->addElement(form_makePasswordField('oldpass', $lang['oldpass'], '', 'block', array('size'=>'50', 'required' => 'required')));
+        }
+        $form_profiledelete->addElement(form_makeButton('submit', '', $lang['btn_deleteuser']));
+        $form_profiledelete->endFieldset();
+
+        html_form('profiledelete', $form_profiledelete);
+    }
+
+    print '</div>'.NL;
+}
+
+/**
+ * Preprocess edit form data
+ *
+ * @author   Andreas Gohr <andi@splitbrain.org>
+ *
+ * @triggers HTML_EDITFORM_OUTPUT
+ */
+function html_edit(){
+    global $INPUT;
+    global $ID;
+    global $REV;
+    global $DATE;
+    global $PRE;
+    global $SUF;
+    global $INFO;
+    global $SUM;
+    global $lang;
+    global $conf;
+    global $TEXT;
+
+    if ($INPUT->has('changecheck')) {
+        $check = $INPUT->str('changecheck');
+    } elseif(!$INFO['exists']){
+        // $TEXT has been loaded from page template
+        $check = md5('');
+    } else {
+        $check = md5($TEXT);
+    }
+    $mod = md5($TEXT) !== $check;
+
+    $wr = $INFO['writable'] && !$INFO['locked'];
+    $include = 'edit';
+    if($wr){
+        if ($REV) $include = 'editrev';
+    }else{
+        // check pseudo action 'source'
+        if(!actionOK('source')){
+            msg('Command disabled: source',-1);
+            return;
+        }
+        $include = 'read';
+    }
+
+    global $license;
+
+    $form = new Doku_Form(array('id' => 'dw__editform'));
+    $form->addHidden('id', $ID);
+    $form->addHidden('rev', $REV);
+    $form->addHidden('date', $DATE);
+    $form->addHidden('prefix', $PRE . '.');
+    $form->addHidden('suffix', $SUF);
+    $form->addHidden('changecheck', $check);
+
+    $data = array('form' => $form,
+                  'wr'   => $wr,
+                  'media_manager' => true,
+                  'target' => ($INPUT->has('target') && $wr) ? $INPUT->str('target') : 'section',
+                  'intro_locale' => $include);
+
+    if ($data['target'] !== 'section') {
+        // Only emit event if page is writable, section edit data is valid and
+        // edit target is not section.
+        trigger_event('HTML_EDIT_FORMSELECTION', $data, 'html_edit_form', true);
+    } else {
+        html_edit_form($data);
+    }
+    if (isset($data['intro_locale'])) {
+        echo p_locale_xhtml($data['intro_locale']);
+    }
+
+    $form->addHidden('target', $data['target']);
+    if ($INPUT->has('hid')) {
+        $form->addHidden('hid', $INPUT->str('hid'));
+    }
+    if ($INPUT->has('codeblockOffset')) {
+        $form->addHidden('codeblockOffset', $INPUT->str('codeblockOffset'));
+    }
+    $form->addElement(form_makeOpenTag('div', array('id'=>'wiki__editbar', 'class'=>'editBar')));
+    $form->addElement(form_makeOpenTag('div', array('id'=>'size__ctl')));
+    $form->addElement(form_makeCloseTag('div'));
+    if ($wr) {
+        $form->addElement(form_makeOpenTag('div', array('class'=>'editButtons')));
+        $form->addElement(form_makeButton('submit', 'save', $lang['btn_save'], array('id'=>'edbtn__save', 'accesskey'=>'s', 'tabindex'=>'4')));
+        $form->addElement(form_makeButton('submit', 'preview', $lang['btn_preview'], array('id'=>'edbtn__preview', 'accesskey'=>'p', 'tabindex'=>'5')));
+        $form->addElement(form_makeButton('submit', 'cancel', $lang['btn_cancel'], array('tabindex'=>'6')));
+        $form->addElement(form_makeCloseTag('div'));
+        $form->addElement(form_makeOpenTag('div', array('class'=>'summary')));
+        $form->addElement(form_makeTextField('summary', $SUM, $lang['summary'], 'edit__summary', 'nowrap', array('size'=>'50', 'tabindex'=>'2')));
+        $elem = html_minoredit();
+        if ($elem) $form->addElement($elem);
+        $form->addElement(form_makeCloseTag('div'));
+    }
+    $form->addElement(form_makeCloseTag('div'));
+    if($wr && $conf['license']){
+        $form->addElement(form_makeOpenTag('div', array('class'=>'license')));
+        $out  = $lang['licenseok'];
+        $out .= ' <a href="'.$license[$conf['license']]['url'].'" rel="license" class="urlextern"';
+        if($conf['target']['extern']) $out .= ' target="'.$conf['target']['extern'].'"';
+        $out .= '>'.$license[$conf['license']]['name'].'</a>';
+        $form->addElement($out);
+        $form->addElement(form_makeCloseTag('div'));
+    }
+
+    if ($wr) {
+        // sets changed to true when previewed
+        echo '<script type="text/javascript">/*<![CDATA[*/'. NL;
+        echo 'textChanged = ' . ($mod ? 'true' : 'false');
+        echo '/*!]]>*/</script>' . NL;
+    } ?>
+    <div class="editBox" role="application">
+
+    <div class="toolbar group">
+        <div id="draft__status" class="draft__status"><?php if(!empty($INFO['draft'])) echo $lang['draftdate'].' '.dformat();?></div>
+        <div id="tool__bar" class="tool__bar"><?php if ($wr && $data['media_manager']){?><a href="<?php echo DOKU_BASE?>lib/exe/mediamanager.php?ns=<?php echo $INFO['namespace']?>"
+            target="_blank"><?php echo $lang['mediaselect'] ?></a><?php }?></div>
+    </div>
+    <?php
+
+    html_form('edit', $form);
+    print '</div>'.NL;
+}
+
+/**
+ * Display the default edit form
+ *
+ * Is the default action for HTML_EDIT_FORMSELECTION.
+ *
+ * @param mixed[] $param
+ */
+function html_edit_form($param) {
+    global $TEXT;
+
+    if ($param['target'] !== 'section') {
+        msg('No editor for edit target ' . hsc($param['target']) . ' found.', -1);
+    }
+
+    $attr = array('tabindex'=>'1');
+    if (!$param['wr']) $attr['readonly'] = 'readonly';
+
+    $param['form']->addElement(form_makeWikiText($TEXT, $attr));
+}
+
+/**
+ * Adds a checkbox for minor edits for logged in users
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @return array|bool
+ */
+function html_minoredit(){
+    global $conf;
+    global $lang;
+    global $INPUT;
+    // minor edits are for logged in users only
+    if(!$conf['useacl'] || !$_SERVER['REMOTE_USER']){
+        return false;
+    }
+
+    $p = array();
+    $p['tabindex'] = 3;
+    if($INPUT->bool('minor')) $p['checked']='checked';
+    return form_makeCheckboxField('minor', '1', $lang['minoredit'], 'minoredit', 'nowrap', $p);
+}
+
+/**
+ * prints some debug info
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+function html_debug(){
+    global $conf;
+    global $lang;
+    /** @var DokuWiki_Auth_Plugin $auth */
+    global $auth;
+    global $INFO;
+
+    //remove sensitive data
+    $cnf = $conf;
+    debug_guard($cnf);
+    $nfo = $INFO;
+    debug_guard($nfo);
+    $ses = $_SESSION;
+    debug_guard($ses);
+
+    print '<html><body>';
+
+    print '<p>When reporting bugs please send all the following ';
+    print 'output as a mail to andi@splitbrain.org ';
+    print 'The best way to do this is to save this page in your browser</p>';
+
+    print '<b>$INFO:</b><pre>';
+    print_r($nfo);
+    print '</pre>';
+
+    print '<b>$_SERVER:</b><pre>';
+    print_r($_SERVER);
+    print '</pre>';
+
+    print '<b>$conf:</b><pre>';
+    print_r($cnf);
+    print '</pre>';
+
+    print '<b>DOKU_BASE:</b><pre>';
+    print DOKU_BASE;
+    print '</pre>';
+
+    print '<b>abs DOKU_BASE:</b><pre>';
+    print DOKU_URL;
+    print '</pre>';
+
+    print '<b>rel DOKU_BASE:</b><pre>';
+    print dirname($_SERVER['PHP_SELF']).'/';
+    print '</pre>';
+
+    print '<b>PHP Version:</b><pre>';
+    print phpversion();
+    print '</pre>';
+
+    print '<b>locale:</b><pre>';
+    print setlocale(LC_ALL,0);
+    print '</pre>';
+
+    print '<b>encoding:</b><pre>';
+    print $lang['encoding'];
+    print '</pre>';
+
+    if($auth){
+        print '<b>Auth backend capabilities:</b><pre>';
+        foreach ($auth->getCapabilities() as $cando){
+            print '   '.str_pad($cando,16) . ' => ' . (int)$auth->canDo($cando) . NL;
+        }
+        print '</pre>';
+    }
+
+    print '<b>$_SESSION:</b><pre>';
+    print_r($ses);
+    print '</pre>';
+
+    print '<b>Environment:</b><pre>';
+    print_r($_ENV);
+    print '</pre>';
+
+    print '<b>PHP settings:</b><pre>';
+    $inis = ini_get_all();
+    print_r($inis);
+    print '</pre>';
+
+    if (function_exists('apache_get_version')) {
+        $apache = array();
+        $apache['version'] = apache_get_version();
+
+        if (function_exists('apache_get_modules')) {
+            $apache['modules'] = apache_get_modules();
+        }
+        print '<b>Apache</b><pre>';
+        print_r($apache);
+        print '</pre>';
+    }
+
+    print '</body></html>';
+}
+
+/**
+ * Form to request a new password for an existing account
+ *
+ * @author Benoit Chesneau <benoit@bchesneau.info>
+ * @author Andreas Gohr <gohr@cosmocode.de>
+ */
+function html_resendpwd() {
+    global $lang;
+    global $conf;
+    global $INPUT;
+
+    $token = preg_replace('/[^a-f0-9]+/','',$INPUT->str('pwauth'));
+
+    if(!$conf['autopasswd'] && $token){
+        print p_locale_xhtml('resetpwd');
+        print '<div class="centeralign">'.NL;
+        $form = new Doku_Form(array('id' => 'dw__resendpwd'));
+        $form->startFieldset($lang['btn_resendpwd']);
+        $form->addHidden('token', $token);
+        $form->addHidden('do', 'resendpwd');
+
+        $form->addElement(form_makePasswordField('pass', $lang['pass'], '', 'block', array('size'=>'50')));
+        $form->addElement(form_makePasswordField('passchk', $lang['passchk'], '', 'block', array('size'=>'50')));
+
+        $form->addElement(form_makeButton('submit', '', $lang['btn_resendpwd']));
+        $form->endFieldset();
+        html_form('resendpwd', $form);
+        print '</div>'.NL;
+    }else{
+        print p_locale_xhtml('resendpwd');
+        print '<div class="centeralign">'.NL;
+        $form = new Doku_Form(array('id' => 'dw__resendpwd'));
+        $form->startFieldset($lang['resendpwd']);
+        $form->addHidden('do', 'resendpwd');
+        $form->addHidden('save', '1');
+        $form->addElement(form_makeTag('br'));
+        $form->addElement(form_makeTextField('login', $INPUT->post->str('login'), $lang['user'], '', 'block'));
+        $form->addElement(form_makeTag('br'));
+        $form->addElement(form_makeTag('br'));
+        $form->addElement(form_makeButton('submit', '', $lang['btn_resendpwd']));
+        $form->endFieldset();
+        html_form('resendpwd', $form);
+        print '</div>'.NL;
+    }
+}
+
+/**
+ * Return the TOC rendered to XHTML
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param array $toc
+ * @return string html
+ */
+function html_TOC($toc){
+    if(!count($toc)) return '';
+    global $lang;
+    $out  = '<!-- TOC START -->'.DOKU_LF;
+    $out .= '<div id="dw__toc" class="dw__toc">'.DOKU_LF;
+    $out .= '<h3 class="toggle">';
+    $out .= $lang['toc'];
+    $out .= '</h3>'.DOKU_LF;
+    $out .= '<div>'.DOKU_LF;
+    $out .= html_buildlist($toc,'toc','html_list_toc','html_li_default',true);
+    $out .= '</div>'.DOKU_LF.'</div>'.DOKU_LF;
+    $out .= '<!-- TOC END -->'.DOKU_LF;
+    return $out;
+}
+
+/**
+ * Callback for html_buildlist
+ *
+ * @param array $item
+ * @return string html
+ */
+function html_list_toc($item){
+    if(isset($item['hid'])){
+        $link = '#'.$item['hid'];
+    }else{
+        $link = $item['link'];
+    }
+
+    return '<a href="'.$link.'">'.hsc($item['title']).'</a>';
+}
+
+/**
+ * Helper function to build TOC items
+ *
+ * Returns an array ready to be added to a TOC array
+ *
+ * @param string $link  - where to link (if $hash set to '#' it's a local anchor)
+ * @param string $text  - what to display in the TOC
+ * @param int    $level - nesting level
+ * @param string $hash  - is prepended to the given $link, set blank if you want full links
+ * @return array the toc item
+ */
+function html_mktocitem($link, $text, $level, $hash='#'){
+    return  array( 'link'  => $hash.$link,
+            'title' => $text,
+            'type'  => 'ul',
+            'level' => $level);
+}
+
+/**
+ * Output a Doku_Form object.
+ * Triggers an event with the form name: HTML_{$name}FORM_OUTPUT
+ *
+ * @author Tom N Harris <tnharris@whoopdedo.org>
+ *
+ * @param string     $name The name of the form
+ * @param Doku_Form  $form The form
+ */
+function html_form($name, &$form) {
+    // Safety check in case the caller forgets.
+    $form->endFieldset();
+    trigger_event('HTML_'.strtoupper($name).'FORM_OUTPUT', $form, 'html_form_output', false);
+}
+
+/**
+ * Form print function.
+ * Just calls printForm() on the data object.
+ *
+ * @param Doku_Form $data The form
+ */
+function html_form_output($data) {
+    $data->printForm();
+}
+
+/**
+ * Embed a flash object in HTML
+ *
+ * This will create the needed HTML to embed a flash movie in a cross browser
+ * compatble way using valid XHTML
+ *
+ * The parameters $params, $flashvars and $atts need to be associative arrays.
+ * No escaping needs to be done for them. The alternative content *has* to be
+ * escaped because it is used as is. If no alternative content is given
+ * $lang['noflash'] is used.
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @link   http://latrine.dgx.cz/how-to-correctly-insert-a-flash-into-xhtml
+ *
+ * @param string $swf      - the SWF movie to embed
+ * @param int $width       - width of the flash movie in pixels
+ * @param int $height      - height of the flash movie in pixels
+ * @param array $params    - additional parameters (<param>)
+ * @param array $flashvars - parameters to be passed in the flashvar parameter
+ * @param array $atts      - additional attributes for the <object> tag
+ * @param string $alt      - alternative content (is NOT automatically escaped!)
+ * @return string         - the XHTML markup
+ */
+function html_flashobject($swf,$width,$height,$params=null,$flashvars=null,$atts=null,$alt=''){
+    global $lang;
+
+    $out = '';
+
+    // prepare the object attributes
+    if(is_null($atts)) $atts = array();
+    $atts['width']  = (int) $width;
+    $atts['height'] = (int) $height;
+    if(!$atts['width'])  $atts['width']  = 425;
+    if(!$atts['height']) $atts['height'] = 350;
+
+    // add object attributes for standard compliant browsers
+    $std = $atts;
+    $std['type'] = 'application/x-shockwave-flash';
+    $std['data'] = $swf;
+
+    // add object attributes for IE
+    $ie  = $atts;
+    $ie['classid'] = 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000';
+
+    // open object (with conditional comments)
+    $out .= '<!--[if !IE]> -->'.NL;
+    $out .= '<object '.buildAttributes($std).'>'.NL;
+    $out .= '<!-- <![endif]-->'.NL;
+    $out .= '<!--[if IE]>'.NL;
+    $out .= '<object '.buildAttributes($ie).'>'.NL;
+    $out .= '    <param name="movie" value="'.hsc($swf).'" />'.NL;
+    $out .= '<!--><!-- -->'.NL;
+
+    // print params
+    if(is_array($params)) foreach($params as $key => $val){
+        $out .= '  <param name="'.hsc($key).'" value="'.hsc($val).'" />'.NL;
+    }
+
+    // add flashvars
+    if(is_array($flashvars)){
+        $out .= '  <param name="FlashVars" value="'.buildURLparams($flashvars).'" />'.NL;
+    }
+
+    // alternative content
+    if($alt){
+        $out .= $alt.NL;
+    }else{
+        $out .= $lang['noflash'].NL;
+    }
+
+    // finish
+    $out .= '</object>'.NL;
+    $out .= '<!-- <![endif]-->'.NL;
+
+    return $out;
+}
+
+/**
+ * Prints HTML code for the given tab structure
+ *
+ * @param array  $tabs        tab structure
+ * @param string $current_tab the current tab id
+ */
+function html_tabs($tabs, $current_tab = null) {
+    echo '<ul class="tabs">'.NL;
+
+    foreach($tabs as $id => $tab) {
+        html_tab($tab['href'], $tab['caption'], $id === $current_tab);
+    }
+
+    echo '</ul>'.NL;
+}
+
+/**
+ * Prints a single tab
+ *
+ * @author Kate Arzamastseva <pshns@ukr.net>
+ * @author Adrian Lang <mail@adrianlang.de>
+ *
+ * @param string $href - tab href
+ * @param string $caption - tab caption
+ * @param boolean $selected - is tab selected
+ */
+
+function html_tab($href, $caption, $selected=false) {
+    $tab = '<li>';
+    if ($selected) {
+        $tab .= '<strong>';
+    } else {
+        $tab .= '<a href="' . hsc($href) . '">';
+    }
+    $tab .= hsc($caption)
+         .  '</' . ($selected ? 'strong' : 'a') . '>'
+         .  '</li>'.NL;
+    echo $tab;
+}
+
+/**
+ * Display size change
+ *
+ * @param int $sizechange - size of change in Bytes
+ * @param Doku_Form $form - form to add elements to
+ */
+
+function html_sizechange($sizechange, Doku_Form $form) {
+    if(isset($sizechange)) {
+        $class = 'sizechange';
+        $value = filesize_h(abs($sizechange));
+        if($sizechange > 0) {
+            $class .= ' positive';
+            $value = '+' . $value;
+        } elseif($sizechange < 0) {
+            $class .= ' negative';
+            $value = '-' . $value;
+        } else {
+            $value = '±' . $value;
+        }
+        $form->addElement(form_makeOpenTag('span', array('class' => $class)));
+        $form->addElement($value);
+        $form->addElement(form_makeCloseTag('span'));
+    }
+}
diff --git a/wiki/inc/httputils.php b/wiki/inc/httputils.php
new file mode 100644
index 0000000..c365f4f
--- /dev/null
+++ b/wiki/inc/httputils.php
@@ -0,0 +1,346 @@
+<?php
+/**
+ * Utilities for handling HTTP related tasks
+ *
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author     Andreas Gohr <andi@splitbrain.org>
+ */
+
+define('HTTP_MULTIPART_BOUNDARY','D0KuW1K1B0uNDARY');
+define('HTTP_HEADER_LF',"\r\n");
+define('HTTP_CHUNK_SIZE',16*1024);
+
+/**
+ * Checks and sets HTTP headers for conditional HTTP requests
+ *
+ * @author   Simon Willison <swillison@gmail.com>
+ * @link     http://simonwillison.net/2003/Apr/23/conditionalGet/
+ *
+ * @param    int $timestamp lastmodified time of the cache file
+ * @returns  void or exits with previously header() commands executed
+ */
+function http_conditionalRequest($timestamp){
+    // A PHP implementation of conditional get, see
+    //   http://fishbowl.pastiche.org/2002/10/21/http_conditional_get_for_rss_hackers/
+    $last_modified = substr(gmdate('r', $timestamp), 0, -5).'GMT';
+    $etag = '"'.md5($last_modified).'"';
+    // Send the headers
+    header("Last-Modified: $last_modified");
+    header("ETag: $etag");
+    // See if the client has provided the required headers
+    if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])){
+        $if_modified_since = stripslashes($_SERVER['HTTP_IF_MODIFIED_SINCE']);
+    }else{
+        $if_modified_since = false;
+    }
+
+    if (isset($_SERVER['HTTP_IF_NONE_MATCH'])){
+        $if_none_match = stripslashes($_SERVER['HTTP_IF_NONE_MATCH']);
+    }else{
+        $if_none_match = false;
+    }
+
+    if (!$if_modified_since && !$if_none_match){
+        return;
+    }
+
+    // At least one of the headers is there - check them
+    if ($if_none_match && $if_none_match != $etag) {
+        return; // etag is there but doesn't match
+    }
+
+    if ($if_modified_since && $if_modified_since != $last_modified) {
+        return; // if-modified-since is there but doesn't match
+    }
+
+    // Nothing has changed since their last request - serve a 304 and exit
+    header('HTTP/1.0 304 Not Modified');
+
+    // don't produce output, even if compression is on
+    @ob_end_clean();
+    exit;
+}
+
+/**
+ * Let the webserver send the given file via x-sendfile method
+ *
+ * @author Chris Smith <chris@jalakai.co.uk>
+ *
+ * @param string $file absolute path of file to send
+ * @returns  void or exits with previous header() commands executed
+ */
+function http_sendfile($file) {
+    global $conf;
+
+    //use x-sendfile header to pass the delivery to compatible web servers
+    if($conf['xsendfile'] == 1){
+        header("X-LIGHTTPD-send-file: $file");
+        ob_end_clean();
+        exit;
+    }elseif($conf['xsendfile'] == 2){
+        header("X-Sendfile: $file");
+        ob_end_clean();
+        exit;
+    }elseif($conf['xsendfile'] == 3){
+        // FS#2388 nginx just needs the relative path.
+        $file = DOKU_REL.substr($file, strlen(fullpath(DOKU_INC)) + 1);
+        header("X-Accel-Redirect: $file");
+        ob_end_clean();
+        exit;
+    }
+}
+
+/**
+ * Send file contents supporting rangeRequests
+ *
+ * This function exits the running script
+ *
+ * @param resource $fh - file handle for an already open file
+ * @param int $size     - size of the whole file
+ * @param int $mime     - MIME type of the file
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+function http_rangeRequest($fh,$size,$mime){
+    $ranges  = array();
+    $isrange = false;
+
+    header('Accept-Ranges: bytes');
+
+    if(!isset($_SERVER['HTTP_RANGE'])){
+        // no range requested - send the whole file
+        $ranges[] = array(0,$size,$size);
+    }else{
+        $t = explode('=', $_SERVER['HTTP_RANGE']);
+        if (!$t[0]=='bytes') {
+            // we only understand byte ranges - send the whole file
+            $ranges[] = array(0,$size,$size);
+        }else{
+            $isrange = true;
+            // handle multiple ranges
+            $r = explode(',',$t[1]);
+            foreach($r as $x){
+                $p = explode('-', $x);
+                $start = (int)$p[0];
+                $end   = (int)$p[1];
+                if (!$end) $end = $size - 1;
+                if ($start > $end || $start > $size || $end > $size){
+                    header('HTTP/1.1 416 Requested Range Not Satisfiable');
+                    print 'Bad Range Request!';
+                    exit;
+                }
+                $len = $end - $start + 1;
+                $ranges[] = array($start,$end,$len);
+            }
+        }
+    }
+    $parts = count($ranges);
+
+    // now send the type and length headers
+    if(!$isrange){
+        header("Content-Type: $mime",true);
+    }else{
+        header('HTTP/1.1 206 Partial Content');
+        if($parts == 1){
+            header("Content-Type: $mime",true);
+        }else{
+            header('Content-Type: multipart/byteranges; boundary='.HTTP_MULTIPART_BOUNDARY,true);
+        }
+    }
+
+    // send all ranges
+    for($i=0; $i<$parts; $i++){
+        list($start,$end,$len) = $ranges[$i];
+
+        // multipart or normal headers
+        if($parts > 1){
+            echo HTTP_HEADER_LF.'--'.HTTP_MULTIPART_BOUNDARY.HTTP_HEADER_LF;
+            echo "Content-Type: $mime".HTTP_HEADER_LF;
+            echo "Content-Range: bytes $start-$end/$size".HTTP_HEADER_LF;
+            echo HTTP_HEADER_LF;
+        }else{
+            header("Content-Length: $len");
+            if($isrange){
+                header("Content-Range: bytes $start-$end/$size");
+            }
+        }
+
+        // send file content
+        fseek($fh,$start); //seek to start of range
+        $chunk = ($len > HTTP_CHUNK_SIZE) ? HTTP_CHUNK_SIZE : $len;
+        while (!feof($fh) && $chunk > 0) {
+            @set_time_limit(30); // large files can take a lot of time
+            print fread($fh, $chunk);
+            flush();
+            $len -= $chunk;
+            $chunk = ($len > HTTP_CHUNK_SIZE) ? HTTP_CHUNK_SIZE : $len;
+        }
+    }
+    if($parts > 1){
+        echo HTTP_HEADER_LF.'--'.HTTP_MULTIPART_BOUNDARY.'--'.HTTP_HEADER_LF;
+    }
+
+    // everything should be done here, exit (or return if testing)
+    if (defined('SIMPLE_TEST')) return;
+    exit;
+}
+
+/**
+ * Check for a gzipped version and create if necessary
+ *
+ * return true if there exists a gzip version of the uncompressed file
+ * (samepath/samefilename.sameext.gz) created after the uncompressed file
+ *
+ * @author Chris Smith <chris.eureka@jalakai.co.uk>
+ *
+ * @param string $uncompressed_file
+ * @return bool
+ */
+function http_gzip_valid($uncompressed_file) {
+    if(!DOKU_HAS_GZIP) return false;
+
+    $gzip = $uncompressed_file.'.gz';
+    if (filemtime($gzip) < filemtime($uncompressed_file)) {    // filemtime returns false (0) if file doesn't exist
+        return copy($uncompressed_file, 'compress.zlib://'.$gzip);
+    }
+
+    return true;
+}
+
+/**
+ * Set HTTP headers and echo cachefile, if useable
+ *
+ * This function handles output of cacheable resource files. It ses the needed
+ * HTTP headers. If a useable cache is present, it is passed to the web server
+ * and the script is terminated.
+ *
+ * @param string $cache cache file name
+ * @param bool   $cache_ok    if cache can be used
+ */
+function http_cached($cache, $cache_ok) {
+    global $conf;
+
+    // check cache age & handle conditional request
+    // since the resource files are timestamped, we can use a long max age: 1 year
+    header('Cache-Control: public, max-age=31536000');
+    header('Pragma: public');
+    if($cache_ok){
+        http_conditionalRequest(filemtime($cache));
+        if($conf['allowdebug']) header("X-CacheUsed: $cache");
+
+        // finally send output
+        if ($conf['gzip_output'] && http_gzip_valid($cache)) {
+            header('Vary: Accept-Encoding');
+            header('Content-Encoding: gzip');
+            readfile($cache.".gz");
+        } else {
+            http_sendfile($cache);
+            readfile($cache);
+        }
+        exit;
+    }
+
+    http_conditionalRequest(time());
+}
+
+/**
+ * Cache content and print it
+ *
+ * @param string $file file name
+ * @param string $content
+ */
+function http_cached_finish($file, $content) {
+    global $conf;
+
+    // save cache file
+    io_saveFile($file, $content);
+    if(DOKU_HAS_GZIP) io_saveFile("$file.gz",$content);
+
+    // finally send output
+    if ($conf['gzip_output'] && DOKU_HAS_GZIP) {
+        header('Vary: Accept-Encoding');
+        header('Content-Encoding: gzip');
+        print gzencode($content,9,FORCE_GZIP);
+    } else {
+        print $content;
+    }
+}
+
+/**
+ * Fetches raw, unparsed POST data
+ *
+ * @return string
+ */
+function http_get_raw_post_data() {
+    static $postData = null;
+    if ($postData === null) {
+        $postData = file_get_contents('php://input');
+    }
+    return $postData;
+}
+
+/**
+ * Set the HTTP response status and takes care of the used PHP SAPI
+ *
+ * Inspired by CodeIgniter's set_status_header function
+ *
+ * @param int    $code
+ * @param string $text
+ */
+function http_status($code = 200, $text = '') {
+    static $stati = array(
+        200 => 'OK',
+        201 => 'Created',
+        202 => 'Accepted',
+        203 => 'Non-Authoritative Information',
+        204 => 'No Content',
+        205 => 'Reset Content',
+        206 => 'Partial Content',
+
+        300 => 'Multiple Choices',
+        301 => 'Moved Permanently',
+        302 => 'Found',
+        304 => 'Not Modified',
+        305 => 'Use Proxy',
+        307 => 'Temporary Redirect',
+
+        400 => 'Bad Request',
+        401 => 'Unauthorized',
+        403 => 'Forbidden',
+        404 => 'Not Found',
+        405 => 'Method Not Allowed',
+        406 => 'Not Acceptable',
+        407 => 'Proxy Authentication Required',
+        408 => 'Request Timeout',
+        409 => 'Conflict',
+        410 => 'Gone',
+        411 => 'Length Required',
+        412 => 'Precondition Failed',
+        413 => 'Request Entity Too Large',
+        414 => 'Request-URI Too Long',
+        415 => 'Unsupported Media Type',
+        416 => 'Requested Range Not Satisfiable',
+        417 => 'Expectation Failed',
+
+        500 => 'Internal Server Error',
+        501 => 'Not Implemented',
+        502 => 'Bad Gateway',
+        503 => 'Service Unavailable',
+        504 => 'Gateway Timeout',
+        505 => 'HTTP Version Not Supported'
+    );
+
+    if($text == '' && isset($stati[$code])) {
+        $text = $stati[$code];
+    }
+
+    $server_protocol = (isset($_SERVER['SERVER_PROTOCOL'])) ? $_SERVER['SERVER_PROTOCOL'] : false;
+
+    if(substr(php_sapi_name(), 0, 3) == 'cgi' || defined('SIMPLE_TEST')) {
+        header("Status: {$code} {$text}", true);
+    } elseif($server_protocol == 'HTTP/1.1' OR $server_protocol == 'HTTP/1.0') {
+        header($server_protocol." {$code} {$text}", true, $code);
+    } else {
+        header("HTTP/1.1 {$code} {$text}", true, $code);
+    }
+}
diff --git a/wiki/inc/indexer.php b/wiki/inc/indexer.php
new file mode 100644
index 0000000..fac7a3f
--- /dev/null
+++ b/wiki/inc/indexer.php
@@ -0,0 +1,1611 @@
+<?php
+/**
+ * Functions to create the fulltext search index
+ *
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author     Andreas Gohr <andi@splitbrain.org>
+ * @author     Tom N Harris <tnharris@whoopdedo.org>
+ */
+
+if(!defined('DOKU_INC')) die('meh.');
+
+// Version tag used to force rebuild on upgrade
+define('INDEXER_VERSION', 8);
+
+// set the minimum token length to use in the index (note, this doesn't apply to numeric tokens)
+if (!defined('IDX_MINWORDLENGTH')) define('IDX_MINWORDLENGTH',2);
+
+// Asian characters are handled as words. The following regexp defines the
+// Unicode-Ranges for Asian characters
+// Ranges taken from http://en.wikipedia.org/wiki/Unicode_block
+// I'm no language expert. If you think some ranges are wrongly chosen or
+// a range is missing, please contact me
+define('IDX_ASIAN1','[\x{0E00}-\x{0E7F}]'); // Thai
+define('IDX_ASIAN2','['.
+                   '\x{2E80}-\x{3040}'.  // CJK -> Hangul
+                   '\x{309D}-\x{30A0}'.
+                   '\x{30FD}-\x{31EF}\x{3200}-\x{D7AF}'.
+                   '\x{F900}-\x{FAFF}'.  // CJK Compatibility Ideographs
+                   '\x{FE30}-\x{FE4F}'.  // CJK Compatibility Forms
+                   "\xF0\xA0\x80\x80-\xF0\xAA\x9B\x9F". // CJK Extension B
+                   "\xF0\xAA\x9C\x80-\xF0\xAB\x9C\xBF". // CJK Extension C
+                   "\xF0\xAB\x9D\x80-\xF0\xAB\xA0\x9F". // CJK Extension D
+                   "\xF0\xAF\xA0\x80-\xF0\xAF\xAB\xBF". // CJK Compatibility Supplement
+                   ']');
+define('IDX_ASIAN3','['.                // Hiragana/Katakana (can be two characters)
+                   '\x{3042}\x{3044}\x{3046}\x{3048}'.
+                   '\x{304A}-\x{3062}\x{3064}-\x{3082}'.
+                   '\x{3084}\x{3086}\x{3088}-\x{308D}'.
+                   '\x{308F}-\x{3094}'.
+                   '\x{30A2}\x{30A4}\x{30A6}\x{30A8}'.
+                   '\x{30AA}-\x{30C2}\x{30C4}-\x{30E2}'.
+                   '\x{30E4}\x{30E6}\x{30E8}-\x{30ED}'.
+                   '\x{30EF}-\x{30F4}\x{30F7}-\x{30FA}'.
+                   ']['.
+                   '\x{3041}\x{3043}\x{3045}\x{3047}\x{3049}'.
+                   '\x{3063}\x{3083}\x{3085}\x{3087}\x{308E}\x{3095}-\x{309C}'.
+                   '\x{30A1}\x{30A3}\x{30A5}\x{30A7}\x{30A9}'.
+                   '\x{30C3}\x{30E3}\x{30E5}\x{30E7}\x{30EE}\x{30F5}\x{30F6}\x{30FB}\x{30FC}'.
+                   '\x{31F0}-\x{31FF}'.
+                   ']?');
+define('IDX_ASIAN', '(?:'.IDX_ASIAN1.'|'.IDX_ASIAN2.'|'.IDX_ASIAN3.')');
+
+/**
+ * Version of the indexer taking into consideration the external tokenizer.
+ * The indexer is only compatible with data written by the same version.
+ *
+ * @triggers INDEXER_VERSION_GET
+ * Plugins that modify what gets indexed should hook this event and
+ * add their version info to the event data like so:
+ *     $data[$plugin_name] = $plugin_version;
+ *
+ * @author Tom N Harris <tnharris@whoopdedo.org>
+ * @author Michael Hamann <michael@content-space.de>
+ *
+ * @return int|string
+ */
+function idx_get_version(){
+    static $indexer_version = null;
+    if ($indexer_version == null) {
+        $version = INDEXER_VERSION;
+
+        // DokuWiki version is included for the convenience of plugins
+        $data = array('dokuwiki'=>$version);
+        trigger_event('INDEXER_VERSION_GET', $data, null, false);
+        unset($data['dokuwiki']); // this needs to be first
+        ksort($data);
+        foreach ($data as $plugin=>$vers)
+            $version .= '+'.$plugin.'='.$vers;
+        $indexer_version = $version;
+    }
+    return $indexer_version;
+}
+
+/**
+ * Measure the length of a string.
+ * Differs from strlen in handling of asian characters.
+ *
+ * @author Tom N Harris <tnharris@whoopdedo.org>
+ *
+ * @param string $w
+ * @return int
+ */
+function wordlen($w){
+    $l = strlen($w);
+    // If left alone, all chinese "words" will get put into w3.idx
+    // So the "length" of a "word" is faked
+    if(preg_match_all('/[\xE2-\xEF]/',$w,$leadbytes)) {
+        foreach($leadbytes[0] as $b)
+            $l += ord($b) - 0xE1;
+    }
+    return $l;
+}
+
+/**
+ * Class that encapsulates operations on the indexer database.
+ *
+ * @author Tom N Harris <tnharris@whoopdedo.org>
+ */
+class Doku_Indexer {
+    /**
+     * @var array $pidCache Cache for getPID()
+     */
+    protected $pidCache = array();
+
+    /**
+     * Adds the contents of a page to the fulltext index
+     *
+     * The added text replaces previous words for the same page.
+     * An empty value erases the page.
+     *
+     * @param string    $page   a page name
+     * @param string    $text   the body of the page
+     * @return string|boolean  the function completed successfully
+     *
+     * @author Tom N Harris <tnharris@whoopdedo.org>
+     * @author Andreas Gohr <andi@splitbrain.org>
+     */
+    public function addPageWords($page, $text) {
+        if (!$this->lock())
+            return "locked";
+
+        // load known documents
+        $pid = $this->getPIDNoLock($page);
+        if ($pid === false) {
+            $this->unlock();
+            return false;
+        }
+
+        $pagewords = array();
+        // get word usage in page
+        $words = $this->getPageWords($text);
+        if ($words === false) {
+            $this->unlock();
+            return false;
+        }
+
+        if (!empty($words)) {
+            foreach (array_keys($words) as $wlen) {
+                $index = $this->getIndex('i', $wlen);
+                foreach ($words[$wlen] as $wid => $freq) {
+                    $idx = ($wid<count($index)) ? $index[$wid] : '';
+                    $index[$wid] = $this->updateTuple($idx, $pid, $freq);
+                    $pagewords[] = "$wlen*$wid";
+                }
+                if (!$this->saveIndex('i', $wlen, $index)) {
+                    $this->unlock();
+                    return false;
+                }
+            }
+        }
+
+        // Remove obsolete index entries
+        $pageword_idx = $this->getIndexKey('pageword', '', $pid);
+        if ($pageword_idx !== '') {
+            $oldwords = explode(':',$pageword_idx);
+            $delwords = array_diff($oldwords, $pagewords);
+            $upwords = array();
+            foreach ($delwords as $word) {
+                if ($word != '') {
+                    list($wlen,$wid) = explode('*', $word);
+                    $wid = (int)$wid;
+                    $upwords[$wlen][] = $wid;
+                }
+            }
+            foreach ($upwords as $wlen => $widx) {
+                $index = $this->getIndex('i', $wlen);
+                foreach ($widx as $wid) {
+                    $index[$wid] = $this->updateTuple($index[$wid], $pid, 0);
+                }
+                $this->saveIndex('i', $wlen, $index);
+            }
+        }
+        // Save the reverse index
+        $pageword_idx = join(':', $pagewords);
+        if (!$this->saveIndexKey('pageword', '', $pid, $pageword_idx)) {
+            $this->unlock();
+            return false;
+        }
+
+        $this->unlock();
+        return true;
+    }
+
+    /**
+     * Split the words in a page and add them to the index.
+     *
+     * @param string    $text   content of the page
+     * @return array            list of word IDs and number of times used
+     *
+     * @author Andreas Gohr <andi@splitbrain.org>
+     * @author Christopher Smith <chris@jalakai.co.uk>
+     * @author Tom N Harris <tnharris@whoopdedo.org>
+     */
+    protected function getPageWords($text) {
+
+        $tokens = $this->tokenizer($text);
+        $tokens = array_count_values($tokens);  // count the frequency of each token
+
+        $words = array();
+        foreach ($tokens as $w=>$c) {
+            $l = wordlen($w);
+            if (isset($words[$l])){
+                $words[$l][$w] = $c + (isset($words[$l][$w]) ? $words[$l][$w] : 0);
+            }else{
+                $words[$l] = array($w => $c);
+            }
+        }
+
+        // arrive here with $words = array(wordlen => array(word => frequency))
+        $word_idx_modified = false;
+        $index = array();   //resulting index
+        foreach (array_keys($words) as $wlen) {
+            $word_idx = $this->getIndex('w', $wlen);
+            foreach ($words[$wlen] as $word => $freq) {
+                $word = (string)$word;
+                $wid = array_search($word, $word_idx, true);
+                if ($wid === false) {
+                    $wid = count($word_idx);
+                    $word_idx[] = $word;
+                    $word_idx_modified = true;
+                }
+                if (!isset($index[$wlen]))
+                    $index[$wlen] = array();
+                $index[$wlen][$wid] = $freq;
+            }
+            // save back the word index
+            if ($word_idx_modified && !$this->saveIndex('w', $wlen, $word_idx))
+                return false;
+        }
+
+        return $index;
+    }
+
+    /**
+     * Add/update keys to/of the metadata index.
+     *
+     * Adding new keys does not remove other keys for the page.
+     * An empty value will erase the key.
+     * The $key parameter can be an array to add multiple keys. $value will
+     * not be used if $key is an array.
+     *
+     * @param string    $page   a page name
+     * @param mixed     $key    a key string or array of key=>value pairs
+     * @param mixed     $value  the value or list of values
+     * @return boolean|string     the function completed successfully
+     *
+     * @author Tom N Harris <tnharris@whoopdedo.org>
+     * @author Michael Hamann <michael@content-space.de>
+     */
+    public function addMetaKeys($page, $key, $value=null) {
+        if (!is_array($key)) {
+            $key = array($key => $value);
+        } elseif (!is_null($value)) {
+            // $key is array, but $value is not null
+            trigger_error("array passed to addMetaKeys but value is not null", E_USER_WARNING);
+        }
+
+        if (!$this->lock())
+            return "locked";
+
+        // load known documents
+        $pid = $this->getPIDNoLock($page);
+        if ($pid === false) {
+            $this->unlock();
+            return false;
+        }
+
+        // Special handling for titles so the index file is simpler
+        if (array_key_exists('title', $key)) {
+            $value = $key['title'];
+            if (is_array($value)) {
+                $value = $value[0];
+            }
+            $this->saveIndexKey('title', '', $pid, $value);
+            unset($key['title']);
+        }
+
+        foreach ($key as $name => $values) {
+            $metaname = idx_cleanName($name);
+            $this->addIndexKey('metadata', '', $metaname);
+            $metaidx = $this->getIndex($metaname.'_i', '');
+            $metawords = $this->getIndex($metaname.'_w', '');
+            $addwords = false;
+
+            if (!is_array($values)) $values = array($values);
+
+            $val_idx = $this->getIndexKey($metaname.'_p', '', $pid);
+            if ($val_idx != '') {
+                $val_idx = explode(':', $val_idx);
+                // -1 means remove, 0 keep, 1 add
+                $val_idx = array_combine($val_idx, array_fill(0, count($val_idx), -1));
+            } else {
+                $val_idx = array();
+            }
+
+            foreach ($values as $val) {
+                $val = (string)$val;
+                if ($val !== "") {
+                    $id = array_search($val, $metawords, true);
+                    if ($id === false) {
+                        // didn't find $val, so we'll add it to the end of metawords and create a placeholder in metaidx
+                        $id = count($metawords);
+                        $metawords[$id] = $val;
+                        $metaidx[$id] = '';
+                        $addwords = true;
+                    }
+                    // test if value is already in the index
+                    if (isset($val_idx[$id]) && $val_idx[$id] <= 0){
+                        $val_idx[$id] = 0;
+                    } else { // else add it
+                        $val_idx[$id] = 1;
+                    }
+                }
+            }
+
+            if ($addwords) {
+                $this->saveIndex($metaname.'_w', '', $metawords);
+            }
+            $vals_changed = false;
+            foreach ($val_idx as $id => $action) {
+                if ($action == -1) {
+                    $metaidx[$id] = $this->updateTuple($metaidx[$id], $pid, 0);
+                    $vals_changed = true;
+                    unset($val_idx[$id]);
+                } elseif ($action == 1) {
+                    $metaidx[$id] = $this->updateTuple($metaidx[$id], $pid, 1);
+                    $vals_changed = true;
+                }
+            }
+
+            if ($vals_changed) {
+                $this->saveIndex($metaname.'_i', '', $metaidx);
+                $val_idx = implode(':', array_keys($val_idx));
+                $this->saveIndexKey($metaname.'_p', '', $pid, $val_idx);
+            }
+
+            unset($metaidx);
+            unset($metawords);
+        }
+
+        $this->unlock();
+        return true;
+    }
+
+    /**
+     * Rename a page in the search index without changing the indexed content. This function doesn't check if the
+     * old or new name exists in the filesystem. It returns an error if the old page isn't in the page list of the
+     * indexer and it deletes all previously indexed content of the new page.
+     *
+     * @param string $oldpage The old page name
+     * @param string $newpage The new page name
+     * @return string|bool If the page was successfully renamed, can be a message in the case of an error
+     */
+    public function renamePage($oldpage, $newpage) {
+        if (!$this->lock()) return 'locked';
+
+        $pages = $this->getPages();
+
+        $id = array_search($oldpage, $pages, true);
+        if ($id === false) {
+            $this->unlock();
+            return 'page is not in index';
+        }
+
+        $new_id = array_search($newpage, $pages, true);
+        if ($new_id !== false) {
+            // make sure the page is not in the index anymore
+            if ($this->deletePageNoLock($newpage) !== true) {
+                return false;
+            }
+
+            $pages[$new_id] = 'deleted:'.time().rand(0, 9999);
+        }
+
+        $pages[$id] = $newpage;
+
+        // update index
+        if (!$this->saveIndex('page', '', $pages)) {
+            $this->unlock();
+            return false;
+        }
+
+        // reset the pid cache
+        $this->pidCache = array();
+
+        $this->unlock();
+        return true;
+    }
+
+    /**
+     * Renames a meta value in the index. This doesn't change the meta value in the pages, it assumes that all pages
+     * will be updated.
+     *
+     * @param string $key       The metadata key of which a value shall be changed
+     * @param string $oldvalue  The old value that shall be renamed
+     * @param string $newvalue  The new value to which the old value shall be renamed, can exist (then values will be merged)
+     * @return bool|string      If renaming the value has been successful, false or error message on error.
+     */
+    public function renameMetaValue($key, $oldvalue, $newvalue) {
+        if (!$this->lock()) return 'locked';
+
+        // change the relation references index
+        $metavalues = $this->getIndex($key, '_w');
+        $oldid = array_search($oldvalue, $metavalues, true);
+        if ($oldid !== false) {
+            $newid = array_search($newvalue, $metavalues, true);
+            if ($newid !== false) {
+                // free memory
+                unset ($metavalues);
+
+                // okay, now we have two entries for the same value. we need to merge them.
+                $indexline = $this->getIndexKey($key.'_i', '', $oldid);
+                if ($indexline != '') {
+                    $newindexline = $this->getIndexKey($key.'_i', '', $newid);
+                    $pagekeys     = $this->getIndex($key.'_p', '');
+                    $parts = explode(':', $indexline);
+                    foreach ($parts as $part) {
+                        list($id, $count) = explode('*', $part);
+                        $newindexline =  $this->updateTuple($newindexline, $id, $count);
+
+                        $keyline = explode(':', $pagekeys[$id]);
+                        // remove old meta value
+                        $keyline = array_diff($keyline, array($oldid));
+                        // add new meta value when not already present
+                        if (!in_array($newid, $keyline)) {
+                            array_push($keyline, $newid);
+                        }
+                        $pagekeys[$id] = implode(':', $keyline);
+                    }
+                    $this->saveIndex($key.'_p', '', $pagekeys);
+                    unset($pagekeys);
+                    $this->saveIndexKey($key.'_i', '', $oldid, '');
+                    $this->saveIndexKey($key.'_i', '', $newid, $newindexline);
+                }
+            } else {
+                $metavalues[$oldid] = $newvalue;
+                if (!$this->saveIndex($key.'_w', '', $metavalues)) {
+                    $this->unlock();
+                    return false;
+                }
+            }
+        }
+
+        $this->unlock();
+        return true;
+    }
+
+    /**
+     * Remove a page from the index
+     *
+     * Erases entries in all known indexes.
+     *
+     * @param string    $page   a page name
+     * @return string|boolean  the function completed successfully
+     *
+     * @author Tom N Harris <tnharris@whoopdedo.org>
+     */
+    public function deletePage($page) {
+        if (!$this->lock())
+            return "locked";
+
+        $result = $this->deletePageNoLock($page);
+
+        $this->unlock();
+
+        return $result;
+    }
+
+    /**
+     * Remove a page from the index without locking the index, only use this function if the index is already locked
+     *
+     * Erases entries in all known indexes.
+     *
+     * @param string    $page   a page name
+     * @return boolean          the function completed successfully
+     *
+     * @author Tom N Harris <tnharris@whoopdedo.org>
+     */
+    protected function deletePageNoLock($page) {
+        // load known documents
+        $pid = $this->getPIDNoLock($page);
+        if ($pid === false) {
+            return false;
+        }
+
+        // Remove obsolete index entries
+        $pageword_idx = $this->getIndexKey('pageword', '', $pid);
+        if ($pageword_idx !== '') {
+            $delwords = explode(':',$pageword_idx);
+            $upwords = array();
+            foreach ($delwords as $word) {
+                if ($word != '') {
+                    list($wlen,$wid) = explode('*', $word);
+                    $wid = (int)$wid;
+                    $upwords[$wlen][] = $wid;
+                }
+            }
+            foreach ($upwords as $wlen => $widx) {
+                $index = $this->getIndex('i', $wlen);
+                foreach ($widx as $wid) {
+                    $index[$wid] = $this->updateTuple($index[$wid], $pid, 0);
+                }
+                $this->saveIndex('i', $wlen, $index);
+            }
+        }
+        // Save the reverse index
+        if (!$this->saveIndexKey('pageword', '', $pid, "")) {
+            return false;
+        }
+
+        $this->saveIndexKey('title', '', $pid, "");
+        $keyidx = $this->getIndex('metadata', '');
+        foreach ($keyidx as $metaname) {
+            $val_idx = explode(':', $this->getIndexKey($metaname.'_p', '', $pid));
+            $meta_idx = $this->getIndex($metaname.'_i', '');
+            foreach ($val_idx as $id) {
+                if ($id === '') continue;
+                $meta_idx[$id] = $this->updateTuple($meta_idx[$id], $pid, 0);
+            }
+            $this->saveIndex($metaname.'_i', '', $meta_idx);
+            $this->saveIndexKey($metaname.'_p', '', $pid, '');
+        }
+
+        return true;
+    }
+
+    /**
+     * Clear the whole index
+     *
+     * @return bool If the index has been cleared successfully
+     */
+    public function clear() {
+        global $conf;
+
+        if (!$this->lock()) return false;
+
+        @unlink($conf['indexdir'].'/page.idx');
+        @unlink($conf['indexdir'].'/title.idx');
+        @unlink($conf['indexdir'].'/pageword.idx');
+        @unlink($conf['indexdir'].'/metadata.idx');
+        $dir = @opendir($conf['indexdir']);
+        if($dir!==false){
+            while(($f = readdir($dir)) !== false){
+                if(substr($f,-4)=='.idx' &&
+                    (substr($f,0,1)=='i' || substr($f,0,1)=='w'
+                        || substr($f,-6)=='_w.idx' || substr($f,-6)=='_i.idx' || substr($f,-6)=='_p.idx'))
+                    @unlink($conf['indexdir']."/$f");
+            }
+        }
+        @unlink($conf['indexdir'].'/lengths.idx');
+
+        // clear the pid cache
+        $this->pidCache = array();
+
+        $this->unlock();
+        return true;
+    }
+
+    /**
+     * Split the text into words for fulltext search
+     *
+     * TODO: does this also need &$stopwords ?
+     *
+     * @triggers INDEXER_TEXT_PREPARE
+     * This event allows plugins to modify the text before it gets tokenized.
+     * Plugins intercepting this event should also intercept INDEX_VERSION_GET
+     *
+     * @param string    $text   plain text
+     * @param boolean   $wc     are wildcards allowed?
+     * @return array            list of words in the text
+     *
+     * @author Tom N Harris <tnharris@whoopdedo.org>
+     * @author Andreas Gohr <andi@splitbrain.org>
+     */
+    public function tokenizer($text, $wc=false) {
+        $wc = ($wc) ? '' : '\*';
+        $stopwords =& idx_get_stopwords();
+
+        // prepare the text to be tokenized
+        $evt = new Doku_Event('INDEXER_TEXT_PREPARE', $text);
+        if ($evt->advise_before(true)) {
+            if (preg_match('/[^0-9A-Za-z ]/u', $text)) {
+                // handle asian chars as single words (may fail on older PHP version)
+                $asia = @preg_replace('/('.IDX_ASIAN.')/u', ' \1 ', $text);
+                if (!is_null($asia)) $text = $asia; // recover from regexp falure
+            }
+        }
+        $evt->advise_after();
+        unset($evt);
+
+        $text = strtr($text,
+                       array(
+                           "\r" => ' ',
+                           "\n" => ' ',
+                           "\t" => ' ',
+                           "\xC2\xAD" => '', //soft-hyphen
+                       )
+                     );
+        if (preg_match('/[^0-9A-Za-z ]/u', $text))
+            $text = utf8_stripspecials($text, ' ', '\._\-:'.$wc);
+
+        $wordlist = explode(' ', $text);
+        foreach ($wordlist as $i => $word) {
+            $wordlist[$i] = (preg_match('/[^0-9A-Za-z]/u', $word)) ?
+                utf8_strtolower($word) : strtolower($word);
+        }
+
+        foreach ($wordlist as $i => $word) {
+            if ((!is_numeric($word) && strlen($word) < IDX_MINWORDLENGTH)
+              || array_search($word, $stopwords, true) !== false)
+                unset($wordlist[$i]);
+        }
+        return array_values($wordlist);
+    }
+
+    /**
+     * Get the numeric PID of a page
+     *
+     * @param string $page The page to get the PID for
+     * @return bool|int The page id on success, false on error
+     */
+    public function getPID($page) {
+        // return PID without locking when it is in the cache
+        if (isset($this->pidCache[$page])) return $this->pidCache[$page];
+
+        if (!$this->lock())
+            return false;
+
+        // load known documents
+        $pid = $this->getPIDNoLock($page);
+        if ($pid === false) {
+            $this->unlock();
+            return false;
+        }
+
+        $this->unlock();
+        return $pid;
+    }
+
+    /**
+     * Get the numeric PID of a page without locking the index.
+     * Only use this function when the index is already locked.
+     *
+     * @param string $page The page to get the PID for
+     * @return bool|int The page id on success, false on error
+     */
+    protected function getPIDNoLock($page) {
+        // avoid expensive addIndexKey operation for the most recently requested pages by using a cache
+        if (isset($this->pidCache[$page])) return $this->pidCache[$page];
+        $pid = $this->addIndexKey('page', '', $page);
+        // limit cache to 10 entries by discarding the oldest element as in DokuWiki usually only the most recently
+        // added item will be requested again
+        if (count($this->pidCache) > 10) array_shift($this->pidCache);
+        $this->pidCache[$page] = $pid;
+        return $pid;
+    }
+
+    /**
+     * Get the page id of a numeric PID
+     *
+     * @param int $pid The PID to get the page id for
+     * @return string The page id
+     */
+    public function getPageFromPID($pid) {
+        return $this->getIndexKey('page', '', $pid);
+    }
+
+    /**
+     * Find pages in the fulltext index containing the words,
+     *
+     * The search words must be pre-tokenized, meaning only letters and
+     * numbers with an optional wildcard
+     *
+     * The returned array will have the original tokens as key. The values
+     * in the returned list is an array with the page names as keys and the
+     * number of times that token appears on the page as value.
+     *
+     * @param array  $tokens list of words to search for
+     * @return array         list of page names with usage counts
+     *
+     * @author Tom N Harris <tnharris@whoopdedo.org>
+     * @author Andreas Gohr <andi@splitbrain.org>
+     */
+    public function lookup(&$tokens) {
+        $result = array();
+        $wids = $this->getIndexWords($tokens, $result);
+        if (empty($wids)) return array();
+        // load known words and documents
+        $page_idx = $this->getIndex('page', '');
+        $docs = array();
+        foreach (array_keys($wids) as $wlen) {
+            $wids[$wlen] = array_unique($wids[$wlen]);
+            $index = $this->getIndex('i', $wlen);
+            foreach($wids[$wlen] as $ixid) {
+                if ($ixid < count($index))
+                    $docs["$wlen*$ixid"] = $this->parseTuples($page_idx, $index[$ixid]);
+            }
+        }
+        // merge found pages into final result array
+        $final = array();
+        foreach ($result as $word => $res) {
+            $final[$word] = array();
+            foreach ($res as $wid) {
+                // handle the case when ($ixid < count($index)) has been false
+                // and thus $docs[$wid] hasn't been set.
+                if (!isset($docs[$wid])) continue;
+                $hits = &$docs[$wid];
+                foreach ($hits as $hitkey => $hitcnt) {
+                    // make sure the document still exists
+                    if (!page_exists($hitkey, '', false)) continue;
+                    if (!isset($final[$word][$hitkey]))
+                        $final[$word][$hitkey] = $hitcnt;
+                    else
+                        $final[$word][$hitkey] += $hitcnt;
+                }
+            }
+        }
+        return $final;
+    }
+
+    /**
+     * Find pages containing a metadata key.
+     *
+     * The metadata values are compared as case-sensitive strings. Pass a
+     * callback function that returns true or false to use a different
+     * comparison function. The function will be called with the $value being
+     * searched for as the first argument, and the word in the index as the
+     * second argument. The function preg_match can be used directly if the
+     * values are regexes.
+     *
+     * @param string    $key    name of the metadata key to look for
+     * @param string    $value  search term to look for, must be a string or array of strings
+     * @param callback  $func   comparison function
+     * @return array            lists with page names, keys are query values if $value is array
+     *
+     * @author Tom N Harris <tnharris@whoopdedo.org>
+     * @author Michael Hamann <michael@content-space.de>
+     */
+    public function lookupKey($key, &$value, $func=null) {
+        if (!is_array($value))
+            $value_array = array($value);
+        else
+            $value_array =& $value;
+
+        // the matching ids for the provided value(s)
+        $value_ids = array();
+
+        $metaname = idx_cleanName($key);
+
+        // get all words in order to search the matching ids
+        if ($key == 'title') {
+            $words = $this->getIndex('title', '');
+        } else {
+            $words = $this->getIndex($metaname.'_w', '');
+        }
+
+        if (!is_null($func)) {
+            foreach ($value_array as $val) {
+                foreach ($words as $i => $word) {
+                    if (call_user_func_array($func, array($val, $word)))
+                        $value_ids[$i][] = $val;
+                }
+            }
+        } else {
+            foreach ($value_array as $val) {
+                $xval = $val;
+                $caret = '^';
+                $dollar = '$';
+                // check for wildcards
+                if (substr($xval, 0, 1) == '*') {
+                    $xval = substr($xval, 1);
+                    $caret = '';
+                }
+                if (substr($xval, -1, 1) == '*') {
+                    $xval = substr($xval, 0, -1);
+                    $dollar = '';
+                }
+                if (!$caret || !$dollar) {
+                    $re = $caret.preg_quote($xval, '/').$dollar;
+                    foreach(array_keys(preg_grep('/'.$re.'/', $words)) as $i)
+                        $value_ids[$i][] = $val;
+                } else {
+                    if (($i = array_search($val, $words, true)) !== false)
+                        $value_ids[$i][] = $val;
+                }
+            }
+        }
+
+        unset($words); // free the used memory
+
+        // initialize the result so it won't be null
+        $result = array();
+        foreach ($value_array as $val) {
+            $result[$val] = array();
+        }
+
+        $page_idx = $this->getIndex('page', '');
+
+        // Special handling for titles
+        if ($key == 'title') {
+            foreach ($value_ids as $pid => $val_list) {
+                $page = $page_idx[$pid];
+                foreach ($val_list as $val) {
+                    $result[$val][] = $page;
+                }
+            }
+        } else {
+            // load all lines and pages so the used lines can be taken and matched with the pages
+            $lines = $this->getIndex($metaname.'_i', '');
+
+            foreach ($value_ids as $value_id => $val_list) {
+                // parse the tuples of the form page_id*1:page2_id*1 and so on, return value
+                // is an array with page_id => 1, page2_id => 1 etc. so take the keys only
+                $pages = array_keys($this->parseTuples($page_idx, $lines[$value_id]));
+                foreach ($val_list as $val) {
+                    $result[$val] = array_merge($result[$val], $pages);
+                }
+            }
+        }
+        if (!is_array($value)) $result = $result[$value];
+        return $result;
+    }
+
+    /**
+     * Find the index ID of each search term.
+     *
+     * The query terms should only contain valid characters, with a '*' at
+     * either the beginning or end of the word (or both).
+     * The $result parameter can be used to merge the index locations with
+     * the appropriate query term.
+     *
+     * @param array  $words  The query terms.
+     * @param array  $result Set to word => array("length*id" ...)
+     * @return array         Set to length => array(id ...)
+     *
+     * @author Tom N Harris <tnharris@whoopdedo.org>
+     */
+    protected function getIndexWords(&$words, &$result) {
+        $tokens = array();
+        $tokenlength = array();
+        $tokenwild = array();
+        foreach ($words as $word) {
+            $result[$word] = array();
+            $caret = '^';
+            $dollar = '$';
+            $xword = $word;
+            $wlen = wordlen($word);
+
+            // check for wildcards
+            if (substr($xword, 0, 1) == '*') {
+                $xword = substr($xword, 1);
+                $caret = '';
+                $wlen -= 1;
+            }
+            if (substr($xword, -1, 1) == '*') {
+                $xword = substr($xword, 0, -1);
+                $dollar = '';
+                $wlen -= 1;
+            }
+            if ($wlen < IDX_MINWORDLENGTH && $caret && $dollar && !is_numeric($xword))
+                continue;
+            if (!isset($tokens[$xword]))
+                $tokenlength[$wlen][] = $xword;
+            if (!$caret || !$dollar) {
+                $re = $caret.preg_quote($xword, '/').$dollar;
+                $tokens[$xword][] = array($word, '/'.$re.'/');
+                if (!isset($tokenwild[$xword]))
+                    $tokenwild[$xword] = $wlen;
+            } else {
+                $tokens[$xword][] = array($word, null);
+            }
+        }
+        asort($tokenwild);
+        // $tokens = array( base word => array( [ query term , regexp ] ... ) ... )
+        // $tokenlength = array( base word length => base word ... )
+        // $tokenwild = array( base word => base word length ... )
+        $length_filter = empty($tokenwild) ? $tokenlength : min(array_keys($tokenlength));
+        $indexes_known = $this->indexLengths($length_filter);
+        if (!empty($tokenwild)) sort($indexes_known);
+        // get word IDs
+        $wids = array();
+        foreach ($indexes_known as $ixlen) {
+            $word_idx = $this->getIndex('w', $ixlen);
+            // handle exact search
+            if (isset($tokenlength[$ixlen])) {
+                foreach ($tokenlength[$ixlen] as $xword) {
+                    $wid = array_search($xword, $word_idx, true);
+                    if ($wid !== false) {
+                        $wids[$ixlen][] = $wid;
+                        foreach ($tokens[$xword] as $w)
+                            $result[$w[0]][] = "$ixlen*$wid";
+                    }
+                }
+            }
+            // handle wildcard search
+            foreach ($tokenwild as $xword => $wlen) {
+                if ($wlen >= $ixlen) break;
+                foreach ($tokens[$xword] as $w) {
+                    if (is_null($w[1])) continue;
+                    foreach(array_keys(preg_grep($w[1], $word_idx)) as $wid) {
+                        $wids[$ixlen][] = $wid;
+                        $result[$w[0]][] = "$ixlen*$wid";
+                    }
+                }
+            }
+        }
+        return $wids;
+    }
+
+    /**
+     * Return a list of all pages
+     * Warning: pages may not exist!
+     *
+     * @param string    $key    list only pages containing the metadata key (optional)
+     * @return array            list of page names
+     *
+     * @author Tom N Harris <tnharris@whoopdedo.org>
+     */
+    public function getPages($key=null) {
+        $page_idx = $this->getIndex('page', '');
+        if (is_null($key)) return $page_idx;
+
+        $metaname = idx_cleanName($key);
+
+        // Special handling for titles
+        if ($key == 'title') {
+            $title_idx = $this->getIndex('title', '');
+            array_splice($page_idx, count($title_idx));
+            foreach ($title_idx as $i => $title)
+                if ($title === "") unset($page_idx[$i]);
+            return array_values($page_idx);
+        }
+
+        $pages = array();
+        $lines = $this->getIndex($metaname.'_i', '');
+        foreach ($lines as $line) {
+            $pages = array_merge($pages, $this->parseTuples($page_idx, $line));
+        }
+        return array_keys($pages);
+    }
+
+    /**
+     * Return a list of words sorted by number of times used
+     *
+     * @param int       $min    bottom frequency threshold
+     * @param int       $max    upper frequency limit. No limit if $max<$min
+     * @param int       $minlen minimum length of words to count
+     * @param string    $key    metadata key to list. Uses the fulltext index if not given
+     * @return array            list of words as the keys and frequency as values
+     *
+     * @author Tom N Harris <tnharris@whoopdedo.org>
+     */
+    public function histogram($min=1, $max=0, $minlen=3, $key=null) {
+        if ($min < 1)
+            $min = 1;
+        if ($max < $min)
+            $max = 0;
+
+        $result = array();
+
+        if ($key == 'title') {
+            $index = $this->getIndex('title', '');
+            $index = array_count_values($index);
+            foreach ($index as $val => $cnt) {
+                if ($cnt >= $min && (!$max || $cnt <= $max) && strlen($val) >= $minlen)
+                    $result[$val] = $cnt;
+            }
+        }
+        elseif (!is_null($key)) {
+            $metaname = idx_cleanName($key);
+            $index = $this->getIndex($metaname.'_i', '');
+            $val_idx = array();
+            foreach ($index as $wid => $line) {
+                $freq = $this->countTuples($line);
+                if ($freq >= $min && (!$max || $freq <= $max))
+                    $val_idx[$wid] = $freq;
+            }
+            if (!empty($val_idx)) {
+                $words = $this->getIndex($metaname.'_w', '');
+                foreach ($val_idx as $wid => $freq) {
+                    if (strlen($words[$wid]) >= $minlen)
+                        $result[$words[$wid]] = $freq;
+                }
+            }
+        }
+        else {
+            $lengths = idx_listIndexLengths();
+            foreach ($lengths as $length) {
+                if ($length < $minlen) continue;
+                $index = $this->getIndex('i', $length);
+                $words = null;
+                foreach ($index as $wid => $line) {
+                    $freq = $this->countTuples($line);
+                    if ($freq >= $min && (!$max || $freq <= $max)) {
+                        if ($words === null)
+                            $words = $this->getIndex('w', $length);
+                        $result[$words[$wid]] = $freq;
+                    }
+                }
+            }
+        }
+
+        arsort($result);
+        return $result;
+    }
+
+    /**
+     * Lock the indexer.
+     *
+     * @author Tom N Harris <tnharris@whoopdedo.org>
+     *
+     * @return bool|string
+     */
+    protected function lock() {
+        global $conf;
+        $status = true;
+        $run = 0;
+        $lock = $conf['lockdir'].'/_indexer.lock';
+        while (!@mkdir($lock, $conf['dmode'])) {
+            usleep(50);
+            if(is_dir($lock) && time()-@filemtime($lock) > 60*5){
+                // looks like a stale lock - remove it
+                if (!@rmdir($lock)) {
+                    $status = "removing the stale lock failed";
+                    return false;
+                } else {
+                    $status = "stale lock removed";
+                }
+            }elseif($run++ == 1000){
+                // we waited 5 seconds for that lock
+                return false;
+            }
+        }
+        if (!empty($conf['dperm'])) {
+            chmod($lock, $conf['dperm']);
+        }
+        return $status;
+    }
+
+    /**
+     * Release the indexer lock.
+     *
+     * @author Tom N Harris <tnharris@whoopdedo.org>
+     *
+     * @return bool
+     */
+    protected function unlock() {
+        global $conf;
+        @rmdir($conf['lockdir'].'/_indexer.lock');
+        return true;
+    }
+
+    /**
+     * Retrieve the entire index.
+     *
+     * The $suffix argument is for an index that is split into
+     * multiple parts. Different index files should use different
+     * base names.
+     *
+     * @param string    $idx    name of the index
+     * @param string    $suffix subpart identifier
+     * @return array            list of lines without CR or LF
+     *
+     * @author Tom N Harris <tnharris@whoopdedo.org>
+     */
+    protected function getIndex($idx, $suffix) {
+        global $conf;
+        $fn = $conf['indexdir'].'/'.$idx.$suffix.'.idx';
+        if (!file_exists($fn)) return array();
+        return file($fn, FILE_IGNORE_NEW_LINES);
+    }
+
+    /**
+     * Replace the contents of the index with an array.
+     *
+     * @param string    $idx    name of the index
+     * @param string    $suffix subpart identifier
+     * @param array     $lines  list of lines without LF
+     * @return bool             If saving succeeded
+     *
+     * @author Tom N Harris <tnharris@whoopdedo.org>
+     */
+    protected function saveIndex($idx, $suffix, &$lines) {
+        global $conf;
+        $fn = $conf['indexdir'].'/'.$idx.$suffix;
+        $fh = @fopen($fn.'.tmp', 'w');
+        if (!$fh) return false;
+        fwrite($fh, join("\n", $lines));
+        if (!empty($lines))
+            fwrite($fh, "\n");
+        fclose($fh);
+        if (isset($conf['fperm']))
+            chmod($fn.'.tmp', $conf['fperm']);
+        io_rename($fn.'.tmp', $fn.'.idx');
+        return true;
+    }
+
+    /**
+     * Retrieve a line from the index.
+     *
+     * @param string    $idx    name of the index
+     * @param string    $suffix subpart identifier
+     * @param int       $id     the line number
+     * @return string           a line with trailing whitespace removed
+     *
+     * @author Tom N Harris <tnharris@whoopdedo.org>
+     */
+    protected function getIndexKey($idx, $suffix, $id) {
+        global $conf;
+        $fn = $conf['indexdir'].'/'.$idx.$suffix.'.idx';
+        if (!file_exists($fn)) return '';
+        $fh = @fopen($fn, 'r');
+        if (!$fh) return '';
+        $ln = -1;
+        while (($line = fgets($fh)) !== false) {
+            if (++$ln == $id) break;
+        }
+        fclose($fh);
+        return rtrim((string)$line);
+    }
+
+    /**
+     * Write a line into the index.
+     *
+     * @param string    $idx    name of the index
+     * @param string    $suffix subpart identifier
+     * @param int       $id     the line number
+     * @param string    $line   line to write
+     * @return bool             If saving succeeded
+     *
+     * @author Tom N Harris <tnharris@whoopdedo.org>
+     */
+    protected function saveIndexKey($idx, $suffix, $id, $line) {
+        global $conf;
+        if (substr($line, -1) != "\n")
+            $line .= "\n";
+        $fn = $conf['indexdir'].'/'.$idx.$suffix;
+        $fh = @fopen($fn.'.tmp', 'w');
+        if (!$fh) return false;
+        $ih = @fopen($fn.'.idx', 'r');
+        if ($ih) {
+            $ln = -1;
+            while (($curline = fgets($ih)) !== false) {
+                fwrite($fh, (++$ln == $id) ? $line : $curline);
+            }
+            if ($id > $ln) {
+                while ($id > ++$ln)
+                    fwrite($fh, "\n");
+                fwrite($fh, $line);
+            }
+            fclose($ih);
+        } else {
+            $ln = -1;
+            while ($id > ++$ln)
+                fwrite($fh, "\n");
+            fwrite($fh, $line);
+        }
+        fclose($fh);
+        if (isset($conf['fperm']))
+            chmod($fn.'.tmp', $conf['fperm']);
+        io_rename($fn.'.tmp', $fn.'.idx');
+        return true;
+    }
+
+    /**
+     * Retrieve or insert a value in the index.
+     *
+     * @param string    $idx    name of the index
+     * @param string    $suffix subpart identifier
+     * @param string    $value  line to find in the index
+     * @return int|bool          line number of the value in the index or false if writing the index failed
+     *
+     * @author Tom N Harris <tnharris@whoopdedo.org>
+     */
+    protected function addIndexKey($idx, $suffix, $value) {
+        $index = $this->getIndex($idx, $suffix);
+        $id = array_search($value, $index, true);
+        if ($id === false) {
+            $id = count($index);
+            $index[$id] = $value;
+            if (!$this->saveIndex($idx, $suffix, $index)) {
+                trigger_error("Failed to write $idx index", E_USER_ERROR);
+                return false;
+            }
+        }
+        return $id;
+    }
+
+    /**
+     * Get the list of lengths indexed in the wiki.
+     *
+     * Read the index directory or a cache file and returns
+     * a sorted array of lengths of the words used in the wiki.
+     *
+     * @author YoBoY <yoboy.leguesh@gmail.com>
+     *
+     * @return array
+     */
+    protected function listIndexLengths() {
+        return idx_listIndexLengths();
+    }
+
+    /**
+     * Get the word lengths that have been indexed.
+     *
+     * Reads the index directory and returns an array of lengths
+     * that there are indices for.
+     *
+     * @author YoBoY <yoboy.leguesh@gmail.com>
+     *
+     * @param array|int $filter
+     * @return array
+     */
+    protected function indexLengths($filter) {
+        global $conf;
+        $idx = array();
+        if (is_array($filter)) {
+            // testing if index files exist only
+            $path = $conf['indexdir']."/i";
+            foreach ($filter as $key => $value) {
+                if (file_exists($path.$key.'.idx'))
+                    $idx[] = $key;
+            }
+        } else {
+            $lengths = idx_listIndexLengths();
+            foreach ($lengths as $key => $length) {
+                // keep all the values equal or superior
+                if ((int)$length >= (int)$filter)
+                    $idx[] = $length;
+            }
+        }
+        return $idx;
+    }
+
+    /**
+     * Insert or replace a tuple in a line.
+     *
+     * @author Tom N Harris <tnharris@whoopdedo.org>
+     *
+     * @param string $line
+     * @param string|int $id
+     * @param int    $count
+     * @return string
+     */
+    protected function updateTuple($line, $id, $count) {
+        if ($line != ''){
+            $line = preg_replace('/(^|:)'.preg_quote($id,'/').'\*\d*/', '', $line);
+        }
+        $line = trim($line, ':');
+        if ($count) {
+            if ($line) {
+                return "$id*$count:".$line;
+            } else {
+                return "$id*$count";
+            }
+        }
+        return $line;
+    }
+
+    /**
+     * Split a line into an array of tuples.
+     *
+     * @author Tom N Harris <tnharris@whoopdedo.org>
+     * @author Andreas Gohr <andi@splitbrain.org>
+     *
+     * @param array $keys
+     * @param string $line
+     * @return array
+     */
+    protected function parseTuples(&$keys, $line) {
+        $result = array();
+        if ($line == '') return $result;
+        $parts = explode(':', $line);
+        foreach ($parts as $tuple) {
+            if ($tuple === '') continue;
+            list($key, $cnt) = explode('*', $tuple);
+            if (!$cnt) continue;
+            $key = $keys[$key];
+            if (!$key) continue;
+            $result[$key] = $cnt;
+        }
+        return $result;
+    }
+
+    /**
+     * Sum the counts in a list of tuples.
+     *
+     * @author Tom N Harris <tnharris@whoopdedo.org>
+     *
+     * @param string $line
+     * @return int
+     */
+    protected function countTuples($line) {
+        $freq = 0;
+        $parts = explode(':', $line);
+        foreach ($parts as $tuple) {
+            if ($tuple === '') continue;
+            list(/* $pid */, $cnt) = explode('*', $tuple);
+            $freq += (int)$cnt;
+        }
+        return $freq;
+    }
+}
+
+/**
+ * Create an instance of the indexer.
+ *
+ * @return Doku_Indexer    a Doku_Indexer
+ *
+ * @author Tom N Harris <tnharris@whoopdedo.org>
+ */
+function idx_get_indexer() {
+    static $Indexer;
+    if (!isset($Indexer)) {
+        $Indexer = new Doku_Indexer();
+    }
+    return $Indexer;
+}
+
+/**
+ * Returns words that will be ignored.
+ *
+ * @return array                list of stop words
+ *
+ * @author Tom N Harris <tnharris@whoopdedo.org>
+ */
+function & idx_get_stopwords() {
+    static $stopwords = null;
+    if (is_null($stopwords)) {
+        global $conf;
+        $swfile = DOKU_INC.'inc/lang/'.$conf['lang'].'/stopwords.txt';
+        if(file_exists($swfile)){
+            $stopwords = file($swfile, FILE_IGNORE_NEW_LINES);
+        }else{
+            $stopwords = array();
+        }
+    }
+    return $stopwords;
+}
+
+/**
+ * Adds/updates the search index for the given page
+ *
+ * Locking is handled internally.
+ *
+ * @param string        $page   name of the page to index
+ * @param boolean       $verbose    print status messages
+ * @param boolean       $force  force reindexing even when the index is up to date
+ * @return string|boolean  the function completed successfully
+ *
+ * @author Tom N Harris <tnharris@whoopdedo.org>
+ */
+function idx_addPage($page, $verbose=false, $force=false) {
+    $idxtag = metaFN($page,'.indexed');
+    // check if page was deleted but is still in the index
+    if (!page_exists($page)) {
+        if (!file_exists($idxtag)) {
+            if ($verbose) print("Indexer: $page does not exist, ignoring".DOKU_LF);
+            return false;
+        }
+        $Indexer = idx_get_indexer();
+        $result = $Indexer->deletePage($page);
+        if ($result === "locked") {
+            if ($verbose) print("Indexer: locked".DOKU_LF);
+            return false;
+        }
+        @unlink($idxtag);
+        return $result;
+    }
+
+    // check if indexing needed
+    if(!$force && file_exists($idxtag)){
+        if(trim(io_readFile($idxtag)) == idx_get_version()){
+            $last = @filemtime($idxtag);
+            if($last > @filemtime(wikiFN($page))){
+                if ($verbose) print("Indexer: index for $page up to date".DOKU_LF);
+                return false;
+            }
+        }
+    }
+
+    $indexenabled = p_get_metadata($page, 'internal index', METADATA_RENDER_UNLIMITED);
+    if ($indexenabled === false) {
+        $result = false;
+        if (file_exists($idxtag)) {
+            $Indexer = idx_get_indexer();
+            $result = $Indexer->deletePage($page);
+            if ($result === "locked") {
+                if ($verbose) print("Indexer: locked".DOKU_LF);
+                return false;
+            }
+            @unlink($idxtag);
+        }
+        if ($verbose) print("Indexer: index disabled for $page".DOKU_LF);
+        return $result;
+    }
+
+    $Indexer = idx_get_indexer();
+    $pid = $Indexer->getPID($page);
+    if ($pid === false) {
+        if ($verbose) print("Indexer: getting the PID failed for $page".DOKU_LF);
+        return false;
+    }
+    $body = '';
+    $metadata = array();
+    $metadata['title'] = p_get_metadata($page, 'title', METADATA_RENDER_UNLIMITED);
+    if (($references = p_get_metadata($page, 'relation references', METADATA_RENDER_UNLIMITED)) !== null)
+        $metadata['relation_references'] = array_keys($references);
+    else
+        $metadata['relation_references'] = array();
+
+    if (($media = p_get_metadata($page, 'relation media', METADATA_RENDER_UNLIMITED)) !== null)
+        $metadata['relation_media'] = array_keys($media);
+    else
+        $metadata['relation_media'] = array();
+
+    $data = compact('page', 'body', 'metadata', 'pid');
+    $evt = new Doku_Event('INDEXER_PAGE_ADD', $data);
+    if ($evt->advise_before()) $data['body'] = $data['body'] . " " . rawWiki($page);
+    $evt->advise_after();
+    unset($evt);
+    extract($data);
+
+    $result = $Indexer->addPageWords($page, $body);
+    if ($result === "locked") {
+        if ($verbose) print("Indexer: locked".DOKU_LF);
+        return false;
+    }
+
+    if ($result) {
+        $result = $Indexer->addMetaKeys($page, $metadata);
+        if ($result === "locked") {
+            if ($verbose) print("Indexer: locked".DOKU_LF);
+            return false;
+        }
+    }
+
+    if ($result)
+        io_saveFile(metaFN($page,'.indexed'), idx_get_version());
+    if ($verbose) {
+        print("Indexer: finished".DOKU_LF);
+        return true;
+    }
+    return $result;
+}
+
+/**
+ * Find tokens in the fulltext index
+ *
+ * Takes an array of words and will return a list of matching
+ * pages for each one.
+ *
+ * Important: No ACL checking is done here! All results are
+ *            returned, regardless of permissions
+ *
+ * @param array      $words  list of words to search for
+ * @return array             list of pages found, associated with the search terms
+ */
+function idx_lookup(&$words) {
+    $Indexer = idx_get_indexer();
+    return $Indexer->lookup($words);
+}
+
+/**
+ * Split a string into tokens
+ *
+ * @param string $string
+ * @param bool $wc
+ *
+ * @return array
+ */
+function idx_tokenizer($string, $wc=false) {
+    $Indexer = idx_get_indexer();
+    return $Indexer->tokenizer($string, $wc);
+}
+
+/* For compatibility */
+
+/**
+ * Read the list of words in an index (if it exists).
+ *
+ * @author Tom N Harris <tnharris@whoopdedo.org>
+ *
+ * @param string $idx
+ * @param string $suffix
+ * @return array
+ */
+function idx_getIndex($idx, $suffix) {
+    global $conf;
+    $fn = $conf['indexdir'].'/'.$idx.$suffix.'.idx';
+    if (!file_exists($fn)) return array();
+    return file($fn);
+}
+
+/**
+ * Get the list of lengths indexed in the wiki.
+ *
+ * Read the index directory or a cache file and returns
+ * a sorted array of lengths of the words used in the wiki.
+ *
+ * @author YoBoY <yoboy.leguesh@gmail.com>
+ *
+ * @return array
+ */
+function idx_listIndexLengths() {
+    global $conf;
+    // testing what we have to do, create a cache file or not.
+    if ($conf['readdircache'] == 0) {
+        $docache = false;
+    } else {
+        clearstatcache();
+        if (file_exists($conf['indexdir'].'/lengths.idx')
+        && (time() < @filemtime($conf['indexdir'].'/lengths.idx') + $conf['readdircache'])) {
+            if (($lengths = @file($conf['indexdir'].'/lengths.idx', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES)) !== false) {
+                $idx = array();
+                foreach ($lengths as $length) {
+                    $idx[] = (int)$length;
+                }
+                return $idx;
+            }
+        }
+        $docache = true;
+    }
+
+    if ($conf['readdircache'] == 0 || $docache) {
+        $dir = @opendir($conf['indexdir']);
+        if ($dir === false)
+            return array();
+        $idx = array();
+        while (($f = readdir($dir)) !== false) {
+            if (substr($f, 0, 1) == 'i' && substr($f, -4) == '.idx') {
+                $i = substr($f, 1, -4);
+                if (is_numeric($i))
+                    $idx[] = (int)$i;
+            }
+        }
+        closedir($dir);
+        sort($idx);
+        // save this in a file
+        if ($docache) {
+            $handle = @fopen($conf['indexdir'].'/lengths.idx', 'w');
+            @fwrite($handle, implode("\n", $idx));
+            @fclose($handle);
+        }
+        return $idx;
+    }
+
+    return array();
+}
+
+/**
+ * Get the word lengths that have been indexed.
+ *
+ * Reads the index directory and returns an array of lengths
+ * that there are indices for.
+ *
+ * @author YoBoY <yoboy.leguesh@gmail.com>
+ *
+ * @param array|int $filter
+ * @return array
+ */
+function idx_indexLengths($filter) {
+    global $conf;
+    $idx = array();
+    if (is_array($filter)) {
+        // testing if index files exist only
+        $path = $conf['indexdir']."/i";
+        foreach ($filter as $key => $value) {
+            if (file_exists($path.$key.'.idx'))
+                $idx[] = $key;
+        }
+    } else {
+        $lengths = idx_listIndexLengths();
+        foreach ($lengths as $key => $length) {
+            // keep all the values equal or superior
+            if ((int)$length >= (int)$filter)
+                $idx[] = $length;
+        }
+    }
+    return $idx;
+}
+
+/**
+ * Clean a name of a key for use as a file name.
+ *
+ * Romanizes non-latin characters, then strips away anything that's
+ * not a letter, number, or underscore.
+ *
+ * @author Tom N Harris <tnharris@whoopdedo.org>
+ *
+ * @param string $name
+ * @return string
+ */
+function idx_cleanName($name) {
+    $name = utf8_romanize(trim((string)$name));
+    $name = preg_replace('#[ \./\\:-]+#', '_', $name);
+    $name = preg_replace('/[^A-Za-z0-9_]/', '', $name);
+    return strtolower($name);
+}
+
+//Setup VIM: ex: et ts=4 :
diff --git a/wiki/inc/infoutils.php b/wiki/inc/infoutils.php
new file mode 100644
index 0000000..57f89e5
--- /dev/null
+++ b/wiki/inc/infoutils.php
@@ -0,0 +1,530 @@
+<?php
+/**
+ * Information and debugging functions
+ *
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author     Andreas Gohr <andi@splitbrain.org>
+ */
+if(!defined('DOKU_INC')) die('meh.');
+
+if(!defined('DOKU_MESSAGEURL')){
+    if(in_array('ssl', stream_get_transports())) {
+        define('DOKU_MESSAGEURL','https://update.dokuwiki.org/check/');
+    }else{
+        define('DOKU_MESSAGEURL','http://update.dokuwiki.org/check/');
+    }
+}
+
+/**
+ * Check for new messages from upstream
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+function checkUpdateMessages(){
+    global $conf;
+    global $INFO;
+    global $updateVersion;
+    if(!$conf['updatecheck']) return;
+    if($conf['useacl'] && !$INFO['ismanager']) return;
+
+    $cf = getCacheName($updateVersion, '.updmsg');
+    $lm = @filemtime($cf);
+    $is_http = substr(DOKU_MESSAGEURL, 0, 5) != 'https';
+
+    // check if new messages needs to be fetched
+    if($lm < time()-(60*60*24) || $lm < @filemtime(DOKU_INC.DOKU_SCRIPT)){
+        @touch($cf);
+        dbglog("checkUpdateMessages(): downloading messages to ".$cf.($is_http?' (without SSL)':' (with SSL)'));
+        $http = new DokuHTTPClient();
+        $http->timeout = 12;
+        $resp = $http->get(DOKU_MESSAGEURL.$updateVersion);
+        if(is_string($resp) && ($resp == "" || substr(trim($resp), -1) == '%')) {
+            // basic sanity check that this is either an empty string response (ie "no messages")
+            // or it looks like one of our messages, not WiFi login or other interposed response
+            io_saveFile($cf,$resp);
+        } else {
+            dbglog("checkUpdateMessages(): unexpected HTTP response received");
+        }
+    }else{
+        dbglog("checkUpdateMessages(): messages up to date");
+    }
+
+    $data = io_readFile($cf);
+    // show messages through the usual message mechanism
+    $msgs = explode("\n%\n",$data);
+    foreach($msgs as $msg){
+        if($msg) msg($msg,2);
+    }
+}
+
+
+/**
+ * Return DokuWiki's version (split up in date and type)
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+function getVersionData(){
+    $version = array();
+    //import version string
+    if(file_exists(DOKU_INC.'VERSION')){
+        //official release
+        $version['date'] = trim(io_readFile(DOKU_INC.'VERSION'));
+        $version['type'] = 'Release';
+    }elseif(is_dir(DOKU_INC.'.git')){
+        $version['type'] = 'Git';
+        $version['date'] = 'unknown';
+
+        $inventory = DOKU_INC.'.git/logs/HEAD';
+        if(is_file($inventory)){
+            $sz   = filesize($inventory);
+            $seek = max(0,$sz-2000); // read from back of the file
+            $fh   = fopen($inventory,'rb');
+            fseek($fh,$seek);
+            $chunk = fread($fh,2000);
+            fclose($fh);
+            $chunk = trim($chunk);
+            $chunk = @array_pop(explode("\n",$chunk));   //last log line
+            $chunk = @array_shift(explode("\t",$chunk)); //strip commit msg
+            $chunk = explode(" ",$chunk);
+            array_pop($chunk); //strip timezone
+            $date = date('Y-m-d',array_pop($chunk));
+            if($date) $version['date'] = $date;
+        }
+    }else{
+        global $updateVersion;
+        $version['date'] = 'update version '.$updateVersion;
+        $version['type'] = 'snapshot?';
+    }
+    return $version;
+}
+
+/**
+ * Return DokuWiki's version (as a string)
+ *
+ * @author Anika Henke <anika@selfthinker.org>
+ */
+function getVersion(){
+    $version = getVersionData();
+    return $version['type'].' '.$version['date'];
+}
+
+/**
+ * Run a few sanity checks
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+function check(){
+    global $conf;
+    global $INFO;
+    /* @var Input $INPUT */
+    global $INPUT;
+
+    if ($INFO['isadmin'] || $INFO['ismanager']){
+        msg('DokuWiki version: '.getVersion(),1);
+
+        if(version_compare(phpversion(),'5.6.0','<')){
+            msg('Your PHP version is too old ('.phpversion().' vs. 5.6.0+ needed)',-1);
+        }else{
+            msg('PHP version '.phpversion(),1);
+        }
+    } else {
+        if(version_compare(phpversion(),'5.6.0','<')){
+            msg('Your PHP version is too old',-1);
+        }
+    }
+
+    $mem = (int) php_to_byte(ini_get('memory_limit'));
+    if($mem){
+        if($mem < 16777216){
+            msg('PHP is limited to less than 16MB RAM ('.$mem.' bytes). Increase memory_limit in php.ini',-1);
+        }elseif($mem < 20971520){
+            msg('PHP is limited to less than 20MB RAM ('.$mem.' bytes), you might encounter problems with bigger pages. Increase memory_limit in php.ini',-1);
+        }elseif($mem < 33554432){
+            msg('PHP is limited to less than 32MB RAM ('.$mem.' bytes), but that should be enough in most cases. If not, increase memory_limit in php.ini',0);
+        }else{
+            msg('More than 32MB RAM ('.$mem.' bytes) available.',1);
+        }
+    }
+
+    if(is_writable($conf['changelog'])){
+        msg('Changelog is writable',1);
+    }else{
+        if (file_exists($conf['changelog'])) {
+            msg('Changelog is not writable',-1);
+        }
+    }
+
+    if (isset($conf['changelog_old']) && file_exists($conf['changelog_old'])) {
+        msg('Old changelog exists', 0);
+    }
+
+    if (file_exists($conf['changelog'].'_failed')) {
+        msg('Importing old changelog failed', -1);
+    } else if (file_exists($conf['changelog'].'_importing')) {
+        msg('Importing old changelog now.', 0);
+    } else if (file_exists($conf['changelog'].'_import_ok')) {
+        msg('Old changelog imported', 1);
+        if (!plugin_isdisabled('importoldchangelog')) {
+            msg('Importoldchangelog plugin not disabled after import', -1);
+        }
+    }
+
+    if(is_writable(DOKU_CONF)){
+        msg('conf directory is writable',1);
+    }else{
+        msg('conf directory is not writable',-1);
+    }
+
+    if($conf['authtype'] == 'plain'){
+        global $config_cascade;
+        if(is_writable($config_cascade['plainauth.users']['default'])){
+            msg('conf/users.auth.php is writable',1);
+        }else{
+            msg('conf/users.auth.php is not writable',0);
+        }
+    }
+
+    if(function_exists('mb_strpos')){
+        if(defined('UTF8_NOMBSTRING')){
+            msg('mb_string extension is available but will not be used',0);
+        }else{
+            msg('mb_string extension is available and will be used',1);
+            if(ini_get('mbstring.func_overload') != 0){
+                msg('mb_string function overloading is enabled, this will cause problems and should be disabled',-1);
+            }
+        }
+    }else{
+        msg('mb_string extension not available - PHP only replacements will be used',0);
+    }
+
+    if (!UTF8_PREGSUPPORT) {
+        msg('PHP is missing UTF-8 support in Perl-Compatible Regular Expressions (PCRE)', -1);
+    }
+    if (!UTF8_PROPERTYSUPPORT) {
+        msg('PHP is missing Unicode properties support in Perl-Compatible Regular Expressions (PCRE)', -1);
+    }
+
+    $loc = setlocale(LC_ALL, 0);
+    if(!$loc){
+        msg('No valid locale is set for your PHP setup. You should fix this',-1);
+    }elseif(stripos($loc,'utf') === false){
+        msg('Your locale <code>'.hsc($loc).'</code> seems not to be a UTF-8 locale, you should fix this if you encounter problems.',0);
+    }else{
+        msg('Valid locale '.hsc($loc).' found.', 1);
+    }
+
+    if($conf['allowdebug']){
+        msg('Debugging support is enabled. If you don\'t need it you should set $conf[\'allowdebug\'] = 0',-1);
+    }else{
+        msg('Debugging support is disabled',1);
+    }
+
+    if($INFO['userinfo']['name']){
+        msg('You are currently logged in as '.$INPUT->server->str('REMOTE_USER').' ('.$INFO['userinfo']['name'].')',0);
+        msg('You are part of the groups '.join($INFO['userinfo']['grps'],', '),0);
+    }else{
+        msg('You are currently not logged in',0);
+    }
+
+    msg('Your current permission for this page is '.$INFO['perm'],0);
+
+    if(is_writable($INFO['filepath'])){
+        msg('The current page is writable by the webserver',0);
+    }else{
+        msg('The current page is not writable by the webserver',0);
+    }
+
+    if($INFO['writable']){
+        msg('The current page is writable by you',0);
+    }else{
+        msg('The current page is not writable by you',0);
+    }
+
+    // Check for corrupted search index
+    $lengths = idx_listIndexLengths();
+    $index_corrupted = false;
+    foreach ($lengths as $length) {
+        if (count(idx_getIndex('w', $length)) != count(idx_getIndex('i', $length))) {
+            $index_corrupted = true;
+            break;
+        }
+    }
+
+    foreach (idx_getIndex('metadata', '') as $index) {
+        if (count(idx_getIndex($index.'_w', '')) != count(idx_getIndex($index.'_i', ''))) {
+            $index_corrupted = true;
+            break;
+        }
+    }
+
+    if($index_corrupted) {
+        msg(
+            'The search index is corrupted. It might produce wrong results and most
+                probably needs to be rebuilt. See
+                <a href="http://www.dokuwiki.org/faq:searchindex">faq:searchindex</a>
+                for ways to rebuild the search index.', -1
+        );
+    } elseif(!empty($lengths)) {
+        msg('The search index seems to be working', 1);
+    } else {
+        msg(
+            'The search index is empty. See
+                <a href="http://www.dokuwiki.org/faq:searchindex">faq:searchindex</a>
+                for help on how to fix the search index. If the default indexer
+                isn\'t used or the wiki is actually empty this is normal.'
+        );
+    }
+
+    // rough time check
+    $http = new DokuHTTPClient();
+    $http->max_redirect = 0;
+    $http->timeout = 3;
+    $http->sendRequest('http://www.dokuwiki.org', '', 'HEAD');
+    $now = time();
+    if(isset($http->resp_headers['date'])) {
+        $time = strtotime($http->resp_headers['date']);
+        $diff = $time - $now;
+
+        if(abs($diff) < 4) {
+            msg("Server time seems to be okay. Diff: {$diff}s", 1);
+        } else {
+            msg("Your server's clock seems to be out of sync! Consider configuring a sync with a NTP server.  Diff: {$diff}s");
+        }
+    }
+
+}
+
+/**
+ * print a message
+ *
+ * If HTTP headers were not sent yet the message is added
+ * to the global message array else it's printed directly
+ * using html_msgarea()
+ *
+ *
+ * Levels can be:
+ *
+ * -1 error
+ *  0 info
+ *  1 success
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @see    html_msgarea
+ */
+
+define('MSG_PUBLIC', 0);
+define('MSG_USERS_ONLY', 1);
+define('MSG_MANAGERS_ONLY',2);
+define('MSG_ADMINS_ONLY',4);
+
+/**
+ * Display a message to the user
+ *
+ * @param string $message
+ * @param int    $lvl   -1 = error, 0 = info, 1 = success, 2 = notify
+ * @param string $line  line number
+ * @param string $file  file number
+ * @param int    $allow who's allowed to see the message, see MSG_* constants
+ */
+function msg($message,$lvl=0,$line='',$file='',$allow=MSG_PUBLIC){
+    global $MSG, $MSG_shown;
+    $errors = array();
+    $errors[-1] = 'error';
+    $errors[0]  = 'info';
+    $errors[1]  = 'success';
+    $errors[2]  = 'notify';
+
+    if($line || $file) $message.=' ['.utf8_basename($file).':'.$line.']';
+
+    if(!isset($MSG)) $MSG = array();
+    $MSG[]=array('lvl' => $errors[$lvl], 'msg' => $message, 'allow' => $allow);
+    if(isset($MSG_shown) || headers_sent()){
+        if(function_exists('html_msgarea')){
+            html_msgarea();
+        }else{
+            print "ERROR($lvl) $message";
+        }
+        unset($GLOBALS['MSG']);
+    }
+}
+/**
+ * Determine whether the current user is allowed to view the message
+ * in the $msg data structure
+ *
+ * @param  $msg   array    dokuwiki msg structure
+ *                         msg   => string, the message
+ *                         lvl   => int, level of the message (see msg() function)
+ *                         allow => int, flag used to determine who is allowed to see the message
+ *                                       see MSG_* constants
+ * @return bool
+ */
+function info_msg_allowed($msg){
+    global $INFO, $auth;
+
+    // is the message public? - everyone and anyone can see it
+    if (empty($msg['allow']) || ($msg['allow'] == MSG_PUBLIC)) return true;
+
+    // restricted msg, but no authentication
+    if (empty($auth)) return false;
+
+    switch ($msg['allow']){
+        case MSG_USERS_ONLY:
+            return !empty($INFO['userinfo']);
+
+        case MSG_MANAGERS_ONLY:
+            return $INFO['ismanager'];
+
+        case MSG_ADMINS_ONLY:
+            return $INFO['isadmin'];
+
+        default:
+            trigger_error('invalid msg allow restriction.  msg="'.$msg['msg'].'" allow='.$msg['allow'].'"', E_USER_WARNING);
+            return $INFO['isadmin'];
+    }
+
+    return false;
+}
+
+/**
+ * print debug messages
+ *
+ * little function to print the content of a var
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param string $msg
+ * @param bool $hidden
+ */
+function dbg($msg,$hidden=false){
+    if($hidden){
+        echo "<!--\n";
+        print_r($msg);
+        echo "\n-->";
+    }else{
+        echo '<pre class="dbg">';
+        echo hsc(print_r($msg,true));
+        echo '</pre>';
+    }
+}
+
+/**
+ * Print info to a log file
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param string $msg
+ * @param string $header
+ */
+function dbglog($msg,$header=''){
+    global $conf;
+    /* @var Input $INPUT */
+    global $INPUT;
+
+    // The debug log isn't automatically cleaned thus only write it when
+    // debugging has been enabled by the user.
+    if($conf['allowdebug'] !== 1) return;
+    if(is_object($msg) || is_array($msg)){
+        $msg = print_r($msg,true);
+    }
+
+    if($header) $msg = "$header\n$msg";
+
+    $file = $conf['cachedir'].'/debug.log';
+    $fh = fopen($file,'a');
+    if($fh){
+        fwrite($fh,date('H:i:s ').$INPUT->server->str('REMOTE_ADDR').': '.$msg."\n");
+        fclose($fh);
+    }
+}
+
+/**
+ * Log accesses to deprecated fucntions to the debug log
+ *
+ * @param string $alternative The function or method that should be used instead
+ */
+function dbg_deprecated($alternative = '') {
+    global $conf;
+    if(!$conf['allowdebug']) return;
+
+    $backtrace = debug_backtrace();
+    array_shift($backtrace);
+    $self = array_shift($backtrace);
+    $call = array_shift($backtrace);
+
+    $called = trim($self['class'].'::'.$self['function'].'()', ':');
+    $caller = trim($call['class'].'::'.$call['function'].'()', ':');
+
+    $msg = $called.' is deprecated. It was called from ';
+    $msg .= $caller.' in '.$call['file'].':'.$call['line'];
+    if($alternative) {
+        $msg .= ' '.$alternative.' should be used instead!';
+    }
+
+    dbglog($msg);
+}
+
+/**
+ * Print a reversed, prettyprinted backtrace
+ *
+ * @author Gary Owen <gary_owen@bigfoot.com>
+ */
+function dbg_backtrace(){
+    // Get backtrace
+    $backtrace = debug_backtrace();
+
+    // Unset call to debug_print_backtrace
+    array_shift($backtrace);
+
+    // Iterate backtrace
+    $calls = array();
+    $depth = count($backtrace) - 1;
+    foreach ($backtrace as $i => $call) {
+        $location = $call['file'] . ':' . $call['line'];
+        $function = (isset($call['class'])) ?
+            $call['class'] . $call['type'] . $call['function'] : $call['function'];
+
+        $params = array();
+        if (isset($call['args'])){
+            foreach($call['args'] as $arg){
+                if(is_object($arg)){
+                    $params[] = '[Object '.get_class($arg).']';
+                }elseif(is_array($arg)){
+                    $params[] = '[Array]';
+                }elseif(is_null($arg)){
+                    $params[] = '[NULL]';
+                }else{
+                    $params[] = (string) '"'.$arg.'"';
+                }
+            }
+        }
+        $params = implode(', ',$params);
+
+        $calls[$depth - $i] = sprintf('%s(%s) called at %s',
+                $function,
+                str_replace("\n", '\n', $params),
+                $location);
+    }
+    ksort($calls);
+
+    return implode("\n", $calls);
+}
+
+/**
+ * Remove all data from an array where the key seems to point to sensitive data
+ *
+ * This is used to remove passwords, mail addresses and similar data from the
+ * debug output
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param array $data
+ */
+function debug_guard(&$data){
+    foreach($data as $key => $value){
+        if(preg_match('/(notify|pass|auth|secret|ftp|userinfo|token|buid|mail|proxy)/i',$key)){
+            $data[$key] = '***';
+            continue;
+        }
+        if(is_array($value)) debug_guard($data[$key]);
+    }
+}
diff --git a/wiki/inc/init.php b/wiki/inc/init.php
new file mode 100644
index 0000000..ba6743f
--- /dev/null
+++ b/wiki/inc/init.php
@@ -0,0 +1,601 @@
+<?php
+/**
+ * Initialize some defaults needed for DokuWiki
+ */
+
+
+/**
+ * timing Dokuwiki execution
+ *
+ * @param integer $start
+ *
+ * @return mixed
+ */
+function delta_time($start=0) {
+    return microtime(true)-((float)$start);
+}
+define('DOKU_START_TIME', delta_time());
+
+global $config_cascade;
+$config_cascade = array();
+
+// if available load a preload config file
+$preload = fullpath(dirname(__FILE__)).'/preload.php';
+if (file_exists($preload)) include($preload);
+
+// define the include path
+if(!defined('DOKU_INC')) define('DOKU_INC',fullpath(dirname(__FILE__).'/../').'/');
+
+// define Plugin dir
+if(!defined('DOKU_PLUGIN'))  define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/');
+
+// define config path (packagers may want to change this to /etc/dokuwiki/)
+if(!defined('DOKU_CONF')) define('DOKU_CONF',DOKU_INC.'conf/');
+
+// check for error reporting override or set error reporting to sane values
+if (!defined('DOKU_E_LEVEL') && file_exists(DOKU_CONF.'report_e_all')) {
+    define('DOKU_E_LEVEL', E_ALL);
+}
+if (!defined('DOKU_E_LEVEL')) {
+    error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED & ~E_STRICT);
+} else {
+    error_reporting(DOKU_E_LEVEL);
+}
+
+// avoid caching issues #1594
+header('Vary: Cookie');
+
+// init memory caches
+global $cache_revinfo;
+       $cache_revinfo = array();
+global $cache_wikifn;
+       $cache_wikifn = array();
+global $cache_cleanid;
+       $cache_cleanid = array();
+global $cache_authname;
+       $cache_authname = array();
+global $cache_metadata;
+       $cache_metadata = array();
+
+// always include 'inc/config_cascade.php'
+// previously in preload.php set fields of $config_cascade will be merged with the defaults
+include(DOKU_INC.'inc/config_cascade.php');
+
+//prepare config array()
+global $conf;
+$conf = array();
+
+// load the global config file(s)
+foreach (array('default','local','protected') as $config_group) {
+    if (empty($config_cascade['main'][$config_group])) continue;
+    foreach ($config_cascade['main'][$config_group] as $config_file) {
+        if (file_exists($config_file)) {
+            include($config_file);
+        }
+    }
+}
+
+//prepare license array()
+global $license;
+$license = array();
+
+// load the license file(s)
+foreach (array('default','local') as $config_group) {
+    if (empty($config_cascade['license'][$config_group])) continue;
+    foreach ($config_cascade['license'][$config_group] as $config_file) {
+        if(file_exists($config_file)){
+            include($config_file);
+        }
+    }
+}
+
+// set timezone (as in pre 5.3.0 days)
+date_default_timezone_set(@date_default_timezone_get());
+
+// define baseURL
+if(!defined('DOKU_REL')) define('DOKU_REL',getBaseURL(false));
+if(!defined('DOKU_URL')) define('DOKU_URL',getBaseURL(true));
+if(!defined('DOKU_BASE')){
+    if($conf['canonical']){
+        define('DOKU_BASE',DOKU_URL);
+    }else{
+        define('DOKU_BASE',DOKU_REL);
+    }
+}
+
+// define whitespace
+if(!defined('DOKU_LF')) define ('DOKU_LF',"\n");
+if(!defined('DOKU_TAB')) define ('DOKU_TAB',"\t");
+
+// define cookie and session id, append server port when securecookie is configured FS#1664
+if (!defined('DOKU_COOKIE')) define('DOKU_COOKIE', 'DW'.md5(DOKU_REL.(($conf['securecookie'])?$_SERVER['SERVER_PORT']:'')));
+
+
+// define main script
+if(!defined('DOKU_SCRIPT')) define('DOKU_SCRIPT','doku.php');
+
+// DEPRECATED, use tpl_basedir() instead
+if(!defined('DOKU_TPL')) define('DOKU_TPL',
+        DOKU_BASE.'lib/tpl/'.$conf['template'].'/');
+
+// DEPRECATED, use tpl_incdir() instead
+if(!defined('DOKU_TPLINC')) define('DOKU_TPLINC',
+        DOKU_INC.'lib/tpl/'.$conf['template'].'/');
+
+// make session rewrites XHTML compliant
+@ini_set('arg_separator.output', '&amp;');
+
+// make sure global zlib does not interfere FS#1132
+@ini_set('zlib.output_compression', 'off');
+
+// increase PCRE backtrack limit
+@ini_set('pcre.backtrack_limit', '20971520');
+
+// enable gzip compression if supported
+$conf['gzip_output'] &= (strpos($_SERVER['HTTP_ACCEPT_ENCODING'],'gzip') !== false);
+global $ACT;
+if ($conf['gzip_output'] &&
+        !defined('DOKU_DISABLE_GZIP_OUTPUT') &&
+        function_exists('ob_gzhandler') &&
+        // Disable compression when a (compressed) sitemap might be delivered
+        // See https://bugs.dokuwiki.org/index.php?do=details&task_id=2576
+        $ACT != 'sitemap') {
+    ob_start('ob_gzhandler');
+}
+
+// init session
+if(!headers_sent() && !defined('NOSESSION')) {
+    if(!defined('DOKU_SESSION_NAME'))     define ('DOKU_SESSION_NAME', "DokuWiki");
+    if(!defined('DOKU_SESSION_LIFETIME')) define ('DOKU_SESSION_LIFETIME', 0);
+    if(!defined('DOKU_SESSION_PATH')) {
+        $cookieDir = empty($conf['cookiedir']) ? DOKU_REL : $conf['cookiedir'];
+        define ('DOKU_SESSION_PATH', $cookieDir);
+    }
+    if(!defined('DOKU_SESSION_DOMAIN'))   define ('DOKU_SESSION_DOMAIN', '');
+
+    // start the session
+    init_session();
+
+    // load left over messages
+    if(isset($_SESSION[DOKU_COOKIE]['msg'])) {
+        $MSG = $_SESSION[DOKU_COOKIE]['msg'];
+        unset($_SESSION[DOKU_COOKIE]['msg']);
+    }
+}
+
+// don't let cookies ever interfere with request vars
+$_REQUEST = array_merge($_GET,$_POST);
+
+// we don't want a purge URL to be digged
+if(isset($_REQUEST['purge']) && !empty($_SERVER['HTTP_REFERER'])) unset($_REQUEST['purge']);
+
+// precalculate file creation modes
+init_creationmodes();
+
+// make real paths and check them
+init_paths();
+init_files();
+
+// setup plugin controller class (can be overwritten in preload.php)
+$plugin_types = array('auth', 'admin','syntax','action','renderer', 'helper','remote');
+global $plugin_controller_class, $plugin_controller;
+if (empty($plugin_controller_class)) $plugin_controller_class = 'Doku_Plugin_Controller';
+
+// load libraries
+require_once(DOKU_INC.'vendor/autoload.php');
+require_once(DOKU_INC.'inc/load.php');
+
+// disable gzip if not available
+define('DOKU_HAS_BZIP', function_exists('bzopen'));
+define('DOKU_HAS_GZIP', function_exists('gzopen'));
+if($conf['compression'] == 'bz2' && !DOKU_HAS_BZIP) {
+    $conf['compression'] = 'gz';
+}
+if($conf['compression'] == 'gz' && !DOKU_HAS_GZIP) {
+    $conf['compression'] = 0;
+}
+
+// input handle class
+global $INPUT;
+$INPUT = new Input();
+
+// initialize plugin controller
+$plugin_controller = new $plugin_controller_class();
+
+// initialize the event handler
+global $EVENT_HANDLER;
+$EVENT_HANDLER = new Doku_Event_Handler();
+
+$local = $conf['lang'];
+trigger_event('INIT_LANG_LOAD', $local, 'init_lang', true);
+
+
+// setup authentication system
+if (!defined('NOSESSION')) {
+    auth_setup();
+}
+
+// setup mail system
+mail_setup();
+
+/**
+ * Initializes the session
+ *
+ * Makes sure the passed session cookie is valid, invalid ones are ignored an a new session ID is issued
+ *
+ * @link http://stackoverflow.com/a/33024310/172068
+ * @link http://php.net/manual/en/session.configuration.php#ini.session.sid-length
+ */
+function init_session() {
+    global $conf;
+    session_name(DOKU_SESSION_NAME);
+    session_set_cookie_params(DOKU_SESSION_LIFETIME, DOKU_SESSION_PATH, DOKU_SESSION_DOMAIN, ($conf['securecookie'] && is_ssl()), true);
+
+    // make sure the session cookie contains a valid session ID
+    if(isset($_COOKIE[DOKU_SESSION_NAME]) && !preg_match('/^[-,a-zA-Z0-9]{22,256}$/', $_COOKIE[DOKU_SESSION_NAME])) {
+        unset($_COOKIE[DOKU_SESSION_NAME]);
+    }
+
+    session_start();
+}
+
+
+/**
+ * Checks paths from config file
+ */
+function init_paths(){
+    global $conf;
+
+    $paths = array('datadir'   => 'pages',
+            'olddir'    => 'attic',
+            'mediadir'  => 'media',
+            'mediaolddir' => 'media_attic',
+            'metadir'   => 'meta',
+            'mediametadir' => 'media_meta',
+            'cachedir'  => 'cache',
+            'indexdir'  => 'index',
+            'lockdir'   => 'locks',
+            'tmpdir'    => 'tmp');
+
+    foreach($paths as $c => $p) {
+        $path = empty($conf[$c]) ? $conf['savedir'].'/'.$p : $conf[$c];
+        $conf[$c] = init_path($path);
+        if(empty($conf[$c]))
+            nice_die("The $c ('$p') at $path is not found, isn't accessible or writable.
+                You should check your config and permission settings.
+                Or maybe you want to <a href=\"install.php\">run the
+                installer</a>?");
+    }
+
+    // path to old changelog only needed for upgrading
+    $conf['changelog_old'] = init_path((isset($conf['changelog']))?($conf['changelog']):($conf['savedir'].'/changes.log'));
+    if ($conf['changelog_old']=='') { unset($conf['changelog_old']); }
+    // hardcoded changelog because it is now a cache that lives in meta
+    $conf['changelog'] = $conf['metadir'].'/_dokuwiki.changes';
+    $conf['media_changelog'] = $conf['metadir'].'/_media.changes';
+}
+
+/**
+ * Load the language strings
+ *
+ * @param string $langCode language code, as passed by event handler
+ */
+function init_lang($langCode) {
+    //prepare language array
+    global $lang, $config_cascade;
+    $lang = array();
+
+    //load the language files
+    require(DOKU_INC.'inc/lang/en/lang.php');
+    foreach ($config_cascade['lang']['core'] as $config_file) {
+        if (file_exists($config_file . 'en/lang.php')) {
+            include($config_file . 'en/lang.php');
+        }
+    }
+
+    if ($langCode && $langCode != 'en') {
+        if (file_exists(DOKU_INC."inc/lang/$langCode/lang.php")) {
+            require(DOKU_INC."inc/lang/$langCode/lang.php");
+        }
+        foreach ($config_cascade['lang']['core'] as $config_file) {
+            if (file_exists($config_file . "$langCode/lang.php")) {
+                include($config_file . "$langCode/lang.php");
+            }
+        }
+    }
+}
+
+/**
+ * Checks the existence of certain files and creates them if missing.
+ */
+function init_files(){
+    global $conf;
+
+    $files = array($conf['indexdir'].'/page.idx');
+
+    foreach($files as $file){
+        if(!file_exists($file)){
+            $fh = @fopen($file,'a');
+            if($fh){
+                fclose($fh);
+                if(!empty($conf['fperm'])) chmod($file, $conf['fperm']);
+            }else{
+                nice_die("$file is not writable. Check your permissions settings!");
+            }
+        }
+    }
+}
+
+/**
+ * Returns absolute path
+ *
+ * This tries the given path first, then checks in DOKU_INC.
+ * Check for accessibility on directories as well.
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param string $path
+ *
+ * @return bool|string
+ */
+function init_path($path){
+    // check existence
+    $p = fullpath($path);
+    if(!file_exists($p)){
+        $p = fullpath(DOKU_INC.$path);
+        if(!file_exists($p)){
+            return '';
+        }
+    }
+
+    // check writability
+    if(!@is_writable($p)){
+        return '';
+    }
+
+    // check accessability (execute bit) for directories
+    if(@is_dir($p) && !file_exists("$p/.")){
+        return '';
+    }
+
+    return $p;
+}
+
+/**
+ * Sets the internal config values fperm and dperm which, when set,
+ * will be used to change the permission of a newly created dir or
+ * file with chmod. Considers the influence of the system's umask
+ * setting the values only if needed.
+ */
+function init_creationmodes(){
+    global $conf;
+
+    // Legacy support for old umask/dmask scheme
+    unset($conf['dmask']);
+    unset($conf['fmask']);
+    unset($conf['umask']);
+    unset($conf['fperm']);
+    unset($conf['dperm']);
+
+    // get system umask, fallback to 0 if none available
+    $umask = @umask();
+    if(!$umask) $umask = 0000;
+
+    // check what is set automatically by the system on file creation
+    // and set the fperm param if it's not what we want
+    $auto_fmode = 0666 & ~$umask;
+    if($auto_fmode != $conf['fmode']) $conf['fperm'] = $conf['fmode'];
+
+    // check what is set automatically by the system on file creation
+    // and set the dperm param if it's not what we want
+    $auto_dmode = $conf['dmode'] & ~$umask;
+    if($auto_dmode != $conf['dmode']) $conf['dperm'] = $conf['dmode'];
+}
+
+/**
+ * Returns the full absolute URL to the directory where
+ * DokuWiki is installed in (includes a trailing slash)
+ *
+ * !! Can not access $_SERVER values through $INPUT
+ * !! here as this function is called before $INPUT is
+ * !! initialized.
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param null|string $abs
+ *
+ * @return string
+ */
+function getBaseURL($abs=null){
+    global $conf;
+    //if canonical url enabled always return absolute
+    if(is_null($abs)) $abs = $conf['canonical'];
+
+    if(!empty($conf['basedir'])){
+        $dir = $conf['basedir'];
+    }elseif(substr($_SERVER['SCRIPT_NAME'],-4) == '.php'){
+        $dir = dirname($_SERVER['SCRIPT_NAME']);
+    }elseif(substr($_SERVER['PHP_SELF'],-4) == '.php'){
+        $dir = dirname($_SERVER['PHP_SELF']);
+    }elseif($_SERVER['DOCUMENT_ROOT'] && $_SERVER['SCRIPT_FILENAME']){
+        $dir = preg_replace ('/^'.preg_quote($_SERVER['DOCUMENT_ROOT'],'/').'/','',
+                $_SERVER['SCRIPT_FILENAME']);
+        $dir = dirname('/'.$dir);
+    }else{
+        $dir = '.'; //probably wrong
+    }
+
+    $dir = str_replace('\\','/',$dir);             // bugfix for weird WIN behaviour
+    $dir = preg_replace('#//+#','/',"/$dir/");     // ensure leading and trailing slashes
+
+    //handle script in lib/exe dir
+    $dir = preg_replace('!lib/exe/$!','',$dir);
+
+    //handle script in lib/plugins dir
+    $dir = preg_replace('!lib/plugins/.*$!','',$dir);
+
+    //finish here for relative URLs
+    if(!$abs) return $dir;
+
+    //use config option if available, trim any slash from end of baseurl to avoid multiple consecutive slashes in the path
+    if(!empty($conf['baseurl'])) return rtrim($conf['baseurl'],'/').$dir;
+
+    //split hostheader into host and port
+    if(isset($_SERVER['HTTP_HOST'])){
+        $parsed_host = parse_url('http://'.$_SERVER['HTTP_HOST']);
+        $host = isset($parsed_host['host']) ? $parsed_host['host'] : null;
+        $port = isset($parsed_host['port']) ? $parsed_host['port'] : null;
+    }elseif(isset($_SERVER['SERVER_NAME'])){
+        $parsed_host = parse_url('http://'.$_SERVER['SERVER_NAME']);
+        $host = isset($parsed_host['host']) ? $parsed_host['host'] : null;
+        $port = isset($parsed_host['port']) ? $parsed_host['port'] : null;
+    }else{
+        $host = php_uname('n');
+        $port = '';
+    }
+
+    if(is_null($port)){
+        $port = '';
+    }
+
+    if(!is_ssl()){
+        $proto = 'http://';
+        if ($port == '80') {
+            $port = '';
+        }
+    }else{
+        $proto = 'https://';
+        if ($port == '443') {
+            $port = '';
+        }
+    }
+
+    if($port !== '') $port = ':'.$port;
+
+    return $proto.$host.$port.$dir;
+}
+
+/**
+ * Check if accessed via HTTPS
+ *
+ * Apache leaves ,$_SERVER['HTTPS'] empty when not available, IIS sets it to 'off'.
+ * 'false' and 'disabled' are just guessing
+ *
+ * @returns bool true when SSL is active
+ */
+function is_ssl() {
+    // check if we are behind a reverse proxy
+    if(isset($_SERVER['HTTP_X_FORWARDED_PROTO'])) {
+        if($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') {
+            return true;
+        } else {
+            return false;
+        }
+    }
+    if(!isset($_SERVER['HTTPS']) ||
+        preg_match('/^(|off|false|disabled)$/i', $_SERVER['HTTPS'])) {
+        return false;
+    } else {
+        return true;
+    }
+}
+
+/**
+ * checks it is windows OS
+ * @return bool
+ */
+function isWindows() {
+    return (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') ? true : false;
+}
+
+/**
+ * print a nice message even if no styles are loaded yet.
+ *
+ * @param integer|string $msg
+ */
+function nice_die($msg){
+    echo<<<EOT
+<!DOCTYPE html>
+<html>
+<head><title>DokuWiki Setup Error</title></head>
+<body style="font-family: Arial, sans-serif">
+    <div style="width:60%; margin: auto; background-color: #fcc;
+                border: 1px solid #faa; padding: 0.5em 1em;">
+        <h1 style="font-size: 120%">DokuWiki Setup Error</h1>
+        <p>$msg</p>
+    </div>
+</body>
+</html>
+EOT;
+    if(defined('DOKU_UNITTEST')) {
+        throw new RuntimeException('nice_die: '.$msg);
+    }
+    exit(1);
+}
+
+/**
+ * A realpath() replacement
+ *
+ * This function behaves similar to PHP's realpath() but does not resolve
+ * symlinks or accesses upper directories
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @author <richpageau at yahoo dot co dot uk>
+ * @link   http://php.net/manual/en/function.realpath.php#75992
+ *
+ * @param string $path
+ * @param bool $exists
+ *
+ * @return bool|string
+ */
+function fullpath($path,$exists=false){
+    static $run = 0;
+    $root  = '';
+    $iswin = (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN' || @$GLOBALS['DOKU_UNITTEST_ASSUME_WINDOWS']);
+
+    // find the (indestructable) root of the path - keeps windows stuff intact
+    if($path{0} == '/'){
+        $root = '/';
+    }elseif($iswin){
+        // match drive letter and UNC paths
+        if(preg_match('!^([a-zA-z]:)(.*)!',$path,$match)){
+            $root = $match[1].'/';
+            $path = $match[2];
+        }else if(preg_match('!^(\\\\\\\\[^\\\\/]+\\\\[^\\\\/]+[\\\\/])(.*)!',$path,$match)){
+            $root = $match[1];
+            $path = $match[2];
+        }
+    }
+    $path = str_replace('\\','/',$path);
+
+    // if the given path wasn't absolute already, prepend the script path and retry
+    if(!$root){
+        $base = dirname($_SERVER['SCRIPT_FILENAME']);
+        $path = $base.'/'.$path;
+        if($run == 0){ // avoid endless recursion when base isn't absolute for some reason
+            $run++;
+            return fullpath($path,$exists);
+        }
+    }
+    $run = 0;
+
+    // canonicalize
+    $path=explode('/', $path);
+    $newpath=array();
+    foreach($path as $p) {
+        if ($p === '' || $p === '.') continue;
+        if ($p==='..') {
+            array_pop($newpath);
+            continue;
+        }
+        array_push($newpath, $p);
+    }
+    $finalpath = $root.implode('/', $newpath);
+
+    // check for existence when needed (except when unit testing)
+    if($exists && !defined('DOKU_UNITTEST') && !file_exists($finalpath)) {
+        return false;
+    }
+    return $finalpath;
+}
+
diff --git a/wiki/inc/io.php b/wiki/inc/io.php
new file mode 100644
index 0000000..7b646f1
--- /dev/null
+++ b/wiki/inc/io.php
@@ -0,0 +1,827 @@
+<?php
+/**
+ * File IO functions
+ *
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author     Andreas Gohr <andi@splitbrain.org>
+ */
+
+if(!defined('DOKU_INC')) die('meh.');
+
+/**
+ * Removes empty directories
+ *
+ * Sends IO_NAMESPACE_DELETED events for 'pages' and 'media' namespaces.
+ * Event data:
+ * $data[0]    ns: The colon separated namespace path minus the trailing page name.
+ * $data[1]    ns_type: 'pages' or 'media' namespace tree.
+ *
+ * @todo use safemode hack
+ * @param string $id      - a pageid, the namespace of that id will be tried to deleted
+ * @param string $basedir - the config name of the type to delete (datadir or mediadir usally)
+ * @return bool - true if at least one namespace was deleted
+ *
+ * @author  Andreas Gohr <andi@splitbrain.org>
+ * @author Ben Coburn <btcoburn@silicodon.net>
+ */
+function io_sweepNS($id,$basedir='datadir'){
+    global $conf;
+    $types = array ('datadir'=>'pages', 'mediadir'=>'media');
+    $ns_type = (isset($types[$basedir])?$types[$basedir]:false);
+
+    $delone = false;
+
+    //scan all namespaces
+    while(($id = getNS($id)) !== false){
+        $dir = $conf[$basedir].'/'.utf8_encodeFN(str_replace(':','/',$id));
+
+        //try to delete dir else return
+        if(@rmdir($dir)) {
+            if ($ns_type!==false) {
+                $data = array($id, $ns_type);
+                $delone = true; // we deleted at least one dir
+                trigger_event('IO_NAMESPACE_DELETED', $data);
+            }
+        } else { return $delone; }
+    }
+    return $delone;
+}
+
+/**
+ * Used to read in a DokuWiki page from file, and send IO_WIKIPAGE_READ events.
+ *
+ * Generates the action event which delegates to io_readFile().
+ * Action plugins are allowed to modify the page content in transit.
+ * The file path should not be changed.
+ *
+ * Event data:
+ * $data[0]    The raw arguments for io_readFile as an array.
+ * $data[1]    ns: The colon separated namespace path minus the trailing page name. (false if root ns)
+ * $data[2]    page_name: The wiki page name.
+ * $data[3]    rev: The page revision, false for current wiki pages.
+ *
+ * @author Ben Coburn <btcoburn@silicodon.net>
+ *
+ * @param string   $file filename
+ * @param string   $id page id
+ * @param bool|int $rev revision timestamp
+ * @return string
+ */
+function io_readWikiPage($file, $id, $rev=false) {
+    if (empty($rev)) { $rev = false; }
+    $data = array(array($file, true), getNS($id), noNS($id), $rev);
+    return trigger_event('IO_WIKIPAGE_READ', $data, '_io_readWikiPage_action', false);
+}
+
+/**
+ * Callback adapter for io_readFile().
+ *
+ * @author Ben Coburn <btcoburn@silicodon.net>
+ *
+ * @param array $data event data
+ * @return string
+ */
+function _io_readWikiPage_action($data) {
+    if (is_array($data) && is_array($data[0]) && count($data[0])===2) {
+        return call_user_func_array('io_readFile', $data[0]);
+    } else {
+        return ''; //callback error
+    }
+}
+
+/**
+ * Returns content of $file as cleaned string.
+ *
+ * Uses gzip if extension is .gz
+ *
+ * If you want to use the returned value in unserialize
+ * be sure to set $clean to false!
+ *
+ * @author  Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param string $file  filename
+ * @param bool   $clean
+ * @return string|bool the file contents or false on error
+ */
+function io_readFile($file,$clean=true){
+    $ret = '';
+    if(file_exists($file)){
+        if(substr($file,-3) == '.gz'){
+            if(!DOKU_HAS_GZIP) return false;
+            $ret = gzfile($file);
+            if(is_array($ret)) $ret = join('', $ret);
+        }else if(substr($file,-4) == '.bz2'){
+            if(!DOKU_HAS_BZIP) return false;
+            $ret = bzfile($file);
+        }else{
+            $ret = file_get_contents($file);
+        }
+    }
+    if($ret === null) return false;
+    if($ret !== false && $clean){
+        return cleanText($ret);
+    }else{
+        return $ret;
+    }
+}
+/**
+ * Returns the content of a .bz2 compressed file as string
+ *
+ * @author marcel senf <marcel@rucksackreinigung.de>
+ * @author  Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param string $file filename
+ * @param bool   $array return array of lines
+ * @return string|array|bool content or false on error
+ */
+function bzfile($file, $array=false) {
+    $bz = bzopen($file,"r");
+    if($bz === false) return false;
+
+    if($array) $lines = array();
+    $str = '';
+    while (!feof($bz)) {
+        //8192 seems to be the maximum buffersize?
+        $buffer = bzread($bz,8192);
+        if(($buffer === false) || (bzerrno($bz) !== 0)) {
+            return false;
+        }
+        $str = $str . $buffer;
+        if($array) {
+            $pos = strpos($str, "\n");
+            while($pos !== false) {
+                $lines[] = substr($str, 0, $pos+1);
+                $str = substr($str, $pos+1);
+                $pos = strpos($str, "\n");
+            }
+        }
+    }
+    bzclose($bz);
+    if($array) {
+        if($str !== '') $lines[] = $str;
+        return $lines;
+    }
+    return $str;
+}
+
+/**
+ * Used to write out a DokuWiki page to file, and send IO_WIKIPAGE_WRITE events.
+ *
+ * This generates an action event and delegates to io_saveFile().
+ * Action plugins are allowed to modify the page content in transit.
+ * The file path should not be changed.
+ * (The append parameter is set to false.)
+ *
+ * Event data:
+ * $data[0]    The raw arguments for io_saveFile as an array.
+ * $data[1]    ns: The colon separated namespace path minus the trailing page name. (false if root ns)
+ * $data[2]    page_name: The wiki page name.
+ * $data[3]    rev: The page revision, false for current wiki pages.
+ *
+ * @author Ben Coburn <btcoburn@silicodon.net>
+ *
+ * @param string $file      filename
+ * @param string $content
+ * @param string $id        page id
+ * @param int|bool $rev timestamp of revision
+ * @return bool
+ */
+function io_writeWikiPage($file, $content, $id, $rev=false) {
+    if (empty($rev)) { $rev = false; }
+    if ($rev===false) { io_createNamespace($id); } // create namespaces as needed
+    $data = array(array($file, $content, false), getNS($id), noNS($id), $rev);
+    return trigger_event('IO_WIKIPAGE_WRITE', $data, '_io_writeWikiPage_action', false);
+}
+
+/**
+ * Callback adapter for io_saveFile().
+ * @author Ben Coburn <btcoburn@silicodon.net>
+ *
+ * @param array $data event data
+ * @return bool
+ */
+function _io_writeWikiPage_action($data) {
+    if (is_array($data) && is_array($data[0]) && count($data[0])===3) {
+        $ok = call_user_func_array('io_saveFile', $data[0]);
+        // for attic files make sure the file has the mtime of the revision
+        if($ok && is_int($data[3]) && $data[3] > 0) {
+            @touch($data[0][0], $data[3]);
+        }
+        return $ok;
+    } else {
+        return false; //callback error
+    }
+}
+
+/**
+ * Internal function to save contents to a file.
+ *
+ * @author  Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param string $file filename path to file
+ * @param string $content
+ * @param bool   $append
+ * @return bool true on success, otherwise false
+ */
+function _io_saveFile($file, $content, $append) {
+    global $conf;
+    $mode = ($append) ? 'ab' : 'wb';
+    $fileexists = file_exists($file);
+
+    if(substr($file,-3) == '.gz'){
+        if(!DOKU_HAS_GZIP) return false;
+        $fh = @gzopen($file,$mode.'9');
+        if(!$fh) return false;
+        gzwrite($fh, $content);
+        gzclose($fh);
+    }else if(substr($file,-4) == '.bz2'){
+        if(!DOKU_HAS_BZIP) return false;
+        if($append) {
+            $bzcontent = bzfile($file);
+            if($bzcontent === false) return false;
+            $content = $bzcontent.$content;
+        }
+        $fh = @bzopen($file,'w');
+        if(!$fh) return false;
+        bzwrite($fh, $content);
+        bzclose($fh);
+    }else{
+        $fh = @fopen($file,$mode);
+        if(!$fh) return false;
+        fwrite($fh, $content);
+        fclose($fh);
+    }
+
+    if(!$fileexists and !empty($conf['fperm'])) chmod($file, $conf['fperm']);
+    return true;
+}
+
+/**
+ * Saves $content to $file.
+ *
+ * If the third parameter is set to true the given content
+ * will be appended.
+ *
+ * Uses gzip if extension is .gz
+ * and bz2 if extension is .bz2
+ *
+ * @author  Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param string $file filename path to file
+ * @param string $content
+ * @param bool   $append
+ * @return bool true on success, otherwise false
+ */
+function io_saveFile($file, $content, $append=false) {
+    io_makeFileDir($file);
+    io_lock($file);
+    if(!_io_saveFile($file, $content, $append)) {
+        msg("Writing $file failed",-1);
+        io_unlock($file);
+        return false;
+    }
+    io_unlock($file);
+    return true;
+}
+
+/**
+ * Replace one or more occurrences of a line in a file.
+ *
+ * The default, when $maxlines is 0 is to delete all matching lines then append a single line.
+ * A regex that matches any part of the line will remove the entire line in this mode.
+ * Captures in $newline are not available.
+ *
+ * Otherwise each line is matched and replaced individually, up to the first $maxlines lines
+ * or all lines if $maxlines is -1. If $regex is true then captures can be used in $newline.
+ *
+ * Be sure to include the trailing newline in $oldline when replacing entire lines.
+ *
+ * Uses gzip if extension is .gz
+ * and bz2 if extension is .bz2
+ *
+ * @author Steven Danz <steven-danz@kc.rr.com>
+ * @author Christopher Smith <chris@jalakai.co.uk>
+ * @author Patrick Brown <ptbrown@whoopdedo.org>
+ *
+ * @param string $file     filename
+ * @param string $oldline  exact linematch to remove
+ * @param string $newline  new line to insert
+ * @param bool   $regex    use regexp?
+ * @param int    $maxlines number of occurrences of the line to replace
+ * @return bool true on success
+ */
+function io_replaceInFile($file, $oldline, $newline, $regex=false, $maxlines=0) {
+    if ((string)$oldline === '') {
+        trigger_error('$oldline parameter cannot be empty in io_replaceInFile()', E_USER_WARNING);
+        return false;
+    }
+
+    if (!file_exists($file)) return true;
+
+    io_lock($file);
+
+    // load into array
+    if(substr($file,-3) == '.gz'){
+        if(!DOKU_HAS_GZIP) return false;
+        $lines = gzfile($file);
+    }else if(substr($file,-4) == '.bz2'){
+        if(!DOKU_HAS_BZIP) return false;
+        $lines = bzfile($file, true);
+    }else{
+        $lines = file($file);
+    }
+
+    // make non-regexes into regexes
+    $pattern = $regex ? $oldline : '/^'.preg_quote($oldline,'/').'$/';
+    $replace = $regex ? $newline : addcslashes($newline, '\$');
+
+    // remove matching lines
+    if ($maxlines > 0) {
+        $count = 0;
+        $matched = 0;
+        foreach($lines as $i => $line) {
+            if($count >= $maxlines) break;
+            // $matched will be set to 0|1 depending on whether pattern is matched and line replaced
+            $lines[$i] = preg_replace($pattern, $replace, $line, -1, $matched);
+            if ($matched) $count++;
+        }
+    } else if ($maxlines == 0) {
+        $lines = preg_grep($pattern, $lines, PREG_GREP_INVERT);
+
+        if ((string)$newline !== ''){
+            $lines[] = $newline;
+        }
+    } else {
+        $lines = preg_replace($pattern, $replace, $lines);
+    }
+
+    if(count($lines)){
+        if(!_io_saveFile($file, join('',$lines), false)) {
+            msg("Removing content from $file failed",-1);
+            io_unlock($file);
+            return false;
+        }
+    }else{
+        @unlink($file);
+    }
+
+    io_unlock($file);
+    return true;
+}
+
+/**
+ * Delete lines that match $badline from $file.
+ *
+ * Be sure to include the trailing newline in $badline
+ *
+ * @author Patrick Brown <ptbrown@whoopdedo.org>
+ *
+ * @param string $file    filename
+ * @param string $badline exact linematch to remove
+ * @param bool   $regex   use regexp?
+ * @return bool true on success
+ */
+function io_deleteFromFile($file,$badline,$regex=false){
+    return io_replaceInFile($file,$badline,null,$regex,0);
+}
+
+/**
+ * Tries to lock a file
+ *
+ * Locking is only done for io_savefile and uses directories
+ * inside $conf['lockdir']
+ *
+ * It waits maximal 3 seconds for the lock, after this time
+ * the lock is assumed to be stale and the function goes on
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param string $file filename
+ */
+function io_lock($file){
+    global $conf;
+    // no locking if safemode hack
+    if($conf['safemodehack']) return;
+
+    $lockDir = $conf['lockdir'].'/'.md5($file);
+    @ignore_user_abort(1);
+
+    $timeStart = time();
+    do {
+        //waited longer than 3 seconds? -> stale lock
+        if ((time() - $timeStart) > 3) break;
+        $locked = @mkdir($lockDir, $conf['dmode']);
+        if($locked){
+            if(!empty($conf['dperm'])) chmod($lockDir, $conf['dperm']);
+            break;
+        }
+        usleep(50);
+    } while ($locked === false);
+}
+
+/**
+ * Unlocks a file
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param string $file filename
+ */
+function io_unlock($file){
+    global $conf;
+    // no locking if safemode hack
+    if($conf['safemodehack']) return;
+
+    $lockDir = $conf['lockdir'].'/'.md5($file);
+    @rmdir($lockDir);
+    @ignore_user_abort(0);
+}
+
+/**
+ * Create missing namespace directories and send the IO_NAMESPACE_CREATED events
+ * in the order of directory creation. (Parent directories first.)
+ *
+ * Event data:
+ * $data[0]    ns: The colon separated namespace path minus the trailing page name.
+ * $data[1]    ns_type: 'pages' or 'media' namespace tree.
+ *
+ * @author Ben Coburn <btcoburn@silicodon.net>
+ *
+ * @param string $id page id
+ * @param string $ns_type 'pages' or 'media'
+ */
+function io_createNamespace($id, $ns_type='pages') {
+    // verify ns_type
+    $types = array('pages'=>'wikiFN', 'media'=>'mediaFN');
+    if (!isset($types[$ns_type])) {
+        trigger_error('Bad $ns_type parameter for io_createNamespace().');
+        return;
+    }
+    // make event list
+    $missing = array();
+    $ns_stack = explode(':', $id);
+    $ns = $id;
+    $tmp = dirname( $file = call_user_func($types[$ns_type], $ns) );
+    while (!@is_dir($tmp) && !(file_exists($tmp) && !is_dir($tmp))) {
+        array_pop($ns_stack);
+        $ns = implode(':', $ns_stack);
+        if (strlen($ns)==0) { break; }
+        $missing[] = $ns;
+        $tmp = dirname(call_user_func($types[$ns_type], $ns));
+    }
+    // make directories
+    io_makeFileDir($file);
+    // send the events
+    $missing = array_reverse($missing); // inside out
+    foreach ($missing as $ns) {
+        $data = array($ns, $ns_type);
+        trigger_event('IO_NAMESPACE_CREATED', $data);
+    }
+}
+
+/**
+ * Create the directory needed for the given file
+ *
+ * @author  Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param string $file file name
+ */
+function io_makeFileDir($file){
+    $dir = dirname($file);
+    if(!@is_dir($dir)){
+        io_mkdir_p($dir) || msg("Creating directory $dir failed",-1);
+    }
+}
+
+/**
+ * Creates a directory hierachy.
+ *
+ * @link    http://php.net/manual/en/function.mkdir.php
+ * @author  <saint@corenova.com>
+ * @author  Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param string $target filename
+ * @return bool|int|string
+ */
+function io_mkdir_p($target){
+    global $conf;
+    if (@is_dir($target)||empty($target)) return 1; // best case check first
+    if (file_exists($target) && !is_dir($target)) return 0;
+    //recursion
+    if (io_mkdir_p(substr($target,0,strrpos($target,'/')))){
+        if($conf['safemodehack']){
+            $dir = preg_replace('/^'.preg_quote(fullpath($conf['ftp']['root']),'/').'/','', $target);
+            return io_mkdir_ftp($dir);
+        }else{
+            $ret = @mkdir($target,$conf['dmode']); // crawl back up & create dir tree
+            if($ret && !empty($conf['dperm'])) chmod($target, $conf['dperm']);
+            return $ret;
+        }
+    }
+    return 0;
+}
+
+/**
+ * Recursively delete a directory
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @param string $path
+ * @param bool   $removefiles defaults to false which will delete empty directories only
+ * @return bool
+ */
+function io_rmdir($path, $removefiles = false) {
+    if(!is_string($path) || $path == "") return false;
+    if(!file_exists($path)) return true; // it's already gone or was never there, count as success
+
+    if(is_dir($path) && !is_link($path)) {
+        $dirs  = array();
+        $files = array();
+
+        if(!$dh = @opendir($path)) return false;
+        while(false !== ($f = readdir($dh))) {
+            if($f == '..' || $f == '.') continue;
+
+            // collect dirs and files first
+            if(is_dir("$path/$f") && !is_link("$path/$f")) {
+                $dirs[] = "$path/$f";
+            } else if($removefiles) {
+                $files[] = "$path/$f";
+            } else {
+                return false; // abort when non empty
+            }
+
+        }
+        closedir($dh);
+
+        // now traverse into  directories first
+        foreach($dirs as $dir) {
+            if(!io_rmdir($dir, $removefiles)) return false; // abort on any error
+        }
+
+        // now delete files
+        foreach($files as $file) {
+            if(!@unlink($file)) return false; //abort on any error
+        }
+
+        // remove self
+        return @rmdir($path);
+    } else if($removefiles) {
+        return @unlink($path);
+    }
+    return false;
+}
+
+/**
+ * Creates a directory using FTP
+ *
+ * This is used when the safemode workaround is enabled
+ *
+ * @author <andi@splitbrain.org>
+ *
+ * @param string $dir name of the new directory
+ * @return false|string
+ */
+function io_mkdir_ftp($dir){
+    global $conf;
+
+    if(!function_exists('ftp_connect')){
+        msg("FTP support not found - safemode workaround not usable",-1);
+        return false;
+    }
+
+    $conn = @ftp_connect($conf['ftp']['host'],$conf['ftp']['port'],10);
+    if(!$conn){
+        msg("FTP connection failed",-1);
+        return false;
+    }
+
+    if(!@ftp_login($conn, $conf['ftp']['user'], conf_decodeString($conf['ftp']['pass']))){
+        msg("FTP login failed",-1);
+        return false;
+    }
+
+    //create directory
+    $ok = @ftp_mkdir($conn, $dir);
+    //set permissions
+    @ftp_site($conn,sprintf("CHMOD %04o %s",$conf['dmode'],$dir));
+
+    @ftp_close($conn);
+    return $ok;
+}
+
+/**
+ * Creates a unique temporary directory and returns
+ * its path.
+ *
+ * @author Michael Klier <chi@chimeric.de>
+ *
+ * @return false|string path to new directory or false
+ */
+function io_mktmpdir() {
+    global $conf;
+
+    $base = $conf['tmpdir'];
+    $dir  = md5(uniqid(mt_rand(), true));
+    $tmpdir = $base.'/'.$dir;
+
+    if(io_mkdir_p($tmpdir)) {
+        return($tmpdir);
+    } else {
+        return false;
+    }
+}
+
+/**
+ * downloads a file from the net and saves it
+ *
+ * if $useAttachment is false,
+ * - $file is the full filename to save the file, incl. path
+ * - if successful will return true, false otherwise
+ *
+ * if $useAttachment is true,
+ * - $file is the directory where the file should be saved
+ * - if successful will return the name used for the saved file, false otherwise
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @author Chris Smith <chris@jalakai.co.uk>
+ *
+ * @param string $url           url to download
+ * @param string $file          path to file or directory where to save
+ * @param bool   $useAttachment if true: try to use name of download, uses otherwise $defaultName, false: uses $file as path to file
+ * @param string $defaultName   fallback for if using $useAttachment
+ * @param int    $maxSize       maximum file size
+ * @return bool|string          if failed false, otherwise true or the name of the file in the given dir
+ */
+function io_download($url,$file,$useAttachment=false,$defaultName='',$maxSize=2097152){
+    global $conf;
+    $http = new DokuHTTPClient();
+    $http->max_bodysize = $maxSize;
+    $http->timeout = 25; //max. 25 sec
+    $http->keep_alive = false; // we do single ops here, no need for keep-alive
+
+    $data = $http->get($url);
+    if(!$data) return false;
+
+    $name = '';
+    if ($useAttachment) {
+        if (isset($http->resp_headers['content-disposition'])) {
+            $content_disposition = $http->resp_headers['content-disposition'];
+            $match=array();
+            if (is_string($content_disposition) &&
+                    preg_match('/attachment;\s*filename\s*=\s*"([^"]*)"/i', $content_disposition, $match)) {
+
+                $name = utf8_basename($match[1]);
+            }
+
+        }
+
+        if (!$name) {
+            if (!$defaultName) return false;
+            $name = $defaultName;
+        }
+
+        $file = $file.$name;
+    }
+
+    $fileexists = file_exists($file);
+    $fp = @fopen($file,"w");
+    if(!$fp) return false;
+    fwrite($fp,$data);
+    fclose($fp);
+    if(!$fileexists and $conf['fperm']) chmod($file, $conf['fperm']);
+    if ($useAttachment) return $name;
+    return true;
+}
+
+/**
+ * Windows compatible rename
+ *
+ * rename() can not overwrite existing files on Windows
+ * this function will use copy/unlink instead
+ *
+ * @param string $from
+ * @param string $to
+ * @return bool succes or fail
+ */
+function io_rename($from,$to){
+    global $conf;
+    if(!@rename($from,$to)){
+        if(@copy($from,$to)){
+            if($conf['fperm']) chmod($to, $conf['fperm']);
+            @unlink($from);
+            return true;
+        }
+        return false;
+    }
+    return true;
+}
+
+/**
+ * Runs an external command with input and output pipes.
+ * Returns the exit code from the process.
+ *
+ * @author Tom N Harris <tnharris@whoopdedo.org>
+ *
+ * @param string $cmd
+ * @param string $input  input pipe
+ * @param string $output output pipe
+ * @return int exit code from process
+ */
+function io_exec($cmd, $input, &$output){
+    $descspec = array(
+            0=>array("pipe","r"),
+            1=>array("pipe","w"),
+            2=>array("pipe","w"));
+    $ph = proc_open($cmd, $descspec, $pipes);
+    if(!$ph) return -1;
+    fclose($pipes[2]); // ignore stderr
+    fwrite($pipes[0], $input);
+    fclose($pipes[0]);
+    $output = stream_get_contents($pipes[1]);
+    fclose($pipes[1]);
+    return proc_close($ph);
+}
+
+/**
+ * Search a file for matching lines
+ *
+ * This is probably not faster than file()+preg_grep() but less
+ * memory intensive because not the whole file needs to be loaded
+ * at once.
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @param  string $file    The file to search
+ * @param  string $pattern PCRE pattern
+ * @param  int    $max     How many lines to return (0 for all)
+ * @param  bool   $backref When true returns array with backreferences instead of lines
+ * @return array matching lines or backref, false on error
+ */
+function io_grep($file,$pattern,$max=0,$backref=false){
+    $fh = @fopen($file,'r');
+    if(!$fh) return false;
+    $matches = array();
+
+    $cnt  = 0;
+    $line = '';
+    while (!feof($fh)) {
+        $line .= fgets($fh, 4096);  // read full line
+        if(substr($line,-1) != "\n") continue;
+
+        // check if line matches
+        if(preg_match($pattern,$line,$match)){
+            if($backref){
+                $matches[] = $match;
+            }else{
+                $matches[] = $line;
+            }
+            $cnt++;
+        }
+        if($max && $max == $cnt) break;
+        $line = '';
+    }
+    fclose($fh);
+    return $matches;
+}
+
+
+/**
+ * Get size of contents of a file, for a compressed file the uncompressed size
+ * Warning: reading uncompressed size of content of bz-files requires uncompressing
+ *
+ * @author  Gerrit Uitslag <klapinklapin@gmail.com>
+ *
+ * @param string $file filename path to file
+ * @return int size of file
+ */
+function io_getSizeFile($file) {
+    if (!file_exists($file)) return 0;
+
+    if(substr($file,-3) == '.gz'){
+        $fp = @fopen($file, "rb");
+        if($fp === false) return 0;
+
+        fseek($fp, -4, SEEK_END);
+        $buffer = fread($fp, 4);
+        fclose($fp);
+        $array = unpack("V", $buffer);
+        $uncompressedsize = end($array);
+    }else if(substr($file,-4) == '.bz2'){
+        if(!DOKU_HAS_BZIP) return 0;
+
+        $bz = bzopen($file,"r");
+        if($bz === false) return 0;
+
+        $uncompressedsize = 0;
+        while (!feof($bz)) {
+            //8192 seems to be the maximum buffersize?
+            $buffer = bzread($bz,8192);
+            if(($buffer === false) || (bzerrno($bz) !== 0)) {
+                return 0;
+            }
+            $uncompressedsize += strlen($buffer);
+        }
+    }else{
+        $uncompressedsize = filesize($file);
+    }
+
+    return $uncompressedsize;
+ }
diff --git a/wiki/inc/lang/af/jquery.ui.datepicker.js b/wiki/inc/lang/af/jquery.ui.datepicker.js
new file mode 100644
index 0000000..c756888
--- /dev/null
+++ b/wiki/inc/lang/af/jquery.ui.datepicker.js
@@ -0,0 +1,37 @@
+/* Afrikaans initialisation for the jQuery UI date picker plugin. */
+/* Written by Renier Pretorius. */
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "../widgets/datepicker" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery.datepicker );
+	}
+}( function( datepicker ) {
+
+datepicker.regional.af = {
+	closeText: "Selekteer",
+	prevText: "Vorige",
+	nextText: "Volgende",
+	currentText: "Vandag",
+	monthNames: [ "Januarie","Februarie","Maart","April","Mei","Junie",
+	"Julie","Augustus","September","Oktober","November","Desember" ],
+	monthNamesShort: [ "Jan", "Feb", "Mrt", "Apr", "Mei", "Jun",
+	"Jul", "Aug", "Sep", "Okt", "Nov", "Des" ],
+	dayNames: [ "Sondag", "Maandag", "Dinsdag", "Woensdag", "Donderdag", "Vrydag", "Saterdag" ],
+	dayNamesShort: [ "Son", "Maa", "Din", "Woe", "Don", "Vry", "Sat" ],
+	dayNamesMin: [ "So","Ma","Di","Wo","Do","Vr","Sa" ],
+	weekHeader: "Wk",
+	dateFormat: "dd/mm/yy",
+	firstDay: 1,
+	isRTL: false,
+	showMonthAfterYear: false,
+	yearSuffix: "" };
+datepicker.setDefaults( datepicker.regional.af );
+
+return datepicker.regional.af;
+
+} ) );
diff --git a/wiki/inc/lang/af/lang.php b/wiki/inc/lang/af/lang.php
new file mode 100644
index 0000000..f719647
--- /dev/null
+++ b/wiki/inc/lang/af/lang.php
@@ -0,0 +1,68 @@
+<?php
+/**
+ * af language file
+ *
+ * This file was initially built by fetching translations from other
+ * Wiki projects. See the @url lines below. Additional translations
+ * and fixes where done for DokuWiki by the people mentioned in the
+ * lines starting with @author
+ *
+ * @url http://svn.wikimedia.org/viewvc/mediawiki/trunk/phase3/languages/messages/MessagesAf.php?view=co
+ */
+$lang['encoding']              = 'utf-8';
+$lang['direction']             = 'ltr';
+$lang['btn_edit']              = 'Wysig hierdie bladsy';
+$lang['btn_source']            = 'Bekyk bronteks';
+$lang['btn_search']            = 'Soek';
+$lang['btn_preview']           = 'Voorskou';
+$lang['btn_revs']              = 'geskiedenis';
+$lang['btn_recent']            = 'Onlangse wysigings';
+$lang['btn_cancel']            = 'Kanselleer';
+$lang['btn_secedit']           = 'Wysig';
+$lang['btn_login']             = 'Teken in';
+$lang['btn_logout']            = 'Teken uit';
+$lang['btn_back']              = 'Terug';
+$lang['btn_backlink']          = 'Wat skakel hierheen';
+$lang['btn_subscribe']         = 'Hou bladsy dop';
+$lang['btn_register']          = 'Skep gerus \'n rekening';
+$lang['loggedinas']            = 'Ingeteken as:';
+$lang['user']                  = 'Gebruikernaam';
+$lang['pass']                  = 'Wagwoord';
+$lang['newpass']               = 'Nuive wagwoord';
+$lang['oldpass']               = 'Ou wagwoord';
+$lang['passchk']               = 'Herhaal wagwoord';
+$lang['remember']              = 'Onthou my wagwoord oor sessies';
+$lang['fullname']              = 'Regte naam';
+$lang['email']                 = 'E-pos';
+$lang['badlogin']              = 'Intekenfout';
+$lang['minoredit']             = 'Klein wysiging';
+$lang['reguexists']            = 'Die gebruikersnaam wat jy gebruik het, is alreeds gebruik. Kies asseblief \'n ander gebruikersnaam.';
+$lang['regsuccess2']           = 'Rekening geskep';
+$lang['regbadpass']            = 'Die ingetikte wagwoorde is nie dieselfde nie.';
+$lang['regpwmail']             = 'Jo DokuWiki wagwoord';
+$lang['profnoempty']           = 'Jy moet \'n name en a e-posadres in sit';
+$lang['resendpwdmissing']      = 'Jammer, jy moet ales in fil';
+$lang['resendpwdconfirm']      = '\'n Bevestigingpos is gestuur na die gekose e-posadres.';
+$lang['resendpwdsuccess']      = 'Jou nuive wagwoord was deur e-pos gesteur';
+$lang['uploadsucc']            = 'Laai suksesvol';
+$lang['uploadfail']            = 'Laai fout';
+$lang['js']['hidedetails']     = 'Steek weg';
+$lang['mediaroot']             = 'root';
+$lang['toc']                   = 'Inhoud';
+$lang['current']               = 'huidige';
+$lang['line']                  = 'Streak';
+$lang['youarehere']            = 'Jy is hier:';
+$lang['by']                    = 'by';
+$lang['restored']              = 'Het terug gegaan na vroeëre weergawe (%s)';
+$lang['summary']               = 'Voorskou';
+$lang['qb_bold']               = 'Vetdruk';
+$lang['qb_italic']             = 'Skuinsdruk';
+$lang['qb_link']               = 'Interne skakel';
+$lang['qb_extlink']            = 'Eksterne skakel';
+$lang['qb_hr']                 = 'Horisontale streep';
+$lang['qb_sig']                = 'Handtekening met datum';
+$lang['btn_img_backto']        = 'Terug na %s';
+$lang['img_date']              = 'Datem:';
+$lang['img_camera']            = 'Camera:';
+$lang['i_wikiname']            = 'Wiki Naam';
+$lang['i_funcna']              = 'PHP funksie <code>%s</code> is nie beskibaar nie. Miskien is dit af gehaal.';
diff --git a/wiki/inc/lang/ar/admin.txt b/wiki/inc/lang/ar/admin.txt
new file mode 100644
index 0000000..bbb4438
--- /dev/null
+++ b/wiki/inc/lang/ar/admin.txt
@@ -0,0 +1,3 @@
+====== الأدارة ======
+
+قائمة بالمهام الإدارية المتاحة فى دوكو ويكي.
\ No newline at end of file
diff --git a/wiki/inc/lang/ar/adminplugins.txt b/wiki/inc/lang/ar/adminplugins.txt
new file mode 100644
index 0000000..44790a0
--- /dev/null
+++ b/wiki/inc/lang/ar/adminplugins.txt
@@ -0,0 +1 @@
+===== إضافات إضافية =====
\ No newline at end of file
diff --git a/wiki/inc/lang/ar/backlinks.txt b/wiki/inc/lang/ar/backlinks.txt
new file mode 100644
index 0000000..f6d24f4
--- /dev/null
+++ b/wiki/inc/lang/ar/backlinks.txt
@@ -0,0 +1,3 @@
+====== إرتباطات ======
+
+هذه قائمة بالصفحات المرتبطة بالصفحة الحالية.
\ No newline at end of file
diff --git a/wiki/inc/lang/ar/conflict.txt b/wiki/inc/lang/ar/conflict.txt
new file mode 100644
index 0000000..4d7c4e8
--- /dev/null
+++ b/wiki/inc/lang/ar/conflict.txt
@@ -0,0 +1,5 @@
+====== يوجد نسخة أحدث ======
+
+يوجد نسخة أحدث من هذه الصفحة. يحدث هذا عندما يحرر مشترك آخر الصفحة أثناء تعديلك لها.
+
+افحص الاختلافات جيداً، ثم حدد أية نسخة تحفظ. بالضغط على "حفظ" ستحفظ نسختك. أما بالضغط على "إلغاء" فستحافظ على النسخة الحالية.
\ No newline at end of file
diff --git a/wiki/inc/lang/ar/denied.txt b/wiki/inc/lang/ar/denied.txt
new file mode 100644
index 0000000..b369f7f
--- /dev/null
+++ b/wiki/inc/lang/ar/denied.txt
@@ -0,0 +1,3 @@
+====== لا صلاحيات ======
+
+عذرا، ليس مصرح لك الاستمرار
\ No newline at end of file
diff --git a/wiki/inc/lang/ar/diff.txt b/wiki/inc/lang/ar/diff.txt
new file mode 100644
index 0000000..ed1937c
--- /dev/null
+++ b/wiki/inc/lang/ar/diff.txt
@@ -0,0 +1,3 @@
+====== اختلافات ======
+
+عرض الاختلافات بين النسخة المختارة و النسخة الحالية من الصفحة.
\ No newline at end of file
diff --git a/wiki/inc/lang/ar/draft.txt b/wiki/inc/lang/ar/draft.txt
new file mode 100644
index 0000000..50c07f2
--- /dev/null
+++ b/wiki/inc/lang/ar/draft.txt
@@ -0,0 +1,5 @@
+====== وجدت مسوّدة ======
+
+إن تعديلك لهذه الصفحة في المرة الماضية لم يتم بشكل صحيح، حفظت دوكو ويكي آلياً مسوّدة من عملك الأخير الذي يمكنك استخدامه الآن لمتابعة التعديل. فيما يلي البيانات التي حفظت من المرة الماضية.
+
+يرجى أن تقرر إن كنت تريد //استعادة// عملك السابق أو //حذف// المسوّدة أو //إلغاء// عملية التحرير.
diff --git a/wiki/inc/lang/ar/edit.txt b/wiki/inc/lang/ar/edit.txt
new file mode 100644
index 0000000..d4e1eb4
--- /dev/null
+++ b/wiki/inc/lang/ar/edit.txt
@@ -0,0 +1 @@
+حرر هذه الصفحة ثم اضغط على "حفظ". انظر [[wiki:syntax|دليل الصياغة]] لمعرفة صيغة الويكي. يرجى تعديل الصفحة فقط إذا كنت ستحسنها. إذا رغبت فى اختبار شيء ما، تعلم الخطوات الأولى فى [[playground:playground|الملعب]].
\ No newline at end of file
diff --git a/wiki/inc/lang/ar/editrev.txt b/wiki/inc/lang/ar/editrev.txt
new file mode 100644
index 0000000..a51fe94
--- /dev/null
+++ b/wiki/inc/lang/ar/editrev.txt
@@ -0,0 +1,2 @@
+**لقد حملت نسخة قديمة من الصفحة!** إذا حفظتها، سيتم إنشاء نسخة جديدة بهذه المعلومات.
+----
\ No newline at end of file
diff --git a/wiki/inc/lang/ar/index.txt b/wiki/inc/lang/ar/index.txt
new file mode 100644
index 0000000..43840ec
--- /dev/null
+++ b/wiki/inc/lang/ar/index.txt
@@ -0,0 +1,3 @@
+====== فهرس ======
+
+هذا فهرس لجميع الصفحات مرتبة حسب [[doku>namespaces|namespaces]].
diff --git a/wiki/inc/lang/ar/install.html b/wiki/inc/lang/ar/install.html
new file mode 100644
index 0000000..3ef23ae
--- /dev/null
+++ b/wiki/inc/lang/ar/install.html
@@ -0,0 +1,12 @@
+<p>تساعد هذه الصفحة في التثبيت والإعداد الأوليين ل <a href="http://dokuwiki.org">دوكو ويكي</a>. مزيد من المعلومات عن هذا المثبت في
+<a href="http://dokuwiki.org/installer">صفحة التوثيق</a> الخاصة به.</p>
+
+<p>دوكو ويكي تستخدم ملفات عادية لتخزين الصفحات و المعلومات المرتبطة بها (مثل. الصور , وفهارس البحث, والنسخ القديمة, إلخ). لكي تعمل بنجاح دوكو ويكي <strong>يجب</strong> ان يكون لديها اذن بالكتابة على المجلدات التي تحوي هذه الملفات. هذا المثبت غير قادر على اعداد اذونات المجلدات. عادة يجب عمل هذا مباشرة باستخدام أمر في محث الاوامر أو إن كنت تستخدم استضافة، عن طريقة FTP في لوحة تحكم الاستضافة (مثل. cPanel).</p>
+
+<p>سيُعد هذا المثبت اعدادات دوكو ويكي ل
+<abbr title="قائمة التحكم بالوصول">ACL</abbr>, الذي سيسمح للمدير بالولوج و الوصول لقائمة إدارة دوكو ويكي لتثبيت الإضافات، وإدارة المستخدمين، و التحكم بالوصول لصفحات الويكي، وتعديل الاعدادات.
+ليس مطلوبا لأجل عمل دوكو ويكي, لكنه سيجعل دوكو ويكي أسهل على المدير.</p>
+
+<p>المستخدمين الخبراء و المستخدمين مع متطلبات خاصة عليهم استخدام هذا الرابط لتفاصيل تتعلق ب
+<a href="http://dokuwiki.org/install">توجيهات التثبيت</a>
+و <a href="http://dokuwiki.org/config">ضبط الإعدادات</a>.</p>
\ No newline at end of file
diff --git a/wiki/inc/lang/ar/jquery.ui.datepicker.js b/wiki/inc/lang/ar/jquery.ui.datepicker.js
new file mode 100644
index 0000000..95784e8
--- /dev/null
+++ b/wiki/inc/lang/ar/jquery.ui.datepicker.js
@@ -0,0 +1,39 @@
+/* Arabic Translation for jQuery UI date picker plugin. */
+/* Used in most of Arab countries, primarily in Bahrain, */
+/* Kuwait, Oman, Qatar, Saudi Arabia and the United Arab Emirates, Egypt, Sudan and Yemen. */
+/* Written by Mohammed Alshehri -- m@dralshehri.com */
+
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "../widgets/datepicker" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery.datepicker );
+	}
+}( function( datepicker ) {
+
+datepicker.regional.ar = {
+	closeText: "إغلاق",
+	prevText: "&#x3C;السابق",
+	nextText: "التالي&#x3E;",
+	currentText: "اليوم",
+	monthNames: [ "يناير", "فبراير", "مارس", "أبريل", "مايو", "يونيو",
+	"يوليو", "أغسطس", "سبتمبر", "أكتوبر", "نوفمبر", "ديسمبر" ],
+	monthNamesShort: [ "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12" ],
+	dayNames: [ "الأحد", "الاثنين", "الثلاثاء", "الأربعاء", "الخميس", "الجمعة", "السبت" ],
+	dayNamesShort: [ "أحد", "اثنين", "ثلاثاء", "أربعاء", "خميس", "جمعة", "سبت" ],
+	dayNamesMin: [ "ح", "ن", "ث", "ر", "خ", "ج", "س" ],
+	weekHeader: "أسبوع",
+	dateFormat: "dd/mm/yy",
+	firstDay: 0,
+		isRTL: true,
+	showMonthAfterYear: false,
+	yearSuffix: "" };
+datepicker.setDefaults( datepicker.regional.ar );
+
+return datepicker.regional.ar;
+
+} ) );
diff --git a/wiki/inc/lang/ar/lang.php b/wiki/inc/lang/ar/lang.php
new file mode 100644
index 0000000..82ef532
--- /dev/null
+++ b/wiki/inc/lang/ar/lang.php
@@ -0,0 +1,348 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Mostafa Hussein <mostafa@gmail.com>
+ * @author Yaman Hokan <always.smile.yh@hotmail.com>
+ * @author Usama Akkad <uahello@gmail.com>
+ * @author uahello@gmail.com
+ * @author Ahmad Abd-Elghany <tolpa1@gmail.com>
+ * @author alhajr <alhajr300@gmail.com>
+ * @author Mohamed Belhsine <b.mohamed897@gmail.com>
+ */
+$lang['encoding']              = 'utf-8';
+$lang['direction']             = 'rtl';
+$lang['doublequoteopening']    = '“';
+$lang['doublequoteclosing']    = '”';
+$lang['singlequoteopening']    = '‘';
+$lang['singlequoteclosing']    = '’';
+$lang['apostrophe']            = '؛';
+$lang['btn_edit']              = 'حرر هذه الصفحة';
+$lang['btn_source']            = 'اعرض مصدر الصفحة';
+$lang['btn_show']              = 'اعرض الصفحة';
+$lang['btn_create']            = 'أنشئ هذه الصفحة';
+$lang['btn_search']            = 'ابحث';
+$lang['btn_save']              = 'احفظ';
+$lang['btn_preview']           = 'عاين';
+$lang['btn_top']               = 'ارجع للأعلى';
+$lang['btn_newer']             = '<< أحدث';
+$lang['btn_older']             = 'أقدم >>';
+$lang['btn_revs']              = 'نسخ قديمة';
+$lang['btn_recent']            = 'أحدث التغييرات';
+$lang['btn_upload']            = 'ارفع';
+$lang['btn_cancel']            = 'ألغ';
+$lang['btn_index']             = 'خريطة موقع';
+$lang['btn_secedit']           = 'حرر';
+$lang['btn_login']             = 'تسجيل الدخول';
+$lang['btn_logout']            = 'خروج';
+$lang['btn_admin']             = 'المدير';
+$lang['btn_update']            = 'حدّث';
+$lang['btn_delete']            = 'احذف';
+$lang['btn_back']              = 'ارجع';
+$lang['btn_backlink']          = 'ارتباطات';
+$lang['btn_subscribe']         = 'ادر الاشتراكات';
+$lang['btn_profile']           = 'حدث الملف الشخصي';
+$lang['btn_reset']             = 'صفّر';
+$lang['btn_resendpwd']         = 'اضبط كلمة سر جديدة';
+$lang['btn_draft']             = 'حرر المسودة';
+$lang['btn_recover']           = 'استرجع المسودة';
+$lang['btn_draftdel']          = 'احذف المسوّدة';
+$lang['btn_revert']            = 'استعد';
+$lang['btn_register']          = 'سجّل';
+$lang['btn_apply']             = 'طبق';
+$lang['btn_media']             = 'مدير الوسائط';
+$lang['btn_deleteuser']        = 'احذف حسابي الخاص';
+$lang['btn_img_backto']        = 'عودة إلى %s';
+$lang['btn_mediaManager']      = 'اعرض في مدير الوسائط';
+$lang['loggedinas']            = 'داخل باسم:';
+$lang['user']                  = 'اسم المستخدم';
+$lang['pass']                  = 'كلمة السر';
+$lang['newpass']               = 'كلمة سر جديدة';
+$lang['oldpass']               = 'أكد كلمة السر الحالية';
+$lang['passchk']               = 'مرة أخرى';
+$lang['remember']              = 'تذكرني';
+$lang['fullname']              = 'الاسم الحقيقي';
+$lang['email']                 = 'البريد الإلكتروني';
+$lang['profile']               = 'الملف الشخصي';
+$lang['badlogin']              = 'عذرا، اسم المشترك أو كلمة السر غير صحيحة';
+$lang['badpassconfirm']        = 'عذراً,كلمة السر غير صحيحة';
+$lang['minoredit']             = 'تعديلات طفيفة';
+$lang['draftdate']             = 'حفظ المسودات آليا مفعّل';
+$lang['nosecedit']             = 'غُيرت الصفحة في هذه الأثناء، معلومات الجزء اصبحت قديمة. حُمُلت كل الصفحة بدلا.';
+$lang['regmissing']            = 'عذرا، عليك ملء جميع الحقول.';
+$lang['reguexists']            = 'عذرا، يوجد مشترك بنفس الاسم.';
+$lang['regsuccess']            = 'أنشئ المستخدم و ارسلت كلمة السر بالبريد.';
+$lang['regsuccess2']           = 'أنشئ المستخدم.';
+$lang['regmailfail']           = 'حدث خطأ فى إرسال رسالة كلمة السر. يرجى مراسلة المدير!';
+$lang['regbadmail']            = 'يبدو البريد الإلكتروني المعطى غيرَ صحيح، إن كنت تظن أن هذا خطأ، راسل المدير';
+$lang['regbadpass']            = 'كلمتا المرور غير متطابقتين، حاول مرة أخرى.';
+$lang['regpwmail']             = 'كلمة مرورك إلى دوكو ويكي';
+$lang['reghere']               = 'ليس لديك حساب بعد؟ احصل على واحد';
+$lang['profna']                = 'هذه الويكي لا تدعم تعديل الملف الشخصي';
+$lang['profnochange']          = 'لا تغييرات، لا شيء ليُعمل.';
+$lang['profnoempty']           = 'غير مسموح باسم مستخدم أو بريد فارغ.';
+$lang['profchanged']           = 'حُدث الملف الشخصي للمستخدم بنجاح.';
+$lang['profnodelete']          = 'هذه الموسوعه لا ندعم حذف الأشخاص';
+$lang['profdeleteuser']        = 'احذف حساب';
+$lang['profdeleted']           = 'حسابك الخاص تم حذفه من هذه الموسوعة';
+$lang['profconfdelete']        = 'أنا أرغب في حذف حسابي من هذه الموسوعة.<br/>
+هذا الحدث غير ممكن.';
+$lang['profconfdeletemissing'] = 'لم تقم بوضع علامة في مربع التأكيد';
+$lang['pwdforget']             = 'أنسيت كلمة السر؟ احصل على واحدة جديدة';
+$lang['resendna']              = 'هذه الويكي لا تدعم إعادة إرسال كلمة المرور.';
+$lang['resendpwd']             = 'اضبط كلمة سر جديدة لـ';
+$lang['resendpwdmissing']      = 'عذراّ، يجب أن تملأ كل الحقول.';
+$lang['resendpwdnouser']       = 'عذراً، لم نجد المستخدم هذا في قاعدة بياناتنا.';
+$lang['resendpwdbadauth']      = 'عذراً، رمز التفعيل هذا غير صحيح. نأكد من استخدامك كامل وصلة التأكيد.';
+$lang['resendpwdconfirm']      = 'اُرسل رابط التأكيد بواسطة البريد.';
+$lang['resendpwdsuccess']      = 'كلمة السرالجديدة اُرسلت عبر البريد.';
+$lang['license']               = 'مالم يشر لخلاف ذلك، فإن المحتوى في هذه الويكي مرخص وفق الرخصة التالية:';
+$lang['licenseok']             = 'لاحظ: بتحرير هذه الصفحة أنت توافق على ترخيص محتواها تحت الرخصة التالية:';
+$lang['searchmedia']           = 'ابحث في أسماء الملفات:';
+$lang['searchmedia_in']        = 'ابحث في %s';
+$lang['txt_upload']            = 'اختر ملفاً للرفع:';
+$lang['txt_filename']          = 'رفع كـ (اختياري):';
+$lang['txt_overwrt']           = 'اكتب على ملف موجود';
+$lang['maxuploadsize']         = 'الحجم الاقصى %s للملف';
+$lang['lockedby']              = 'مقفلة حاليا لـ:';
+$lang['lockexpire']            = 'ينتهي القفل في:';
+$lang['js']['willexpire']      = 'سينتهي قفل تحرير هذه الصفحه خلال دقيقة.\nلتجنب التعارض استخدم زر المعاينة لتصفير مؤقت القفل.';
+$lang['js']['notsavedyet']     = 'التعديلات غير المحفوظة ستفقد.';
+$lang['js']['searchmedia']     = 'ابحث عن ملفات';
+$lang['js']['keepopen']        = 'أبقي النافذة مفتوحة أثناء الاختيار';
+$lang['js']['hidedetails']     = 'أخف التفاصيل';
+$lang['js']['mediatitle']      = 'إعدادات الرابط';
+$lang['js']['mediadisplay']    = 'نوع الرابط';
+$lang['js']['mediaalign']      = 'المحاذاة';
+$lang['js']['mediasize']       = 'حجم الصورة';
+$lang['js']['mediatarget']     = 'هدف الرابط';
+$lang['js']['mediaclose']      = 'أغلق';
+$lang['js']['mediainsert']     = 'أدرج';
+$lang['js']['mediadisplayimg'] = 'أظهر الصورة.';
+$lang['js']['mediadisplaylnk'] = 'اظهر الرابط فقط.';
+$lang['js']['mediasmall']      = 'نسخة مصغرة';
+$lang['js']['mediamedium']     = 'نسخة متوسطة';
+$lang['js']['medialarge']      = 'نسخة كبيرة';
+$lang['js']['mediaoriginal']   = 'النسخة الأصلية';
+$lang['js']['medialnk']        = 'الرابط لصفحة التفاصيل';
+$lang['js']['mediadirect']     = 'رابط مباشر للأصل';
+$lang['js']['medianolnk']      = 'لا رابط';
+$lang['js']['medianolink']     = 'لا تربط الصورة';
+$lang['js']['medialeft']       = 'حاذي الصورة إلى اليسار.';
+$lang['js']['mediaright']      = 'حاذي الصورة إلى اليمين.';
+$lang['js']['mediacenter']     = 'حاذي الصورة إلى الوسط.';
+$lang['js']['medianoalign']    = 'لا تستعمل المحاذاة.';
+$lang['js']['nosmblinks']      = 'الروابط لمجلدات مشاركة وندز تعمل فقط مع متصفح مايكروسفت Internet Explorer.
+ما زال بإمكانك قص و لصق الرابط.';
+$lang['js']['linkwiz']         = 'مرشد الروابط';
+$lang['js']['linkto']          = 'الرابط إلى :';
+$lang['js']['del_confirm']     = 'هل حقاً تريد حذف البنود المختارة؟';
+$lang['js']['restore_confirm'] = 'أمتأكد من استرجاع هذه النسخة؟';
+$lang['js']['media_diff']      = 'عرض الفروق:';
+$lang['js']['media_diff_both'] = 'جنبا إلى جنب';
+$lang['js']['media_select']    = 'اختر ملفا...';
+$lang['js']['media_upload_btn'] = 'ارفع';
+$lang['js']['media_done_btn']  = 'تم';
+$lang['js']['media_drop']      = 'اسقط الملف هنا لرفعه';
+$lang['js']['media_cancel']    = 'أزل';
+$lang['js']['media_overwrt']   = 'أكتب فوق الملفات الموجودة';
+$lang['rssfailed']             = 'خطأ ما حدث أثناء جلب ملف التغذية:';
+$lang['nothingfound']          = 'لا يوجد شيء';
+$lang['mediaselect']           = 'ملفات الوسائط';
+$lang['uploadsucc']            = 'تم الرفع بنجاح';
+$lang['uploadfail']            = 'فشل الرفع، ربما خطأ تراخيص؟';
+$lang['uploadwrong']           = 'الرفع ممنوع، نوع الملف مرفوض!';
+$lang['uploadexist']           = 'الملف موجود أصلاً. لم يُعمل شيئ.';
+$lang['uploadbadcontent']      = 'المحتوى المرفوع لم يطابق لاحقة ملفات %s.';
+$lang['uploadspam']            = 'الرفع محجوب بواسطة القائمة السوداء لبرنامج تقفي التطفل.';
+$lang['uploadxss']             = 'رُفض الرفع للإشتباه بمحتوى ضار.';
+$lang['uploadsize']            = 'الملف المرفوع كان كبيرا جدا . ( الحد %s )';
+$lang['deletesucc']            = 'حُذف الملف "%s".';
+$lang['deletefail']            = 'تعذر حذف "%s" - تأكد من الصلاحيات.';
+$lang['mediainuse']            = 'لم يحذف الملف "%s" - مازال مستخدما.';
+$lang['namespaces']            = 'فضاء التسمية';
+$lang['mediafiles']            = 'ملفات موجودة في';
+$lang['accessdenied']          = 'لا يسمح لك برؤية هذه الصفحة.';
+$lang['mediausage']            = 'استخدم هذه الصياغة للدلالة على هذا الملف:';
+$lang['mediaview']             = 'اعرض الملف الأصلي';
+$lang['mediaroot']             = 'الجذر';
+$lang['mediaupload']           = 'تحميل ملف إلى فضاء التسمية هنا. لإنشاء فضاءات تسمية فرعية، أضفها إلى بداية خانة تحميل باسم وافصل بينها باستخدام الفاصلتان الرأسيتان.';
+$lang['mediaextchange']        = 'غُيرت لاحقة الملف من .%s إلى .%s!';
+$lang['reference']             = 'مراجع لـ';
+$lang['ref_inuse']             = 'لا يمكن حذف الملف، لأنه مستخدم من قبل الصفحات التالية:';
+$lang['ref_hidden']            = 'بعض المراجع على صفحات لا تملك صلاحيات قراءتها';
+$lang['hits']                  = 'مرة';
+$lang['quickhits']             = 'صفحات مطابقة';
+$lang['toc']                   = 'جدول المحتويات';
+$lang['current']               = 'حالي';
+$lang['yours']                 = 'نسختك';
+$lang['diff']                  = 'أظهر الاختلافات مع النسخة الحالية';
+$lang['diff2']                 = 'أظهر الاختلافات بين النسخ المحددة';
+$lang['difflink']              = 'رابط إلى هذه المقارنة';
+$lang['diff_type']             = 'أظهر الفروق:';
+$lang['diff_inline']           = 'ضمنا';
+$lang['diff_side']             = 'جنبا إلى جنب';
+$lang['diffprevrev']           = 'المراجعة السابقة';
+$lang['diffnextrev']           = 'المراجعة التالية';
+$lang['difflastrev']           = 'المراجعة الأخيرة';
+$lang['diffbothprevrev']       = 'جانبي المراجعة السابقة';
+$lang['diffbothnextrev']       = 'جانبي المراجعة التالية';
+$lang['line']                  = 'سطر';
+$lang['breadcrumb']            = 'أثر:';
+$lang['youarehere']            = 'أنت هنا:';
+$lang['lastmod']               = 'آخر تعديل:';
+$lang['by']                    = 'بواسطة';
+$lang['deleted']               = 'حذفت';
+$lang['created']               = 'اُنشئت';
+$lang['restored']              = 'استعيدت نسخة قديمة (%s)';
+$lang['external_edit']         = 'تحرير خارجي';
+$lang['summary']               = 'ملخص التحرير';
+$lang['noflash']               = 'تحتاج إلى<a href="http://www.adobe.com/products/flashplayer/">ملحق فلاش أدوبي</a> لعرض هذا المحتوى.';
+$lang['download']              = 'نزل Snippet';
+$lang['tools']                 = 'أدوات';
+$lang['user_tools']            = 'أدوات المستخدم';
+$lang['site_tools']            = 'أدوات الموقع';
+$lang['page_tools']            = 'أدوات الصفحة';
+$lang['skip_to_content']       = 'تجاوز إلى المحتوى';
+$lang['sidebar']               = 'العمود الجانبي';
+$lang['mail_newpage']          = 'إضافة صفحة:';
+$lang['mail_changed']          = 'تعديل صفحة:';
+$lang['mail_subscribe_list']   = 'صفحات غيرت في النطاق:';
+$lang['mail_new_user']         = 'مشترك جديد:';
+$lang['mail_upload']           = 'رفع ملف:';
+$lang['changes_type']          = 'أظهر تغييرات الـ';
+$lang['pages_changes']         = 'صفحات';
+$lang['media_changes']         = 'ملفات الوسائط';
+$lang['both_changes']          = 'كلا من الصفحات وملفات الوسائط';
+$lang['qb_bold']               = 'نص عريض';
+$lang['qb_italic']             = 'نص مائل';
+$lang['qb_underl']             = 'نص مسطر';
+$lang['qb_code']               = 'نص برمجي';
+$lang['qb_strike']             = 'نص مشطوب';
+$lang['qb_h1']                 = 'عنوان مستوى ١';
+$lang['qb_h2']                 = 'عنوان مستوى ٢';
+$lang['qb_h3']                 = 'عنوان مستوى ٣';
+$lang['qb_h4']                 = 'عنوان مستوى ٤';
+$lang['qb_h5']                 = 'عنوان مستوى ٥';
+$lang['qb_h']                  = 'الترويسة';
+$lang['qb_hs']                 = 'حدد الترويسة';
+$lang['qb_hplus']              = 'ترويسة أعلى';
+$lang['qb_hminus']             = 'ترويسة أخفض';
+$lang['qb_hequal']             = 'ترويسة بنفس المستوى';
+$lang['qb_link']               = 'رابط داخلي';
+$lang['qb_extlink']            = 'رابط خارجي';
+$lang['qb_hr']                 = 'سطر أفقي';
+$lang['qb_ol']                 = 'بند فى قائمة مرتبة';
+$lang['qb_ul']                 = 'بند فى قائمة غير مرتبة';
+$lang['qb_media']              = 'أضف صورا و ملفات أخرى';
+$lang['qb_sig']                = 'أدرج التوقيع';
+$lang['qb_smileys']            = 'الإبتسامات';
+$lang['qb_chars']              = 'محارف خاصة';
+$lang['upperns']               = 'انتقل للنطاق الأب';
+$lang['metaedit']              = 'تحرير البيانات الشمولية ';
+$lang['metasaveerr']           = 'فشلت كتابة البيانات الشمولية';
+$lang['metasaveok']            = 'حُفظت البيانات الشمولية';
+$lang['img_title']             = 'العنوان:';
+$lang['img_caption']           = 'وصف:';
+$lang['img_date']              = 'التاريخ:';
+$lang['img_fname']             = 'اسم الملف:';
+$lang['img_fsize']             = 'الحجم:';
+$lang['img_artist']            = 'المصور:';
+$lang['img_copyr']             = 'حقوق النسخ:';
+$lang['img_format']            = 'الهيئة:';
+$lang['img_camera']            = 'الكمرا:';
+$lang['img_keywords']          = 'كلمات مفتاحية:';
+$lang['img_width']             = 'العرض:';
+$lang['img_height']            = 'الإرتفاع:';
+$lang['subscr_subscribe_success'] = 'اضيف %s لقائمة اشتراك %s';
+$lang['subscr_subscribe_error'] = 'خطأ في إضافة %s لقائمة اشتراك %s';
+$lang['subscr_subscribe_noaddress'] = 'ليس هناك عنوان مرتبط بولوجك، لا يمكن اضافتك لقائمة الاشتراك';
+$lang['subscr_unsubscribe_success'] = 'أزيل %s من قائمة اشتراك %s';
+$lang['subscr_unsubscribe_error'] = 'خطأ في إزالة %s من قائمة اشتراك %s';
+$lang['subscr_already_subscribed'] = '%s مشترك مسبقا في %s';
+$lang['subscr_not_subscribed'] = '%s ليس مشتركا في %s';
+$lang['subscr_m_not_subscribed'] = 'لست مشتركا حاليا بالصفحة او النطاق الحاليين';
+$lang['subscr_m_new_header']   = 'أضف اشتراكا';
+$lang['subscr_m_current_header'] = 'الاشتراكات الحالية';
+$lang['subscr_m_unsubscribe']  = 'ألغ الاشتراك';
+$lang['subscr_m_subscribe']    = 'اشترك';
+$lang['subscr_m_receive']      = 'استقبال';
+$lang['subscr_style_every']    = 'بريدا على كل تغيير';
+$lang['subscr_style_digest']   = 'البريد الإلكتروني, ملخص للتغييرات لكل صفحة (كل يوم %.2f)';
+$lang['subscr_style_list']     = 'قائمة بالصفحات التي تم تغييرها منذ آخر بريد الإلكتروني (كل يوم %.2f)';
+$lang['authtempfail']          = 'تصريح المشترك غير متوفر مؤقتاً، إن استمرت هذه الحالة يرجى مراسلة المدير';
+$lang['i_chooselang']          = 'اختر لغتك';
+$lang['i_installer']           = 'برنامج تنصيب دوكو ويكي';
+$lang['i_wikiname']            = 'اسم الويكي';
+$lang['i_enableacl']           = 'تفعيل ACL - مفضل';
+$lang['i_superuser']           = 'مشرف';
+$lang['i_problems']            = 'وجد برنامج التنصيب المشاكل التالية، لا يمكنك المتابعة قبل حلها.';
+$lang['i_modified']            = 'لأسباب أمنية هذا البرنامج سيعمل فقط مع تنصيب دوكو ويكي جديد و غير معدّل.
+يجب أن تعيد فك ضغط الملفات مرة أخرى من المكتبة المضغوطة، أو راجع <a href="http://dokuwiki.org/install"> تعليمات تنصيب دوكو ويكي </a> ';
+$lang['i_funcna']              = 'دالة PHP التالية غير متوفرة.
+<code>%s</code>
+قد يكون مزود خدمة الاستفادة قد حجبها لسبب ما.';
+$lang['i_phpver']              = 'نسخة PHP التي لديك هي
+<code>%s</code>
+وهي أقل من النسخة المطلوبة
+<code>%s</code>
+عليك تحديث نسخة PHP';
+$lang['i_mbfuncoverload']      = 'يجب ايقاف تشغيل mbstring.func_overload في ملف php.ini لتشغيل دوكوويكي.';
+$lang['i_permfail']            = 'إن <code>%s</code> غير قابل للكتابة بواسطة دوكو ويكي، عليك تعديل إعدادات الصلاحيات لهذا المجلد!';
+$lang['i_confexists']          = 'إن <code>%s</code> موجود أصلاً';
+$lang['i_writeerr']            = 'لا يمكن إنشاء <code>%s</code>، عليك التأكد من صلاحيات الملف أو المجلد وإنشاء الملف يدوياً.';
+$lang['i_badhash']             = 'الملف dokuwiki.php غير مصنف أو قد تم تعديله
+(hash=<code>%s</code>)';
+$lang['i_badval']              = 'القيمة <code>%s</code> غير شرعية أو فارغة';
+$lang['i_success']             = 'الإعدادات تمت بنجاح، يرجى حذف الملف install.php الآن.
+ثم تابع إلى <a href="doku.php?id=wiki:welcome"> دوكو ويكي الجديدة</a>';
+$lang['i_failure']             = 'بعض الأخطاء حدثت أثنا كتابة ملفات الإعدادات، عليك تعديلها يدوياً قبل أن تستطيع استخدام <a href="doku.php?id=wiki:welcome"> دوكو ويكي الجديدة</a>';
+$lang['i_policy']              = 'تصريح ACL مبدئي';
+$lang['i_pol0']                = 'ويكي مفتوحة؛ أي القراءة والكتابة والتحميل مسموحة للجميع';
+$lang['i_pol1']                = 'ويكي عامة؛ أي القراءة للجميع ولكن الكتابة والتحميل للمشتركين المسجلين فقط';
+$lang['i_pol2']                = 'ويكي مغلقة؛ أي القراءة والكتابة والتحميل للمشتركين المسجلين فقط';
+$lang['i_allowreg']            = 'السماح للمستخدمين بتسجيل أنفسهم';
+$lang['i_retry']               = 'إعادة المحاولة';
+$lang['i_license']             = 'اختر الرخصة التي تريد وضع المحتوى تحتها:';
+$lang['i_license_none']        = 'لا تظهر أية معلومات للترخيص';
+$lang['i_pop_field']           = 'من فضلك، ساعدنا على تحسين تجربة دوكي ويكي:';
+$lang['i_pop_label']           = 'مرة واحدة في شهر، إرسال بيانات استخدام المجهول للمطورين دوكي ويكي';
+$lang['recent_global']         = 'انت تراقب حاليا التغييرات داخل نطاق <b>%s</b>. يمكنك أيضا <a href="%s">عرض أحدث تغييرات الويكي كلها</a>.';
+$lang['years']                 = '%d سنة مضت';
+$lang['months']                = '%d شهرا مضى';
+$lang['weeks']                 = '%d اسبوعا مضى';
+$lang['days']                  = '%d يوما مضى';
+$lang['hours']                 = '%d ساعة مضت';
+$lang['minutes']               = '%d دقيقة مضت';
+$lang['seconds']               = '%d ثانية مضت';
+$lang['wordblock']             = 'لم تحفظ تغييراتك لاحتوائها على نص ممنوع )غثاء(';
+$lang['media_uploadtab']       = 'ارفع';
+$lang['media_searchtab']       = 'ابحث';
+$lang['media_file']            = 'ملف';
+$lang['media_viewtab']         = 'عرض';
+$lang['media_edittab']         = 'تحرير';
+$lang['media_historytab']      = 'التاريخ';
+$lang['media_list_thumbs']     = 'المصغرات';
+$lang['media_list_rows']       = 'صفوف';
+$lang['media_sort_name']       = 'الاسم';
+$lang['media_sort_date']       = 'التاريخ';
+$lang['media_namespaces']      = 'اختر نطاقا';
+$lang['media_files']           = 'الملفات في %s';
+$lang['media_upload']          = 'ارفع إلى %s';
+$lang['media_search']          = 'ابحث في %s';
+$lang['media_view']            = '%s';
+$lang['media_viewold']         = '%s في %s';
+$lang['media_edit']            = 'حرر %s';
+$lang['media_history']         = 'تاريخ %s';
+$lang['media_meta_edited']     = 'عُدلت الميتاداتا';
+$lang['media_perm_read']       = 'عفوا، لست مخولا بقراءة الملفات.';
+$lang['media_perm_upload']     = 'عفوا، لست مخولا برفع الملفات.';
+$lang['media_update']          = 'ارفع إصدارا أحدث';
+$lang['media_restore']         = 'استرجع هذه النسخة';
+$lang['currentns']             = 'مساحة الاسم الحالية';
+$lang['searchresult']          = 'نتيجة البحث';
+$lang['plainhtml']             = 'نص HTML غير منسق';
+$lang['wikimarkup']            = 'علامات الوكي';
+$lang['email_signature_text']       = 'أنشئت هذه الرسالة من دوكو ويكي في
+@DOKUWIKIURL@';
diff --git a/wiki/inc/lang/ar/locked.txt b/wiki/inc/lang/ar/locked.txt
new file mode 100644
index 0000000..72e9be5
--- /dev/null
+++ b/wiki/inc/lang/ar/locked.txt
@@ -0,0 +1,3 @@
+====== الصفحة مقفلة ======
+
+هذه الصفحة مقفلة للتحرير بواسطة مستخدم أخر. عليك أن تنتظر حتى ينتهى من تعديلاتة أو تتنتهى مدة القفل.
\ No newline at end of file
diff --git a/wiki/inc/lang/ar/login.txt b/wiki/inc/lang/ar/login.txt
new file mode 100644
index 0000000..00ffccd
--- /dev/null
+++ b/wiki/inc/lang/ar/login.txt
@@ -0,0 +1,3 @@
+====== دخول ======
+
+أنت لست مسجل دخولك. أدخل بيانات تسجيلك للدخول. يجب أن يكون مسموح للمتصفح بأستخدام الكوكي.
diff --git a/wiki/inc/lang/ar/mailtext.txt b/wiki/inc/lang/ar/mailtext.txt
new file mode 100644
index 0000000..132e36e
--- /dev/null
+++ b/wiki/inc/lang/ar/mailtext.txt
@@ -0,0 +1,12 @@
+تم تغيير أو أضافة صفحة فى دوكو ويكي. اليك التفاصيل:
+
+التاريخ        : @DATE@
+المتصفح     : @BROWSER@
+عنوان الـIP  : @IPADDRESS@
+أسم الجهاز    : @HOSTNAME@
+النسخة القديمة: @OLDPAGE@
+النسخة الجديدة: @NEWPAGE@
+ملخص التحرير: @SUMMARY@
+مستخدم        : @USER@
+
+@DIFF@
diff --git a/wiki/inc/lang/ar/mailwrap.html b/wiki/inc/lang/ar/mailwrap.html
new file mode 100644
index 0000000..d257190
--- /dev/null
+++ b/wiki/inc/lang/ar/mailwrap.html
@@ -0,0 +1,13 @@
+<html>
+<head>
+<title>@TITLE@</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+</head>
+<body>
+
+@HTMLBODY@
+
+<br /><hr />
+<small>@EMAILSIGNATURE@</small>
+</body>
+</html>
\ No newline at end of file
diff --git a/wiki/inc/lang/ar/newpage.txt b/wiki/inc/lang/ar/newpage.txt
new file mode 100644
index 0000000..ecaa7fa
--- /dev/null
+++ b/wiki/inc/lang/ar/newpage.txt
@@ -0,0 +1,3 @@
+====== لا يوجد هذا الموضوع بعد ======
+
+لقد تابعت رابط لموضوع غير متواجد بعد. يمكنك إنشائة بالضعط على زر "انشيء هذه الصفحة".
diff --git a/wiki/inc/lang/ar/norev.txt b/wiki/inc/lang/ar/norev.txt
new file mode 100644
index 0000000..2aa2330
--- /dev/null
+++ b/wiki/inc/lang/ar/norev.txt
@@ -0,0 +1,3 @@
+====== لا توجد تلك النسخة ======
+
+النسخة المختارة ليست موجودة. أسبخدم زر "نسخ قديمة" لعرض قائمة بالنسخ القديمة من هذه الصفحة.
diff --git a/wiki/inc/lang/ar/password.txt b/wiki/inc/lang/ar/password.txt
new file mode 100644
index 0000000..2489800
--- /dev/null
+++ b/wiki/inc/lang/ar/password.txt
@@ -0,0 +1,6 @@
+أهلاً @FULLNAME@!
+
+ها هى معلومات المستخدم لـ @TITLE@ الموجودة على العنوان @DOKUWIKIURL@
+
+أسم المستخدم    : @LOGIN@
+كلمة السر : @PASSWORD@
diff --git a/wiki/inc/lang/ar/preview.txt b/wiki/inc/lang/ar/preview.txt
new file mode 100644
index 0000000..c537e6b
--- /dev/null
+++ b/wiki/inc/lang/ar/preview.txt
@@ -0,0 +1,3 @@
+====== عرض التعديلات ======
+
+هذا عرض لما سيصبح علية نص الصفحة. تذكر أن التعديلات **لم تحفظ** بعد!
diff --git a/wiki/inc/lang/ar/pwconfirm.txt b/wiki/inc/lang/ar/pwconfirm.txt
new file mode 100644
index 0000000..6e971d3
--- /dev/null
+++ b/wiki/inc/lang/ar/pwconfirm.txt
@@ -0,0 +1,6 @@
+مرحبا @FULLNAME@
+
+شخص ما طلب كلمة سر جديدة لـحسابك @TITLE@ في @DOKUWIKIURL@
+إذا لم تكن قد طلبت كلمة سر جديدة رجاء قم بتجاهل هذه الرسالة .
+لتأكيد أنك أنت قمت بطلب كلمة السر الجديدة . نرجو منك الضغط على الرابط في الأسفل .
+@CONFIRM@
diff --git a/wiki/inc/lang/ar/read.txt b/wiki/inc/lang/ar/read.txt
new file mode 100644
index 0000000..3e6c504
--- /dev/null
+++ b/wiki/inc/lang/ar/read.txt
@@ -0,0 +1 @@
+هذه الصفحة للقراءة فقط. يمكنك تصفح مصدرها، ولكن لا يمكنك تعديلها. إن كنت تتعتفد أن هناك خطأ ما خاطب المدير.
\ No newline at end of file
diff --git a/wiki/inc/lang/ar/recent.txt b/wiki/inc/lang/ar/recent.txt
new file mode 100644
index 0000000..94d6840
--- /dev/null
+++ b/wiki/inc/lang/ar/recent.txt
@@ -0,0 +1,3 @@
+====== احدث التغييرات ======
+
+تم تعديل الصفحات التالية حديثا.
\ No newline at end of file
diff --git a/wiki/inc/lang/ar/register.txt b/wiki/inc/lang/ar/register.txt
new file mode 100644
index 0000000..10a7fa2
--- /dev/null
+++ b/wiki/inc/lang/ar/register.txt
@@ -0,0 +1,3 @@
+====== سجل كمستخدم جديد ======
+
+املئ البيانات التالية لتسجيل حساب جديد على الويكي. تأكد من كتابة **بريد إلكتروني صحيح** - سترسل إليك كلمة سر جديدة. اسم الدخول يجب أن يكون [[doku>pagename|أسم صفحة]] صحيح.
diff --git a/wiki/inc/lang/ar/registermail.txt b/wiki/inc/lang/ar/registermail.txt
new file mode 100644
index 0000000..7c1cae0
--- /dev/null
+++ b/wiki/inc/lang/ar/registermail.txt
@@ -0,0 +1,10 @@
+سجل مستخدم جديد. هذه هي التفاصيل:
+
+اسم المستخدم : @NEWUSER@
+الاسم الكامل : @NEWNAME@
+البريد: @NEWEMAIL@
+
+التاريخ : @DATE@
+المتصفح : @BROWSER@
+عنوان-IP: @IPADDRESS@
+اسم المضيف: @HOSTNAME@
diff --git a/wiki/inc/lang/ar/resendpwd.txt b/wiki/inc/lang/ar/resendpwd.txt
new file mode 100644
index 0000000..c697137
--- /dev/null
+++ b/wiki/inc/lang/ar/resendpwd.txt
@@ -0,0 +1,3 @@
+==== إرسال كلمة سر جديدة ====
+
+رجاء اكتب اسم المستخدم في الاستمارة الموجودة في الأسفل ليتم طلب رقم سري جديد لحسابك في هذا الويكي . سيرسل رابط لتأكيد طلبك إلى بريدك الإلكتروني المسجل .
\ No newline at end of file
diff --git a/wiki/inc/lang/ar/resetpwd.txt b/wiki/inc/lang/ar/resetpwd.txt
new file mode 100644
index 0000000..2bbd4a2
--- /dev/null
+++ b/wiki/inc/lang/ar/resetpwd.txt
@@ -0,0 +1,3 @@
+====== اضبط كلمة سر جديدة ======
+
+أدخل كلمة سر جديدة لحسابك في هذه الويكي.
diff --git a/wiki/inc/lang/ar/revisions.txt b/wiki/inc/lang/ar/revisions.txt
new file mode 100644
index 0000000..930a4ef
--- /dev/null
+++ b/wiki/inc/lang/ar/revisions.txt
@@ -0,0 +1,2 @@
+====== النسخ القديمة ======
+النسخ القديمة للصفحة الحالية. لإستعادة نسخة قديمة: أخترها من المعروض، ثم إضغط على زر "عدل هذه الصفحة" و أحفظها.
\ No newline at end of file
diff --git a/wiki/inc/lang/ar/searchpage.txt b/wiki/inc/lang/ar/searchpage.txt
new file mode 100644
index 0000000..52537c3
--- /dev/null
+++ b/wiki/inc/lang/ar/searchpage.txt
@@ -0,0 +1,4 @@
+====== بحث ======
+
+نتائج البحث .  @CREATEPAGEINFO@
+
diff --git a/wiki/inc/lang/ar/showrev.txt b/wiki/inc/lang/ar/showrev.txt
new file mode 100644
index 0000000..3012907
--- /dev/null
+++ b/wiki/inc/lang/ar/showrev.txt
@@ -0,0 +1,2 @@
+**هذه نسخة قديمة من الصفحة!**
+----
\ No newline at end of file
diff --git a/wiki/inc/lang/ar/stopwords.txt b/wiki/inc/lang/ar/stopwords.txt
new file mode 100644
index 0000000..1a88598
--- /dev/null
+++ b/wiki/inc/lang/ar/stopwords.txt
@@ -0,0 +1,192 @@
+# This is a list of words the indexer ignores, one word per line
+# When you edit this file be sure to use UNIX line endings (single newline)
+# No need to include words shorter than 3 chars - these are ignored anyway
+# This list is based upon the ones found at http://www.ranks.nl/stopwords/



+عشر
+عدد
+عدة
+عشرة
+عدم
+عام
+عاما
+عن
+عند
+عندما
+على
+عليه
+عليها
+زيارة
+سنة
+سنوات
+تم
+ضد
+بعد
+بعض
+اعادة
+اعلنت
+بسبب
+حتى
+اذا
+احد
+اثر
+برس
+باسم
+غدا
+شخصا
+صباح
+اطار
+اربعة
+اخرى
+بان
+اجل
+غير
+بشكل
+حاليا
+بن
+به
+ثم
+اف
+ان
+او
+اي
+بها
+صفر
+حيث
+اكد
+الا
+اما
+امس
+السابق
+التى
+التي
+اكثر
+ايار
+ايضا
+ثلاثة
+الذاتي
+الاخيرة
+الثاني
+الثانية
+الذى
+الذي
+الان
+امام
+ايام
+خلال
+حوالى
+الذين
+الاول
+الاولى
+بين
+ذلك
+دون
+حول
+حين
+الف
+الى
+انه
+اول
+ضمن
+انها
+جميع
+الماضي
+الوقت
+المقبل
+اليوم



+و6
+قد
+لا
+ما
+مع
+مساء
+هذا
+واحد
+واضاف
+واضافت
+فان
+قبل
+قال
+كان
+لدى
+نحو
+هذه
+وان
+واكد
+كانت
+واوضح
+مايو
+فى
+في
+كل
+لم
+لن
+له
+من
+هو
+هي
+قوة
+كما
+لها
+منذ
+وقد
+ولا
+نفسه
+لقاء
+مقابل
+هناك
+وقال
+وكان
+نهاية
+وقالت
+وكانت
+للامم
+فيه
+كلم
+لكن
+وفي
+وقف
+ولم
+ومن
+وهو
+وهي
+يوم
+فيها
+منها
+مليار
+لوكالة
+يكون
+يمكن
+مليون
+فى
+أم
+about
+are
+and
+you
+your
+them
+their
+com
+for
+from
+into
+how
+that
+the
+this
+was
+what
+when
+where
+who
+will
+with
+und
+the
+www
diff --git a/wiki/inc/lang/ar/subscr_digest.txt b/wiki/inc/lang/ar/subscr_digest.txt
new file mode 100644
index 0000000..58256f5
--- /dev/null
+++ b/wiki/inc/lang/ar/subscr_digest.txt
@@ -0,0 +1,16 @@
+مرحبا!
+
+تغيرت الصفحة @PAGE@ في ويكي @TITLE@.
+هذه هي التغيرات:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+النسخة القديمة: @OLDPAGE@
+النسخة الحديثة: @NEWPAGE@
+
+لإلغاء تنبيه الصفحة, لج الويكي في
+@DOKUWIKIURL@ ثم زُر
+@SUBSCRIBE@
+وألغ اشتراكك من الصفحات أو النظاقات
diff --git a/wiki/inc/lang/ar/subscr_form.txt b/wiki/inc/lang/ar/subscr_form.txt
new file mode 100644
index 0000000..919d256
--- /dev/null
+++ b/wiki/inc/lang/ar/subscr_form.txt
@@ -0,0 +1,3 @@
+====== إدارة الإشتراكات ======
+
+تمكنك هذه الصفحة من إدارة اشتراكاتك للصفحة و النطاق الحاليين.
\ No newline at end of file
diff --git a/wiki/inc/lang/ar/subscr_list.txt b/wiki/inc/lang/ar/subscr_list.txt
new file mode 100644
index 0000000..681fed2
--- /dev/null
+++ b/wiki/inc/lang/ar/subscr_list.txt
@@ -0,0 +1,13 @@
+مرحبا!
+
+صفحات في النطاق @PAGE@ في ويكي @TITLE@ غُيرت.
+هذه هي الصفحات المتغيرة:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+لإلغاء إشعارات الصفحة, لُج الويكي في
+@DOKUWIKIURL@ ثم زُر
+@SUBSCRIBE@
+ثم ألغ اشتراك تغييرات الصفحة و/أو النطاق.
diff --git a/wiki/inc/lang/ar/subscr_single.txt b/wiki/inc/lang/ar/subscr_single.txt
new file mode 100644
index 0000000..6ac7d21
--- /dev/null
+++ b/wiki/inc/lang/ar/subscr_single.txt
@@ -0,0 +1,19 @@
+مرحبا!
+
+الصفحة @PAGE@ في ويكي @TITLE@ تغيرت.
+هذه هي التغييرات:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+التاريخ : @DATE@
+المستخدم : @USER@
+ملخص التحرير: @SUMMARY@
+الاصدار القديم: @OLDPAGE@
+الاصدار الحديث: @NEWPAGE@
+
+لإلغاء إشعارات الصفحة,لُج الويكي في
+@DOKUWIKIURL@ ثم زُر
+@SUBSCRIBE@
+وألغ الاشتراك من تغييرات الصفحة و/أو النطاق.
diff --git a/wiki/inc/lang/ar/updateprofile.txt b/wiki/inc/lang/ar/updateprofile.txt
new file mode 100644
index 0000000..04a5a09
--- /dev/null
+++ b/wiki/inc/lang/ar/updateprofile.txt
@@ -0,0 +1,3 @@
+==== تحديث بيانات حسابك ====
+
+عليك فقط أن تكمل كتابة الحقول التي تريد أن تغيرها . لا تستطيع تغيير اسم المستخدم .
\ No newline at end of file
diff --git a/wiki/inc/lang/ar/uploadmail.txt b/wiki/inc/lang/ar/uploadmail.txt
new file mode 100644
index 0000000..bc61e6e
--- /dev/null
+++ b/wiki/inc/lang/ar/uploadmail.txt
@@ -0,0 +1,10 @@
+رُفع ملف إلى دوكو ويكي خاصتك. هذه هي التفاصيل:
+
+الملف : @MEDIA@
+التاريخ : @DATE@
+المستعرض : @BROWSER@
+عنوان-IP: @IPADDRESS@
+اسم المضيف: @HOSTNAME@
+الحجم : @SIZE@
+نوع MIME : @MIME@
+المستخدم: @USER@
diff --git a/wiki/inc/lang/az/admin.txt b/wiki/inc/lang/az/admin.txt
new file mode 100644
index 0000000..000caa0
--- /dev/null
+++ b/wiki/inc/lang/az/admin.txt
@@ -0,0 +1,4 @@
+====== İdarəetmə ======
+
+Aşağıda Dokuwiki-də mümkün olan administrativ əməliyyatların siyahısı göstərilib.
+
diff --git a/wiki/inc/lang/az/adminplugins.txt b/wiki/inc/lang/az/adminplugins.txt
new file mode 100644
index 0000000..62b1f87
--- /dev/null
+++ b/wiki/inc/lang/az/adminplugins.txt
@@ -0,0 +1 @@
+===== Əlavə Plugin-lər =====
diff --git a/wiki/inc/lang/az/backlinks.txt b/wiki/inc/lang/az/backlinks.txt
new file mode 100644
index 0000000..72a7c85
--- /dev/null
+++ b/wiki/inc/lang/az/backlinks.txt
@@ -0,0 +1,4 @@
+====== Əks linklər ======
+
+Bu, bu səhifəyə link saxlayan səhifələrin siyahısıdır.
+
diff --git a/wiki/inc/lang/az/conflict.txt b/wiki/inc/lang/az/conflict.txt
new file mode 100644
index 0000000..908be09
--- /dev/null
+++ b/wiki/inc/lang/az/conflict.txt
@@ -0,0 +1,5 @@
+====== Daha yeni versiya var ======
+
+Düzəliş etdiyiniz sənədin daha yeni versiyası var. Siz və başqa istifadəçi eyni zamanda eyni sənədi düzəliş edən zaman belə vəziyyət yaranır.
+
+Aşağıda göstərilən fərqlər ilə tanış olun və lazım olan versiyanı təyin edin. Əgər ''Yadda Saxla'' düyməsini sıxsanız, onda sizin versiya seçilmiş olur. ''İmtina'' düyməsini sıxsanız isə onda hazırki versiya seçilmiş olur.
diff --git a/wiki/inc/lang/az/denied.txt b/wiki/inc/lang/az/denied.txt
new file mode 100644
index 0000000..c6fddb6
--- /dev/null
+++ b/wiki/inc/lang/az/denied.txt
@@ -0,0 +1,3 @@
+====== Müraciət qadağan edilmişdir ======
+
+Sizin bu əməliyyat üçün kifayət qədər haqqınız yoxdur.
diff --git a/wiki/inc/lang/az/diff.txt b/wiki/inc/lang/az/diff.txt
new file mode 100644
index 0000000..a944f84
--- /dev/null
+++ b/wiki/inc/lang/az/diff.txt
@@ -0,0 +1,4 @@
+====== Fərqlər ======
+
+Burada bu səhifənin seçilmiş və hazırki versiyaların arasında olan fərqlər göstərilib.
+
diff --git a/wiki/inc/lang/az/draft.txt b/wiki/inc/lang/az/draft.txt
new file mode 100644
index 0000000..65c743d
--- /dev/null
+++ b/wiki/inc/lang/az/draft.txt
@@ -0,0 +1,5 @@
+====== Qaralama tapılıb ======
+
+Bu səhifənin son düzəlişi düzgün başa çatdırılmamışdir. Düzəliş zamanı qaralama avtomatik yadda saxlanılmışdır. İndi Siz onu açıb düzəlişi davam edə bilərsiniz. Qaralama versiyası aşağıda göstərilib.
+
+İtmiş versiyanı //qaytarmaq//, qaralamanı //silmək//, və ya düzəlişi //imtina// etmək istədiyinizi təyin edin.
diff --git a/wiki/inc/lang/az/edit.txt b/wiki/inc/lang/az/edit.txt
new file mode 100644
index 0000000..7ce6630
--- /dev/null
+++ b/wiki/inc/lang/az/edit.txt
@@ -0,0 +1 @@
+Səhifədə düzəliş edin və ''Yadda Saxla'' düyməsini sıxın. Sintaksis ilə tanış olmaq üçün [[wiki:syntax]] səhifəsini oxuyun. Ançaq səhifəni **daha yaxşı** etməki istədiyiniz halda düzəliş etməyinizi xahiş edirik. Əgər Siz nəyi isə ancaq test etmək istəyirsiniz sə, onda [[playground:playground]] xüsusi səhifədən istifadə edin.
diff --git a/wiki/inc/lang/az/editrev.txt b/wiki/inc/lang/az/editrev.txt
new file mode 100644
index 0000000..8e98d2f
--- /dev/null
+++ b/wiki/inc/lang/az/editrev.txt
@@ -0,0 +1,2 @@
+**Sənədin köhnə versiyasını açmısınız!** Bu versiyanı yadda saxlasanız, bu mətn ilə olan yeni hazırki versiya yaratmış olarsınız.
+----
diff --git a/wiki/inc/lang/az/index.txt b/wiki/inc/lang/az/index.txt
new file mode 100644
index 0000000..dc3ffa3
--- /dev/null
+++ b/wiki/inc/lang/az/index.txt
@@ -0,0 +1,4 @@
+====== Mündəricat ======
+
+Burada mövcud olan səhifələr Namespace-lərə ([[doku>namespaces|namespaces]]) görə sıralanmış halda göstərilib.
+
diff --git a/wiki/inc/lang/az/install.html b/wiki/inc/lang/az/install.html
new file mode 100644
index 0000000..d8382b1
--- /dev/null
+++ b/wiki/inc/lang/az/install.html
@@ -0,0 +1,7 @@
+<p>Bu səhifə Sizə <a href="http://dokuwiki.org">DokuWiki</a>-ni quraşdırmaqa kömək etmək üçündür. Quraşdırma haqqına əlavə məlumatı onun <a href="http://dokuwiki.org/installer">dokumentasiya səhifəsində</a> var.</p>
+
+<p>Səhifələri və əlavə məlumatları (məsələn, şəkillər, axtarış indeksi, səhifələrin əvvəlki versiyaları, və sairə) saxlamaq üçün DokuWiki adi fayllardan istifadə edir. DokuWiki-nin uğurlu işləməsi üçün bu faylların yerləşən qovluqa yazı imkanı vacib <strong>lazımdır</strong>. Bu quraşdırma proqramı sistemin qovluqlarına olan haqları dəyişə bilmir. Çox vaxt bu birbaşa shell-dən, və ya, əgər Siz hostinq-dən istifadə edirsinizsə, FTP vasitəsi ya idarəetmə paneli vasitəsi (məsələn, cPanel) ilə edilir.</p>
+
+<p>Quraşdırma proqramı sizin DokuWiki-nizdə haqlar kontrolu siyahısını (<abbr title="access control list">ACL</abbr>) quracaq. Bu, sistemə girdikdən sonra, administratora xüsusi menü vasitəsi ilə plugin-ləri quraşdırmaq, istifadiçiləri və səhifələrə giriş haqlarını idarəetmək, və həmçinin sistemin konfiqurasiyasını quraşdırmağa imkan verəcək. Haqlar kontrolu siyahısı DokuWiki-yə mütləq lazım deyil, amma o Sizə DokuWiki-nin idarəetməsini asanlaşdırır.</p>
+
+<p>Təcrübəli istifadəçilər və xüsusi tələbləri olan istifadəçilərə əlavə məlumat üçün <a href="http://dokuwiki.org/install">quraşdırılma prosesi</a> və <a href="http://dokuwiki.org/config">konfiqurasiya parametrləri</a> link-lərinə muraciyət etməsk tövsiyyə olunur.</p>
diff --git a/wiki/inc/lang/az/jquery.ui.datepicker.js b/wiki/inc/lang/az/jquery.ui.datepicker.js
new file mode 100644
index 0000000..2ebdcfa
--- /dev/null
+++ b/wiki/inc/lang/az/jquery.ui.datepicker.js
@@ -0,0 +1,37 @@
+/* Azerbaijani (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Jamil Najafov (necefov33@gmail.com). */
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "../widgets/datepicker" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery.datepicker );
+	}
+}( function( datepicker ) {
+
+datepicker.regional.az = {
+	closeText: "Bağla",
+	prevText: "&#x3C;Geri",
+	nextText: "İrəli&#x3E;",
+	currentText: "Bugün",
+	monthNames: [ "Yanvar","Fevral","Mart","Aprel","May","İyun",
+	"İyul","Avqust","Sentyabr","Oktyabr","Noyabr","Dekabr" ],
+	monthNamesShort: [ "Yan","Fev","Mar","Apr","May","İyun",
+	"İyul","Avq","Sen","Okt","Noy","Dek" ],
+	dayNames: [ "Bazar","Bazar ertəsi","Çərşənbə axşamı","Çərşənbə","Cümə axşamı","Cümə","Şənbə" ],
+	dayNamesShort: [ "B","Be","Ça","Ç","Ca","C","Ş" ],
+	dayNamesMin: [ "B","B","Ç","С","Ç","C","Ş" ],
+	weekHeader: "Hf",
+	dateFormat: "dd.mm.yy",
+	firstDay: 1,
+	isRTL: false,
+	showMonthAfterYear: false,
+	yearSuffix: "" };
+datepicker.setDefaults( datepicker.regional.az );
+
+return datepicker.regional.az;
+
+} ) );
diff --git a/wiki/inc/lang/az/lang.php b/wiki/inc/lang/az/lang.php
new file mode 100644
index 0000000..f2c9aa6
--- /dev/null
+++ b/wiki/inc/lang/az/lang.php
@@ -0,0 +1,231 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Pasha L. Topchiyev <pasha@itopchiyev.com>
+ * @author Elchin <quliyev_elchin1989@mail.ru>
+ */
+$lang['encoding']              = 'utf-8';
+$lang['direction']             = 'ltr';
+$lang['doublequoteopening']    = '«';
+$lang['doublequoteclosing']    = '»';
+$lang['singlequoteopening']    = '„';
+$lang['singlequoteclosing']    = '“';
+$lang['apostrophe']            = '’';
+$lang['btn_edit']              = 'Səhifəyə düzəliş et';
+$lang['btn_source']            = 'Səhifənin ilkin mətnini göstər';
+$lang['btn_show']              = 'Səhifəni göstər';
+$lang['btn_create']            = 'Səhifəni yarat';
+$lang['btn_search']            = 'Axtarış';
+$lang['btn_save']              = 'Yadda saxla';
+$lang['btn_preview']           = 'Baxış';
+$lang['btn_top']               = 'Yuxarı';
+$lang['btn_newer']             = '<< daha təzələr';
+$lang['btn_older']             = 'daha köhnələr >>';
+$lang['btn_revs']              = 'Səhifənin tarixçəsi';
+$lang['btn_recent']            = 'Yaxın dəyişiklər';
+$lang['btn_upload']            = 'Serverə yükə';
+$lang['btn_cancel']            = 'İmtina';
+$lang['btn_index']             = 'Bütün səhifələr';
+$lang['btn_secedit']           = 'Düzəliş et';
+$lang['btn_login']             = 'Giriş';
+$lang['btn_logout']            = 'Cıxış';
+$lang['btn_admin']             = 'İdarəetmə';
+$lang['btn_update']            = 'Yenilə';
+$lang['btn_delete']            = 'Sil';
+$lang['btn_back']              = 'Geri';
+$lang['btn_backlink']          = 'Bura olan link-lər';
+$lang['btn_subscribe']         = 'Abunə ol (bütün dəyişiklər)';
+$lang['btn_profile']           = 'Profil';
+$lang['btn_reset']             = 'Boşalt';
+$lang['btn_draft']             = 'Qaralamada düzəliş etmək';
+$lang['btn_recover']           = 'Qaralamanı qaytar';
+$lang['btn_draftdel']          = 'Qaralamanı sil';
+$lang['btn_revert']            = 'Qaytar';
+$lang['btn_register']          = 'Qeydiyyatdan keç';
+$lang['btn_img_backto']        = 'Qayıd %s';
+$lang['loggedinas']            = 'İstifadəcinin adı:';
+$lang['user']                  = 'istifadəci adı';
+$lang['pass']                  = 'Şifrə';
+$lang['newpass']               = 'Yeni şifrə';
+$lang['oldpass']               = 'Hazırki şifrəni daxil edin';
+$lang['passchk']               = 'təkrarlayın';
+$lang['remember']              = 'Məni yadda saxla';
+$lang['fullname']              = 'Tam ad';
+$lang['email']                 = 'E-Mail';
+$lang['profile']               = 'İstifadəçi profili';
+$lang['badlogin']              = 'Təssüf ki istifadəçi adı və ya şifrə səhvdir.';
+$lang['minoredit']             = 'Az dəyişiklər';
+$lang['draftdate']             = 'Qaralama yadda saxlandı';
+$lang['nosecedit']             = 'Bu vaxt ərzində səhifə dəyişilmişdir, və bölmə haqqında məlumat köhnəlmişdir. Səhifənin tam versiyası yüklənmişdir.';
+$lang['regmissing']            = 'Təssüf ki Siz bütün xanələri doldurmalısınız.';
+$lang['reguexists']            = 'Təssüf ki bu ad ilə istifadəçi artıq mövcuddur.';
+$lang['regsuccess']            = 'İstivadəci yaradıldı və şifrə sizin e-maila göndərildi.';
+$lang['regsuccess2']           = 'İstifadəçi yaradıldı.';
+$lang['regmailfail']           = 'Deyəsən, xəta şifrə e-maila göndərildikdə baş verdi. Xaiş olunur, ki administrator ilə əlaqə saxlayasınız!';
+$lang['regbadmail']            = 'Deyəsən, daxil edilmiş e-mail ünvanı səhvdir. Əgər şübhəniz var isə administrator ilə əlaqə saxlayın.';
+$lang['regbadpass']            = 'Daxil edilmiş iki şifrə fərqlidir. Xaiş olunur ki, yenidən daxil edəsiniz.';
+$lang['regpwmail']             = 'Sizin DokuWiki sistemi üçün şifrəniz';
+$lang['reghere']               = 'Sizin hələ istifadəçi adınız yoxdur? Buyurun əldə edin';
+$lang['profna']                = 'Bu wiki profilin dəyişdirilməsini dəstəkləmir';
+$lang['profnochange']          = 'Dəyişiklər edilmədi, profil yenilənmədi.';
+$lang['profnoempty']           = 'istifadəci adı və e-mail ünvanı boş ola bilməz.';
+$lang['profchanged']           = 'İstifadəçi profili uğurla yeniləndi.';
+$lang['profdeleteuser']        = 'Profili sil.';
+$lang['profconfdeletemissing'] = 'Təsdiq xanası seçilməib.';
+$lang['proffail']              = 'İstifadəçi profili yenilənmiyib.';
+$lang['pwdforget']             = 'Şifrəni yaddan çıxartmısız? Buyurun yenisini əldə edin';
+$lang['resendna']              = 'Bu wiki şifrəni yenidən göndərməyi dəstəkləmir.';
+$lang['resendpwdmissing']      = 'Formanın bütün xanəlırini doldurun.';
+$lang['resendpwdnouser']       = 'Verilənlər bazasında bu ad ilə istifadəçi tapılmadı.';
+$lang['resendpwdbadauth']      = 'Ativləşdirmə kodu səhvdir. Link-i tam olaraq köçürdüyünüzü yoxlayın. ';
+$lang['resendpwdconfirm']      = 'Şifrəni təstiqləmək üçün sizin e-maila link göndərilmişdir. ';
+$lang['resendpwdsuccess']      = 'Yeni şifrəniz e-maila göndərildi.';
+$lang['license']               = 'Fərqli şey göstərilmiş hallardan başqa, bu wiki-nin mətni aşağıda göstərilmiş lisenziyanın şərtlərinə uyğun təqdim olunur:';
+$lang['licenseok']             = 'Qeyd: bu səhifəni düzəliş edərək, Siz elədiyiniz düzəlişi aşağıda göstərilmiş lisenziyanın şərtlərinə uyğun istifadəsinə razılıq verirsiniz:';
+$lang['searchmedia']           = 'Faylın adına görə axtarış:';
+$lang['searchmedia_in']        = '%s-ın içində axtarış';
+$lang['txt_upload']            = 'Serverə yükləmək üçün fayl seçin:';
+$lang['txt_filename']          = 'Faylın wiki-də olan adını daxil edin (mütləq deyil):';
+$lang['txt_overwrt']           = 'Mövcud olan faylın üstündən yaz';
+$lang['lockedby']              = 'В данный момент заблокирован Bu an blokdadır:';
+$lang['lockexpire']            = 'Blok bitir:';
+$lang['js']['willexpire']      = 'Sizin bu səhifədə dəyişik etmək üçün blokunuz bir dəqiqə ərzində bitəcək.\nMünaqişələrdən yayınmaq və blokun taymerini sıfırlamaq üçün, baxış düyməsini sıxın.';
+$lang['js']['notsavedyet']     = 'Yaddaşa verilməmiş məlumatlar itəcək.';
+$lang['js']['searchmedia']     = 'Faylların axtarışı';
+$lang['js']['keepopen']        = 'Seçimdən sonra pəncərəni açıq saxlamaq';
+$lang['js']['hidedetails']     = 'Təfərruatı gizlət';
+$lang['js']['mediadisplay']    = 'Link növü';
+$lang['js']['mediasize']       = 'Şəkil ölçüsü.';
+$lang['js']['mediaclose']      = 'Bağla.';
+$lang['js']['mediadisplayimg'] = 'Şəkili göstər.';
+$lang['js']['mediadisplaylnk'] = 'Ancaq linki göstər.';
+$lang['js']['mediasmall']      = 'Kiçik versiya.';
+$lang['js']['mediamedium']     = 'Orta versiya.';
+$lang['js']['medialarge']      = 'Böyük versiya.';
+$lang['js']['mediaoriginal']   = 'Orjinal versiya.';
+$lang['js']['medialnk']        = 'Məlumat səhifəsinə keçid.';
+$lang['js']['nosmblinks']      = 'Windows-un şəbəkə qovluqlarına link ancaq Internet Explorer-dən işləyir. \nAmma Siz linki köçürə bilərsiniz.';
+$lang['js']['linkwiz']         = 'Linklər köməkçisi';
+$lang['js']['linkto']          = 'Link göstərir:';
+$lang['js']['del_confirm']     = 'Siz əminsiz ki, seçilmişləri silmək istəyirsiniz?';
+$lang['rssfailed']             = 'Aşağıda göstərilmiş xəbər lentini əldə edən zaman xəta baş verdi: ';
+$lang['nothingfound']          = 'Heçnə tapılmadı.';
+$lang['mediaselect']           = 'Mediya-faylın seçilməsi';
+$lang['uploadsucc']            = 'Yüklənmə uğur ilə başa çatdı';
+$lang['uploadfail']            = 'Yüklənmə zamanı xəta baş veri. Bəlkə giriş haqları ilə problem var?';
+$lang['uploadwrong']           = 'Yuklənməyə qadağa qoyuldu. Belə növlu faylları serverə yükləmək olmaz. ';
+$lang['uploadexist']           = 'Bu adlı fayl artıq serverdə var. Yükləmə alınmadı .';
+$lang['uploadbadcontent']      = 'Faylın tərkibi %s növünə uyğun gəlmir.';
+$lang['uploadspam']            = 'Yüklənmə spam-filtri tərəfindən dayandırıldı.';
+$lang['uploadxss']             = 'Yüklənmə təhlükəsizlik nəzərindən dayandırılmışdır.';
+$lang['uploadsize']            = 'Yüklənilmiş fayl çox boyükdür. (maks. %s)';
+$lang['deletesucc']            = '"%s" adlı fayl silindi.';
+$lang['deletefail']            = '"%s" adlı fayl silinmədi. Faylın giriş haqlarını yoxlayın.';
+$lang['mediainuse']            = '"%s" adlı fayl silinmədi. Fayl hələ istifadə olunur';
+$lang['namespaces']            = 'Namespace-lər';
+$lang['mediafiles']            = 'Mövcud olan fayllar';
+$lang['mediausage']            = 'Bu fayla link yaratmaq üçün aşağıdakı sintaksisdən istifadə edin:';
+$lang['mediaview']             = 'Bu faylın ilkinə bax';
+$lang['mediaroot']             = 'kök';
+$lang['mediaupload']           = 'Burda faylı hazırki qovluqa yükləmək olar ("namespace"). Alt qovluqlar yaratmaq üçün, onların adlarını faylın adının avvəlinə artırın ("Adla yükləmək"). Alt qovluqların adları çütnöqtə ilə ayrılır. ';
+$lang['mediaextchange']        = 'Faylın nüvü .%s -dan .%s -ya dəyişdi!';
+$lang['reference']             = 'Linklər göstərir';
+$lang['ref_inuse']             = 'Bu fayl silinə bilməz, çünki o aşağıdaki səhifələr tərəfindən istifadə olunur:';
+$lang['ref_hidden']            = 'Bəzi link-lər sizin oxumaq haqqınız olmayan səhifələrdə yerləşir';
+$lang['hits']                  = 'uyğunluqlar';
+$lang['quickhits']             = 'Səhifələrin adlarında uyğunluqlar';
+$lang['toc']                   = 'Mündəricat';
+$lang['current']               = 'hazırki';
+$lang['yours']                 = 'Sizin versiyanız';
+$lang['diff']                  = 'hazırki versiyadan fərqləri göstər';
+$lang['diff2']                 = 'Versiyaların arasındaki fərqləri göstər  ';
+$lang['line']                  = 'Sətr';
+$lang['breadcrumb']            = 'Siz ziyarət etdiniz:';
+$lang['youarehere']            = 'Siz burdasınız:';
+$lang['lastmod']               = 'Son dəyişiklər:';
+$lang['by']                    = ' Kimdən';
+$lang['deleted']               = 'silinib';
+$lang['created']               = 'yaranıb';
+$lang['restored']              = 'köhnə versiya qaytarıldı (%s)';
+$lang['external_edit']         = 'bayırdan dəyişik';
+$lang['summary']               = 'Dəyişiklər xülasəsi';
+$lang['noflash']               = 'Bu məzmuna baxmaq üçün <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> tələb olunur.';
+$lang['download']              = 'Kodu yüklə';
+$lang['mail_newpage']          = 'səhifə əlavə olundu:';
+$lang['mail_changed']          = 'səhifəyə düzəliş edildi:';
+$lang['mail_new_user']         = 'yeni istifadəçi:';
+$lang['mail_upload']           = 'fayl yükləndi:';
+$lang['qb_bold']               = 'Qalın şrift';
+$lang['qb_italic']             = 'Maili şrift';
+$lang['qb_underl']             = 'Alt-xətt';
+$lang['qb_code']               = 'Kodun mətni';
+$lang['qb_strike']             = 'Pozulmuş şrift';
+$lang['qb_h1']                 = '1 dərəcəli başlıq';
+$lang['qb_h2']                 = '2 dərəcəli başlıq';
+$lang['qb_h3']                 = '3 dərəcəli başlıq';
+$lang['qb_h4']                 = '4 dərəcəli başlıq';
+$lang['qb_h5']                 = '5 dərəcəli başlıq';
+$lang['qb_h']                  = 'Başlıq';
+$lang['qb_hs']                 = 'Başlıq seçimi';
+$lang['qb_hplus']              = 'Daha yüksək dərəcəli başlıq';
+$lang['qb_hminus']             = 'Daha aşağı dərəcəli başlıq (altbaşlıq)';
+$lang['qb_hequal']             = 'Hazırki dərəcəli başlıq';
+$lang['qb_link']               = 'İç link';
+$lang['qb_extlink']            = 'Bayır link';
+$lang['qb_hr']                 = 'Bölücü';
+$lang['qb_ol']                 = 'Nömrələnmiş siyahının element';
+$lang['qb_ul']                 = 'Nömrələnməmiş siyahının element';
+$lang['qb_media']              = 'Şəkillər və başqa fayllar əlavə et';
+$lang['qb_sig']                = 'İmza at';
+$lang['qb_smileys']            = 'Smayllar';
+$lang['qb_chars']              = 'Xüsusi simvollar';
+$lang['upperns']               = 'Ana namespace-ə keç';
+$lang['metaedit']              = 'Meta-məlumatlarda düzəliş et';
+$lang['metasaveerr']           = 'Meta-məlumatları yazan zamanı xəta';
+$lang['metasaveok']            = 'Meta-məlumatlar yadda saxlandı';
+$lang['img_title']             = 'Başlıq:';
+$lang['img_caption']           = 'İmza:';
+$lang['img_date']              = 'Tarix:';
+$lang['img_fname']             = 'Faylın adı:';
+$lang['img_fsize']             = 'Boy:';
+$lang['img_artist']            = 'Şkilin müəllifi:';
+$lang['img_copyr']             = 'Müəllif hüquqları:';
+$lang['img_format']            = 'Format:';
+$lang['img_camera']            = 'Model:';
+$lang['img_keywords']          = 'Açar sözlər:';
+$lang['authtempfail']          = 'İstifadəçilərin autentifikasiyası müvəqqəti dayandırılıb. Əgər bu problem uzun müddət davam edir sə, administrator ilə əlaqə saxlayın.';
+$lang['i_chooselang']          = 'Dili seçin/Language';
+$lang['i_installer']           = 'DokuWiki quraşdırılır';
+$lang['i_wikiname']            = 'wiki-nin adı';
+$lang['i_enableacl']           = 'Haqlar kontrolu siyahısının istifadəsinə icazə ver (tövsiyə edilir)';
+$lang['i_superuser']           = 'Super-istifadəci';
+$lang['i_problems']            = 'Quraşdırma proqramı aşağıdakı problemlər ilə üzləşdi. Davam etmək üçün onları həll etmək lazımdır. ';
+$lang['i_modified']            = 'Təhlükəsizlik baxımından bu proqram ancaq yeni, dəyişməmiş halda olan DokuWiki üzərində işləyir.
+                         Siz ya yüklənmiş quraşdırma paketini yenidən açmalısınız, ya da <a href="http://dokuwiki.org/install">DokuWiki-nin tam quraşdırma instruksiyasına</a> müraciyət etməlisiniz';
+$lang['i_funcna']              = 'PHP-nin <code>%s</code> funksiyası mövcud deyil. Bəlkə, o hansı sa səbəbdən sizin host-unuz tərəfindən blok edilib?';
+$lang['i_phpver']              = 'Sizin PHP-nin versiyası (<code>%s</code>) tələb olunan versiyadan aşagıdır (<code>%s</code>). Quraşdırılmış PHP-nin versiyasını yeniləyin.';
+$lang['i_permfail']            = '<code>%s</code> DokuWiki-yə yazı üçün bağlıdır. Bu qovluğun giriş haqlarını yoxlamaq lazımdır!';
+$lang['i_confexists']          = '<code>%s</code> artıq mövcuddur';
+$lang['i_writeerr']            = '<code>%s</code> yaradıla bilmədi. Faylın/qovluqların giriş haqlarını yaxlamaq lazımdır. Və faylı əl ilə yaradın. ';
+$lang['i_badhash']             = 'dokuwiki.php tanıla bilmir və ya dəyişdirilmişdir (hash=<code>%s</code>)';
+$lang['i_badval']              = '<code>%s</code> - səhv ya boş qiymətdir';
+$lang['i_success']             = 'Konfiqurasiya uğurla başa çatdı. İndi siz install.php faylını silə bilərsiniz.
+                        <a href="doku.php?id=wiki:welcome">Yeni DokuWiki-nizə</a> xoş gəlmişsiniz!';
+$lang['i_failure']             = 'Konfiqurasiya fayllarına məlumat yazan zaman səhvlər tapıldı. Yəgin ki, <a href="doku.php?id=wiki:welcome">yeni DokuWiki-nizi</a> istifadə etmədən öncə, Siz o xətaları əl ilə düzəltməli olacaqsınız.';
+$lang['i_policy']              = 'İlkin giriş haqları siyasəti';
+$lang['i_pol0']                = 'Tam açıq wiki (oxumaq, yazmaq, fayl yükləmək hamıya olar)';
+$lang['i_pol1']                = 'Acıq wiki (oxumaq hamıya olar, yazmaq və fayl yükləmək ancaq üzv olan istifadəçilərə olar)';
+$lang['i_pol2']                = 'Bağlı wiki (uxumaq, yazmaq və yükləmək ancaq üzv olan istifadəçilərə olar)';
+$lang['i_retry']               = 'Cəhdi təkrarla';
+$lang['recent_global']         = '<b>%s</b> namespace-də baş vermiş dəyışıklərə baxırsınız. Siz həmçinin <a href="%s">wiki-də bu yaxında baş vermiş bütün dəyişiklərə</a> baxa bilərsiniz.';
+$lang['years']                 = '%d il əvvəl';
+$lang['months']                = '%d ay əvvəl';
+$lang['weeks']                 = '%d həftə əvvəl';
+$lang['days']                  = '%d gün əvvəl';
+$lang['hours']                 = '%d saat əvvəl';
+$lang['minutes']               = '%d dəqiqə əvvəl';
+$lang['seconds']               = '%d saniyə əvvəl';
+$lang['email_signature_text']  = 'DokuWiki aşağıdakı adresdə yerləşir
+@DOKUWIKIURL@';
diff --git a/wiki/inc/lang/az/locked.txt b/wiki/inc/lang/az/locked.txt
new file mode 100644
index 0000000..8ab9344
--- /dev/null
+++ b/wiki/inc/lang/az/locked.txt
@@ -0,0 +1,3 @@
+====== Səhifə blok edilmişdir ======
+
+Bu səhifə başqa istifadəçi tərəfindən dəyişdirilmə üçün blok edilmişdir. O istifadəçi dəyişdirməni başa çatdırınca ya blokun vaxtı bitincə, Siz gözləməlisiniz.
diff --git a/wiki/inc/lang/az/login.txt b/wiki/inc/lang/az/login.txt
new file mode 100644
index 0000000..e0a559b
--- /dev/null
+++ b/wiki/inc/lang/az/login.txt
@@ -0,0 +1,4 @@
+====== Avtorizasiya ======
+
+Hazırda Siz sistemə daxil olmamısınız. Aşağıdakı formanı istifadə edib sistemə daxil olun. //Qeyd:// cookies qurlu olmalıdır.
+
diff --git a/wiki/inc/lang/az/mailtext.txt b/wiki/inc/lang/az/mailtext.txt
new file mode 100644
index 0000000..97cb68d
--- /dev/null
+++ b/wiki/inc/lang/az/mailtext.txt
@@ -0,0 +1,12 @@
+Sizin DokuWiki-də səhifə yaradılıb ya dəyişdirilib. Ətraflı məlumat:
+
+Tarix                 : @DATE@
+Brauzer               : @BROWSER@
+IP-adres              : @IPADDRESS@
+Host                  : @HOSTNAME@
+Köhnə versiya         : @OLDPAGE@
+Yeni versiya          : @NEWPAGE@
+Dəyişiklərin xülasəsi : @SUMMARY@
+İstifadəçi            : @USER@
+
+@DIFF@
diff --git a/wiki/inc/lang/az/newpage.txt b/wiki/inc/lang/az/newpage.txt
new file mode 100644
index 0000000..c749f20
--- /dev/null
+++ b/wiki/inc/lang/az/newpage.txt
@@ -0,0 +1,3 @@
+====== Bu səhifə hələ mövcud deyil ======
+
+Siz yaradılmamış səhifənin link-ini acmısınız. Əgər sizin giriş haqlarınız çatırsa, siz "Səhifəni yarat" düyməsini sixib, o səhifəni yarada bilərsiniz.
diff --git a/wiki/inc/lang/az/norev.txt b/wiki/inc/lang/az/norev.txt
new file mode 100644
index 0000000..453dad5
--- /dev/null
+++ b/wiki/inc/lang/az/norev.txt
@@ -0,0 +1,4 @@
+====== Belə versiya mövcud deyil ======
+
+Bu səhifənin göstərilmiş versiyası mövcud deyil. Səhifənin bütün versiyalaraının siyahısını görmək üçün, ''Səhifənin tarixçəsi'' düyməsini sıxın.
+
diff --git a/wiki/inc/lang/az/password.txt b/wiki/inc/lang/az/password.txt
new file mode 100644
index 0000000..6424161
--- /dev/null
+++ b/wiki/inc/lang/az/password.txt
@@ -0,0 +1,6 @@
+Salam @FULLNAME@!
+
+Sizin @TITLE@ (@DOKUWIKIURL@) üçün olan məlumatlarınız
+
+İstifadəçi adı  : @LOGIN@
+Şifrə : @PASSWORD@
diff --git a/wiki/inc/lang/az/preview.txt b/wiki/inc/lang/az/preview.txt
new file mode 100644
index 0000000..dbeaa44
--- /dev/null
+++ b/wiki/inc/lang/az/preview.txt
@@ -0,0 +1,4 @@
+====== Baxış ======
+
+Burda daxil elədiyiniz mətnin necə görünəcəyi göstərilir. Qeyd: mətn hələ **yadda saxlanılmayıb!**
+
diff --git a/wiki/inc/lang/az/pwconfirm.txt b/wiki/inc/lang/az/pwconfirm.txt
new file mode 100644
index 0000000..582124a
--- /dev/null
+++ b/wiki/inc/lang/az/pwconfirm.txt
@@ -0,0 +1,9 @@
+Salam @FULLNAME@!
+
+Kimsə @DOKUWIKIURL@ adresində yerləşən @TITLE@ adlı wiki-yə giriş üçün yeni şifrə tələb eləyib.
+
+Əgər o şəxs siz deyildinizsə, bu məktuba fikir verməyin.
+
+Tələbi təsdiq etmək üçün, aşağıdakı link-ə keçin.
+
+@CONFIRM@
diff --git a/wiki/inc/lang/az/read.txt b/wiki/inc/lang/az/read.txt
new file mode 100644
index 0000000..39b31f1
--- /dev/null
+++ b/wiki/inc/lang/az/read.txt
@@ -0,0 +1,2 @@
+Bu səhifəni ancaq oxumaq olar. Siz səhifənin ilkin mətninə baxa bilərsiniz, amma dəyişə bilməzsiniz. Əgər bunun düzgün olmadığını fikirləşirsinizsə onda administrator ilə əlaqə saxlayın.
+
diff --git a/wiki/inc/lang/az/recent.txt b/wiki/inc/lang/az/recent.txt
new file mode 100644
index 0000000..8766d99
--- /dev/null
+++ b/wiki/inc/lang/az/recent.txt
@@ -0,0 +1,5 @@
+====== Son dəyişiklər ======
+
+Bu səhifələr yaxında dəyismişdirlər.
+
+
diff --git a/wiki/inc/lang/az/register.txt b/wiki/inc/lang/az/register.txt
new file mode 100644
index 0000000..eb6386f
--- /dev/null
+++ b/wiki/inc/lang/az/register.txt
@@ -0,0 +1,3 @@
+====== Регистрация нового пользователя ======
+
+Qeydiyyat üçün bütün aşağıdaı xanalari doldurun. **e-mail adresinizin duz olduguna** fikir verin. Əgər şıfrəni əl ilə daxil etməyiniz xaiş olunmursa, onda şifrə e-mail adresinizə göndəriləcək. İstifadəçi adı [[doku>pagename|səhifənin identifikatorunun]] məhdudiyyətlərinə uyğun olmalıdır.
diff --git a/wiki/inc/lang/az/registermail.txt b/wiki/inc/lang/az/registermail.txt
new file mode 100644
index 0000000..b080e9b
--- /dev/null
+++ b/wiki/inc/lang/az/registermail.txt
@@ -0,0 +1,10 @@
+Yeni istifadəçi qeydiyyatdan keçdi. Ətraflı məlumat:
+
+İstifadəçi adı       : @NEWUSER@
+Tam adı  : @NEWNAME@
+E-mail      : @NEWEMAIL@
+
+Tarix        : @DATE@
+Brauzer     : @BROWSER@
+IP adres    : @IPADDRESS@
+Host        : @HOSTNAME@
diff --git a/wiki/inc/lang/az/resendpwd.txt b/wiki/inc/lang/az/resendpwd.txt
new file mode 100644
index 0000000..cc28617
--- /dev/null
+++ b/wiki/inc/lang/az/resendpwd.txt
@@ -0,0 +1,3 @@
+====== Yeni şifrənin göndərilməsi ======
+
+Yeni şifrə əldə etmək üçün aşağıda tələb olunan məlumatları daxil edin. Yeni şifrə sizin istifadəçi adınıza aid olan e-mail adresə göndəriləcək. Aşagıda daxil olunan ad - sizin bu wiki-də olan istifadəçi adınız olmalıdır.
diff --git a/wiki/inc/lang/az/revisions.txt b/wiki/inc/lang/az/revisions.txt
new file mode 100644
index 0000000..7164a99
--- /dev/null
+++ b/wiki/inc/lang/az/revisions.txt
@@ -0,0 +1,3 @@
+====== Səhifənin tarixçəsi ======
+
+Qarşınızda - hazırki sənədin dəyişiklər tarixçəsidir. Əvvəlki versiyaların birinə qayıtmaq üçün, lazım olan versiyanı seçin, ''Səhifəni düzəliş et'' düyməsini sıxın və yaddaşa yazın.
diff --git a/wiki/inc/lang/az/searchpage.txt b/wiki/inc/lang/az/searchpage.txt
new file mode 100644
index 0000000..9bf5a5b
--- /dev/null
+++ b/wiki/inc/lang/az/searchpage.txt
@@ -0,0 +1,4 @@
+====== Axtarış ======
+
+Qarşınızda - axtarışın nəticələridir. @CREATEPAGEINFO@
+
diff --git a/wiki/inc/lang/az/showrev.txt b/wiki/inc/lang/az/showrev.txt
new file mode 100644
index 0000000..dd39870
--- /dev/null
+++ b/wiki/inc/lang/az/showrev.txt
@@ -0,0 +1,2 @@
+**Bu - sənədin köhnə versiyasıdır!**
+----
diff --git a/wiki/inc/lang/az/stopwords.txt b/wiki/inc/lang/az/stopwords.txt
new file mode 100644
index 0000000..04eb312
--- /dev/null
+++ b/wiki/inc/lang/az/stopwords.txt
@@ -0,0 +1,64 @@
+# This is a list of words the indexer ignores, one word per line
+# When you edit this file be sure to use UNIX line endings (single newline)
+# No need to include words shorter than 3 chars - these are ignored anyway
+amma
+arada
+arasında
+başqa
+başqalar
+başqaların
+başqanın
+belə
+birdən
+bugün
+bunu
+burada
+bəlkə
+cəmi
+dedi
+dedilər
+dedim
+dediniz
+demək
+deyəsən
+görə
+hamını
+hansı
+hansılar
+hansınız
+həmçinin
+həmişə
+hərdən
+hətta
+həyat
+indi
+lazım
+lazımdır
+məncə
+məni
+niyə
+nəyi
+olacaq
+olar
+oldu
+oldum
+olmaq
+olmaz
+olub
+onda
+onlar
+onları
+onun
+ozunun
+qabaq
+quya
+sabağ
+sizcə
+sizi
+sonra
+sözsüz
+şübhəsiz
+səni
+yaxşı
+yenə
+əgər
diff --git a/wiki/inc/lang/az/updateprofile.txt b/wiki/inc/lang/az/updateprofile.txt
new file mode 100644
index 0000000..569e425
--- /dev/null
+++ b/wiki/inc/lang/az/updateprofile.txt
@@ -0,0 +1,5 @@
+====== Profili yenilə ======
+
+İstədiyiniz xanaları dəyiştirin. İstifadəşi adı dəyiştirilə bilməz.
+
+
diff --git a/wiki/inc/lang/az/uploadmail.txt b/wiki/inc/lang/az/uploadmail.txt
new file mode 100644
index 0000000..88103fd
--- /dev/null
+++ b/wiki/inc/lang/az/uploadmail.txt
@@ -0,0 +1,10 @@
+Sizin DokuWiki-yə fayl yuklənildi. Ətraflı məlumat:
+
+Fayl        : @MEDIA@
+Tarix       : @DATE@
+Brauzer     : @BROWSER@
+IP Adres    : @IPADDRESS@
+Host        : @HOSTNAME@
+Həcm        : @SIZE@
+MIME Növ    : @MIME@
+İstifadəçi  : @USER@
diff --git a/wiki/inc/lang/az/wordblock.txt b/wiki/inc/lang/az/wordblock.txt
new file mode 100644
index 0000000..ec8b102
--- /dev/null
+++ b/wiki/inc/lang/az/wordblock.txt
@@ -0,0 +1,3 @@
+====== SPAM-ın qarşısı alındı ======
+
+Sizin dəyişiklər **yaddaşa saxlanmadı**, çünki onların içində bir və ya daha çox içazəsiz sözlər var idi. Əgər siz wiki-yə spam əlavə etmək istəyirdinizsə, onda utanmırsız?! Əgər siz bunu səhv hesab edirsinizsə, onda administrator ilə əlaqə saxlayın.
diff --git a/wiki/inc/lang/be/admin.txt b/wiki/inc/lang/be/admin.txt
new file mode 100644
index 0000000..40fc5fb
--- /dev/null
+++ b/wiki/inc/lang/be/admin.txt
@@ -0,0 +1,3 @@
+====== Кіраванне ======
+
+Ніжэй вы зможаце знайсці спіс адміністрацыйных аперацый, даступных у «ДокуВікі».
\ No newline at end of file
diff --git a/wiki/inc/lang/be/adminplugins.txt b/wiki/inc/lang/be/adminplugins.txt
new file mode 100644
index 0000000..c5aa5d7
--- /dev/null
+++ b/wiki/inc/lang/be/adminplugins.txt
@@ -0,0 +1 @@
+===== Дадатковыя ўбудовы =====
\ No newline at end of file
diff --git a/wiki/inc/lang/bg/admin.txt b/wiki/inc/lang/bg/admin.txt
new file mode 100644
index 0000000..d3c14a0
--- /dev/null
+++ b/wiki/inc/lang/bg/admin.txt
@@ -0,0 +1,3 @@
+====== Администриране ======
+
+Отдолу ще намерите списъка с администраторските задачи в DokuWiki.
\ No newline at end of file
diff --git a/wiki/inc/lang/bg/adminplugins.txt b/wiki/inc/lang/bg/adminplugins.txt
new file mode 100644
index 0000000..df24b05
--- /dev/null
+++ b/wiki/inc/lang/bg/adminplugins.txt
@@ -0,0 +1 @@
+===== Допълнителни приставки =====
\ No newline at end of file
diff --git a/wiki/inc/lang/bg/backlinks.txt b/wiki/inc/lang/bg/backlinks.txt
new file mode 100644
index 0000000..e501614
--- /dev/null
+++ b/wiki/inc/lang/bg/backlinks.txt
@@ -0,0 +1,3 @@
+====== Какво сочи насам ======
+
+Това е списък на страниците, които препращат обратно към текущата страница.
diff --git a/wiki/inc/lang/bg/conflict.txt b/wiki/inc/lang/bg/conflict.txt
new file mode 100644
index 0000000..8c62a37
--- /dev/null
+++ b/wiki/inc/lang/bg/conflict.txt
@@ -0,0 +1,6 @@
+====== Съществува по-нова версия ======
+
+Съществува по-нова версия на документа, който сте редактирали. Това се случва когато друг потребител е променил документа докато сте го редактирали.
+
+Разгледайте внимателно разликите, след това решете коя версия да бъде запазена. Ако натиснете ''Запис'', ще бъде запазена вашата версия. Натиснете ли ''Отказ'', ще бъде запазена текущата версия.
+
diff --git a/wiki/inc/lang/bg/denied.txt b/wiki/inc/lang/bg/denied.txt
new file mode 100644
index 0000000..bd695d4
--- /dev/null
+++ b/wiki/inc/lang/bg/denied.txt
@@ -0,0 +1,4 @@
+====== Отказан достъп ======
+
+Нямате достатъчно права, за да продължите.
+
diff --git a/wiki/inc/lang/bg/diff.txt b/wiki/inc/lang/bg/diff.txt
new file mode 100644
index 0000000..a22031e
--- /dev/null
+++ b/wiki/inc/lang/bg/diff.txt
@@ -0,0 +1,3 @@
+====== Разлики ======
+
+Тук са показани разликите между избраната и текущата версия на страницата.
diff --git a/wiki/inc/lang/bg/draft.txt b/wiki/inc/lang/bg/draft.txt
new file mode 100644
index 0000000..a592011
--- /dev/null
+++ b/wiki/inc/lang/bg/draft.txt
@@ -0,0 +1,6 @@
+====== Намерена чернова ======
+
+Последната редакционна сесия на страницата не е завършена правилно. Dokuwiki автоматично запазва чернова по време на редактирането, която можете да ползвате сега, за да продължите работата си. Отдолу може да видите данните, които бяха запазени от последната сесия.
+
+Моля решете, дали искате да //възстановите// последната си редакционна сесия, //изтриете// автоматично запазената чернова или //откажете// редакцията.
+
diff --git a/wiki/inc/lang/bg/edit.txt b/wiki/inc/lang/bg/edit.txt
new file mode 100644
index 0000000..086d997
--- /dev/null
+++ b/wiki/inc/lang/bg/edit.txt
@@ -0,0 +1,2 @@
+Редактирайте и натиснете ''Запис''. За информация относно ползвания синтаксис прочетете [[wiki:syntax]]. Моля, редактирайте само когато може да **подобрите** съдържанието. Ако ще пробвате разни неща, може да експериментирате в [[playground:playground|пясъчника]].
+
diff --git a/wiki/inc/lang/bg/editrev.txt b/wiki/inc/lang/bg/editrev.txt
new file mode 100644
index 0000000..ba97f25
--- /dev/null
+++ b/wiki/inc/lang/bg/editrev.txt
@@ -0,0 +1,2 @@
+**Заредена е стара версия на документа!** Ако я запазите, ще създадете нова версия с текущите данни.
+----
diff --git a/wiki/inc/lang/bg/index.txt b/wiki/inc/lang/bg/index.txt
new file mode 100644
index 0000000..7dabac6
--- /dev/null
+++ b/wiki/inc/lang/bg/index.txt
@@ -0,0 +1,4 @@
+====== Индекс ======
+
+Това е списък на всички налични страници подредени по [[doku>namespaces|именни пространства]].
+
diff --git a/wiki/inc/lang/bg/install.html b/wiki/inc/lang/bg/install.html
new file mode 100644
index 0000000..8763e4d
--- /dev/null
+++ b/wiki/inc/lang/bg/install.html
@@ -0,0 +1,15 @@
+<p>Страницата помага при инсталиране за първи път и настройване на
+<a href="http://dokuwiki.org">Dokuwiki</a>.  Повече информация
+за инсталатора ще намерите в <a href="http://dokuwiki.org/installer">документацията му</a>.</p>
+
+<p>Dokuwiki ползва обикновени файлове за съхраняване на страниците и информацията свързана с тях (примерно картинки, търсения, стари версии, и др.).
+За да функционира нормално DokuWiki
+<strong>трябва</strong> да има право за писане в директориите, които съдържат тези
+файлове. Инсталаторът не може да настройва правата на директориите.
+Вие трябва да направите това директно от командният ред или ако ползвате хостинг през FTP или контролния панела на хоста (примерно cPanel).</p>
+
+<p>Инсталаторът ще настрои вашата DokuWiki конфигурация на
+<abbr title="списъка за достъп">ACL</abbr>, което ще позволи на администратора да се впише и ползва администраторското меню в DokuWiki за инсталиране на приставки, контрол на потребителите, управление на достъпа до страниците и промяна на останалите настройки. Това не е необходимо за функционирането на DokuWiki, но прави администрирането по-лесно.</p>
+
+<p>Опитните потребители и потребителите със специални изисквания към настройките имат на разположение допълнителна информация относно <a href="http://dokuwiki.org/install">инсталирането</a>
+и <a href="http://dokuwiki.org/config">настройването</a>.</p>
diff --git a/wiki/inc/lang/bg/jquery.ui.datepicker.js b/wiki/inc/lang/bg/jquery.ui.datepicker.js
new file mode 100644
index 0000000..cb066a4
--- /dev/null
+++ b/wiki/inc/lang/bg/jquery.ui.datepicker.js
@@ -0,0 +1,38 @@
+/* Bulgarian initialisation for the jQuery UI date picker plugin. */
+/* Written by Stoyan Kyosev (http://svest.org). */
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "../widgets/datepicker" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery.datepicker );
+	}
+}( function( datepicker ) {
+
+datepicker.regional.bg = {
+	closeText: "затвори",
+	prevText: "&#x3C;назад",
+	nextText: "напред&#x3E;",
+	nextBigText: "&#x3E;&#x3E;",
+	currentText: "днес",
+	monthNames: [ "Януари","Февруари","Март","Април","Май","Юни",
+	"Юли","Август","Септември","Октомври","Ноември","Декември" ],
+	monthNamesShort: [ "Яну","Фев","Мар","Апр","Май","Юни",
+	"Юли","Авг","Сеп","Окт","Нов","Дек" ],
+	dayNames: [ "Неделя","Понеделник","Вторник","Сряда","Четвъртък","Петък","Събота" ],
+	dayNamesShort: [ "Нед","Пон","Вто","Сря","Чет","Пет","Съб" ],
+	dayNamesMin: [ "Не","По","Вт","Ср","Че","Пе","Съ" ],
+	weekHeader: "Wk",
+	dateFormat: "dd.mm.yy",
+	firstDay: 1,
+	isRTL: false,
+	showMonthAfterYear: false,
+	yearSuffix: "" };
+datepicker.setDefaults( datepicker.regional.bg );
+
+return datepicker.regional.bg;
+
+} ) );
diff --git a/wiki/inc/lang/bg/lang.php b/wiki/inc/lang/bg/lang.php
new file mode 100644
index 0000000..fd4677c
--- /dev/null
+++ b/wiki/inc/lang/bg/lang.php
@@ -0,0 +1,337 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Nikolay Vladimirov <nikolay@vladimiroff.com>
+ * @author Viktor Usunov <usun0v@mail.bg>
+ * @author Kiril <neohidra@gmail.com>
+ * @author Ivan Peltekov <ivan.peltekov@abv.bg>
+ */
+$lang['encoding']              = 'utf-8';
+$lang['direction']             = 'ltr';
+$lang['doublequoteopening']    = '„';
+$lang['doublequoteclosing']    = '“';
+$lang['singlequoteopening']    = '‘';
+$lang['singlequoteclosing']    = '’';
+$lang['apostrophe']            = '’';
+$lang['btn_edit']              = 'Редактиране';
+$lang['btn_source']            = 'Преглед на кода';
+$lang['btn_show']              = 'Преглед на страницата';
+$lang['btn_create']            = 'Създаване на страница';
+$lang['btn_search']            = 'Търсене';
+$lang['btn_save']              = 'Запис';
+$lang['btn_preview']           = 'Преглед';
+$lang['btn_top']               = 'Към началото';
+$lang['btn_newer']             = '<< по-нови';
+$lang['btn_older']             = 'по-стари >>';
+$lang['btn_revs']              = 'История';
+$lang['btn_recent']            = 'Скорошни промени';
+$lang['btn_upload']            = 'Качване';
+$lang['btn_cancel']            = 'Отказ';
+$lang['btn_index']             = 'Индекс';
+$lang['btn_secedit']           = 'Редактиране';
+$lang['btn_login']             = 'Вписване';
+$lang['btn_logout']            = 'Отписване';
+$lang['btn_admin']             = 'Настройки';
+$lang['btn_update']            = 'Актуализиране';
+$lang['btn_delete']            = 'Изтриване';
+$lang['btn_back']              = 'Назад';
+$lang['btn_backlink']          = 'Какво сочи насам';
+$lang['btn_subscribe']         = 'Абонаменти';
+$lang['btn_profile']           = 'Профил';
+$lang['btn_reset']             = 'Изчистване';
+$lang['btn_resendpwd']         = 'Задаване на нова парола';
+$lang['btn_draft']             = 'Редактиране на черновата';
+$lang['btn_recover']           = 'Възстановяване на черновата';
+$lang['btn_draftdel']          = 'Изтриване на черновата';
+$lang['btn_revert']            = 'Възстановяване';
+$lang['btn_register']          = 'Регистриране';
+$lang['btn_apply']             = 'Прилагане';
+$lang['btn_media']             = 'Диспечер на файлове';
+$lang['btn_deleteuser']        = 'Изтриване на профила';
+$lang['btn_img_backto']        = 'Назад към %s';
+$lang['btn_mediaManager']      = 'Преглед в диспечера на файлове';
+$lang['loggedinas']            = 'Вписани сте като:';
+$lang['user']                  = 'Потребител';
+$lang['pass']                  = 'Парола';
+$lang['newpass']               = 'Нова парола';
+$lang['oldpass']               = 'Потвърждение на текуща парола';
+$lang['passchk']               = 'още веднъж';
+$lang['remember']              = 'Запомни ме';
+$lang['fullname']              = 'Истинско име';
+$lang['email']                 = 'Електронна поща';
+$lang['profile']               = 'Потребителски профил';
+$lang['badlogin']              = 'Грешно потребителско име или парола.';
+$lang['badpassconfirm']        = 'За съжаление паролата е грешна';
+$lang['minoredit']             = 'Промените са незначителни';
+$lang['draftdate']             = 'Черновата е автоматично записана на';
+$lang['nosecedit']             = 'Страницата бе междувременно променена, презареждане на страницата поради неактуална информация.';
+$lang['regmissing']            = 'Моля, попълнете всички полета.';
+$lang['reguexists']            = 'Вече съществува потребител с избраното име.';
+$lang['regsuccess']            = 'Потребителят е създаден, а паролата е пратена по електронната поща.';
+$lang['regsuccess2']           = 'Потребителят е създаден.';
+$lang['regfail']               = 'Потребителят не може да бъде създаден.';
+$lang['regmailfail']           = 'Изглежда, че има проблем с пращането на писмото с паролата. Моля, свържете се с администратора!';
+$lang['regbadmail']            = 'Въведеният адрес изглежда невалиден - ако мислите, че това е грешка, свържете се с администратора.';
+$lang['regbadpass']            = 'Двете въведени пароли не съвпадат, моля опитайте отново.';
+$lang['regpwmail']             = 'Паролата ви за DokuWiki';
+$lang['reghere']               = 'Все още нямате профил? Направете си';
+$lang['profna']                = 'Wiki-то не поддържа промяна на профила';
+$lang['profnochange']          = 'Няма промени.';
+$lang['profnoempty']           = 'Въвеждането на име и имейл е задължително';
+$lang['profchanged']           = 'Потребителският профил е обновен успешно.';
+$lang['profnodelete']          = 'Изтриването на потребители в това wiki не е възможно';
+$lang['profdeleteuser']        = 'Изтриване на профила';
+$lang['profdeleted']           = 'Вашият профил е премахнат от това wiki ';
+$lang['profconfdelete']        = 'Искам да изтрия профила си от това wiki. <br/>  Веднъж изтрит, профилът не може да бъде възстановен!';
+$lang['profconfdeletemissing'] = 'Не сте поставили отметка в кутията потвърждение';
+$lang['proffail']              = 'Потребителският профил не може да бъде актуализиран.';
+$lang['pwdforget']             = 'Забравили сте паролата си? Получете нова';
+$lang['resendna']              = 'Wiki-то не поддържа повторно пращане на паролата.';
+$lang['resendpwd']             = 'Задаване на нова парола за';
+$lang['resendpwdmissing']      = 'Моля, попълнете всички полета.';
+$lang['resendpwdnouser']       = 'Потребителят не е намерен в базата от данни.';
+$lang['resendpwdbadauth']      = 'Кодът за потвърждение е невалиден. Проверете дали сте използвали целия линк за потвърждение.';
+$lang['resendpwdconfirm']      = 'Линк за потвърждение е пратен по електронната поща.';
+$lang['resendpwdsuccess']      = 'Новата ви паролата е пратена по електронната поща.';
+$lang['license']               = 'Ако не е посочено друго, съдържанието на Wiki-то е лицензирано под следния лиценз:';
+$lang['licenseok']             = 'Бележка: Редактирайки страницата, Вие се съгласявате да лицензирате промените (които сте направили) под следния лиценз:';
+$lang['searchmedia']           = 'Търсене на файл: ';
+$lang['searchmedia_in']        = 'Търсене в %s';
+$lang['txt_upload']            = 'Изберете файл за качване:';
+$lang['txt_filename']          = 'Качи като (незадължително):';
+$lang['txt_overwrt']           = 'Презапиши съществуващите файлове';
+$lang['maxuploadsize']         = 'Макс. размер за отделните файлове е %s.';
+$lang['lockedby']              = 'В момента е заключена от:';
+$lang['lockexpire']            = 'Ще бъде отключена на:';
+$lang['js']['willexpire']      = 'Страницата ще бъде отключена за редактиране след минута.\nЗа предотвратяване на конфликти, ползвайте бутона "Преглед", за рестартиране на брояча за заключване.';
+$lang['js']['notsavedyet']     = 'Незаписаните промени ще бъдат загубени. Желаете ли да продължите?';
+$lang['js']['searchmedia']     = 'Търсене на файлове';
+$lang['js']['keepopen']        = 'Без затваряне на прозореца след избор';
+$lang['js']['hidedetails']     = 'Без подробности';
+$lang['js']['mediatitle']      = 'Настройки на препратката';
+$lang['js']['mediadisplay']    = 'Тип на препратката';
+$lang['js']['mediaalign']      = 'Подреждане';
+$lang['js']['mediasize']       = 'Размер на изображението';
+$lang['js']['mediatarget']     = 'Препращане към';
+$lang['js']['mediaclose']      = 'Затваряне';
+$lang['js']['mediainsert']     = 'Вмъкване';
+$lang['js']['mediadisplayimg'] = 'Показвай изображението.';
+$lang['js']['mediadisplaylnk'] = 'Показвай само препратката.';
+$lang['js']['mediasmall']      = 'Малка версия';
+$lang['js']['mediamedium']     = 'Средна версия';
+$lang['js']['medialarge']      = 'Голяма версия';
+$lang['js']['mediaoriginal']   = 'Оригинална версия';
+$lang['js']['medialnk']        = 'Препратка към подробна страница';
+$lang['js']['mediadirect']     = 'Директна препратка към оригинала';
+$lang['js']['medianolnk']      = 'Без препратка';
+$lang['js']['medianolink']     = 'Без препратка към изображението';
+$lang['js']['medialeft']       = 'Подреди изображението отляво.';
+$lang['js']['mediaright']      = 'Подреди изображението отдясно.';
+$lang['js']['mediacenter']     = 'Подреди изображението по средата.';
+$lang['js']['medianoalign']    = 'Без подреждане.';
+$lang['js']['nosmblinks']      = 'Връзките към Windows shares работят само под Internet Explorer.<br />Можете да копирате и поставите връзката.';
+$lang['js']['linkwiz']         = 'Помощник за препратки';
+$lang['js']['linkto']          = 'Препратка към: ';
+$lang['js']['del_confirm']     = 'Да бъдат ли изтрити избраните елементи?';
+$lang['js']['restore_confirm'] = 'Наистина ли желаете да бъде възстановена тази версия?';
+$lang['js']['media_diff']      = 'Преглед на разликите:';
+$lang['js']['media_diff_both'] = 'Един до друг';
+$lang['js']['media_diff_opacity'] = 'Наслагване (и прозиране)';
+$lang['js']['media_diff_portions'] = 'По половинка';
+$lang['js']['media_select']    = 'Изберете файлове...';
+$lang['js']['media_upload_btn'] = 'Качване';
+$lang['js']['media_done_btn']  = 'Готово';
+$lang['js']['media_drop']      = 'Влачете и пуснете файлове тук, за да бъдат качени';
+$lang['js']['media_cancel']    = 'премахване';
+$lang['js']['media_overwrt']   = 'Презапиши съществуващите файлове';
+$lang['rssfailed']             = 'Възникна грешка при получаването на емисията: ';
+$lang['nothingfound']          = 'Нищо не е открито.';
+$lang['mediaselect']           = 'Файлове';
+$lang['uploadsucc']            = 'Качването е успешно';
+$lang['uploadfail']            = 'Качването се провали. Може би поради грешни права?';
+$lang['uploadwrong']           = 'Качването е отказано. Файлово разширение е забранено!';
+$lang['uploadexist']           = 'Файлът вече съществува. Нищо не е направено.';
+$lang['uploadbadcontent']      = 'Каченото съдържание не съответства на файлово разширение %s .';
+$lang['uploadspam']            = 'Качването е блокирано от SPAM списъка.';
+$lang['uploadxss']             = 'Качването е блокирано, поради възможно зловредно съдържание.';
+$lang['uploadsize']            = 'Файлът за качване е прекалено голям. (макс. %s)';
+$lang['deletesucc']            = 'Файлът "%s" бе изтрит.';
+$lang['deletefail']            = '"%s" не може да бъде изтрит - проверете правата.';
+$lang['mediainuse']            = 'Файлът "%s" не бе изтрит - все още се ползва.';
+$lang['namespaces']            = 'Именни пространства';
+$lang['mediafiles']            = 'Налични файлове в';
+$lang['accessdenied']          = 'Нямате необходимите права за преглеждане на страницата.';
+$lang['mediausage']            = 'Ползвайте следния синтаксис, за да упоменете файла:';
+$lang['mediaview']             = 'Преглед на оригиналния файл';
+$lang['mediaroot']             = 'root';
+$lang['mediaupload']           = 'Качете файл в текущото именно пространство. За създаване на подименно пространство, добавете име преди това на файла като ги разделите с двоеточие в полето "Качи като"';
+$lang['mediaextchange']        = 'Разширението на файла е сменено от .%s на .%s!';
+$lang['reference']             = 'Връзки за';
+$lang['ref_inuse']             = 'Файлът не може да бъде изтрит, защото все още се ползва от следните страници:';
+$lang['ref_hidden']            = 'Някои връзки са към страници, които нямате права да четете';
+$lang['hits']                  = 'Съвпадения';
+$lang['quickhits']             = 'Съвпадащи имена на страници';
+$lang['toc']                   = 'Съдържание';
+$lang['current']               = 'текуща';
+$lang['yours']                 = 'Вашата версия';
+$lang['diff']                  = 'Преглед на разликите с текущата версия';
+$lang['diff2']                 = 'Показване на разликите между избрани версии';
+$lang['difflink']              = 'Препратка към сравнението на версиите';
+$lang['diff_type']             = 'Преглед на разликите:';
+$lang['diff_inline']           = 'Вграден';
+$lang['diff_side']             = 'Един до друг';
+$lang['diffprevrev']           = 'Предходна версия';
+$lang['diffnextrev']           = 'Следваща версия';
+$lang['difflastrev']           = 'Последна версия';
+$lang['line']                  = 'Ред';
+$lang['breadcrumb']            = 'Следа:';
+$lang['youarehere']            = 'Намирате се в:';
+$lang['lastmod']               = 'Последна промяна:';
+$lang['by']                    = 'от';
+$lang['deleted']               = 'изтрита';
+$lang['created']               = 'създадена';
+$lang['restored']              = 'възстановена предишна версия (%s)';
+$lang['external_edit']         = 'външна редакция';
+$lang['summary']               = 'Обобщение';
+$lang['noflash']               = 'Необходим е <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> за изобразяване на съдържанието.';
+$lang['download']              = 'Изтегляне на фрагмент';
+$lang['tools']                 = 'Инструменти';
+$lang['user_tools']            = 'Инструменти за потребители';
+$lang['site_tools']            = 'Инструменти за сайта';
+$lang['page_tools']            = 'Инструменти за страници';
+$lang['skip_to_content']       = 'към съдържанието';
+$lang['sidebar']               = 'Странична лента';
+$lang['mail_newpage']          = 'добавена страница: ';
+$lang['mail_changed']          = 'променена страница: ';
+$lang['mail_subscribe_list']   = 'променени страници в именно пространство: ';
+$lang['mail_new_user']         = 'нов потребител: ';
+$lang['mail_upload']           = 'качен файл: ';
+$lang['changes_type']          = 'Преглед на променените';
+$lang['pages_changes']         = 'Страници';
+$lang['media_changes']         = 'Файлове';
+$lang['both_changes']          = 'Страници и файлове';
+$lang['qb_bold']               = 'Удебелен текст';
+$lang['qb_italic']             = 'Курсив текст';
+$lang['qb_underl']             = 'Подчертан текст';
+$lang['qb_code']               = 'Код';
+$lang['qb_strike']             = 'Зачеркнат текст';
+$lang['qb_h1']                 = 'Заглавие от 1 ниво';
+$lang['qb_h2']                 = 'Заглавие от 2 ниво';
+$lang['qb_h3']                 = 'Заглавие от 3 ниво';
+$lang['qb_h4']                 = 'Заглавие от 4 ниво';
+$lang['qb_h5']                 = 'Заглавие от 5 ниво';
+$lang['qb_h']                  = 'Заглавие';
+$lang['qb_hs']                 = 'Изберете заглавие';
+$lang['qb_hplus']              = 'Надзаглавие';
+$lang['qb_hminus']             = 'Подзаглавие';
+$lang['qb_hequal']             = 'Заглавие от същото ниво';
+$lang['qb_link']               = 'Вътрешна препратка';
+$lang['qb_extlink']            = 'Външна препратка';
+$lang['qb_hr']                 = 'Хоризонтална линия';
+$lang['qb_ol']                 = 'Номериран списък';
+$lang['qb_ul']                 = 'Неномериран списък';
+$lang['qb_media']              = 'Добавяне на изображения и други файлове';
+$lang['qb_sig']                = 'Вмъкване на подпис';
+$lang['qb_smileys']            = 'Усмивчици';
+$lang['qb_chars']              = 'Специални знаци';
+$lang['upperns']               = 'към майчиното именно пространство';
+$lang['metaedit']              = 'Редактиране на метаданни';
+$lang['metasaveerr']           = 'Записването на метаданните се провали';
+$lang['metasaveok']            = 'Метаданните са запазени успешно';
+$lang['img_title']             = 'Заглавие:';
+$lang['img_caption']           = 'Надпис:';
+$lang['img_date']              = 'Дата:';
+$lang['img_fname']             = 'Име на файла:';
+$lang['img_fsize']             = 'Размер:';
+$lang['img_artist']            = 'Фотограф:';
+$lang['img_copyr']             = 'Авторско право:';
+$lang['img_format']            = 'Формат:';
+$lang['img_camera']            = 'Фотоапарат:';
+$lang['img_keywords']          = 'Ключови думи:';
+$lang['img_width']             = 'Ширина:';
+$lang['img_height']            = 'Височина:';
+$lang['subscr_subscribe_success'] = '%s е добавен към списъка с абониралите се за %s';
+$lang['subscr_subscribe_error'] = 'Грешка при добавянето на %s към списъка с абониралите се за %s';
+$lang['subscr_subscribe_noaddress'] = 'Добавянето ви към списъка с абонати не е възможно поради липсата на свързан адрес (имейл) с профила ви.';
+$lang['subscr_unsubscribe_success'] = '%s е премахнат от списъка с абониралите се за %s';
+$lang['subscr_unsubscribe_error'] = 'Грешка при премахването на %s от списъка с абониралите се за %s';
+$lang['subscr_already_subscribed'] = '%s е вече абониран за %s';
+$lang['subscr_not_subscribed'] = '%s не е абониран за %s';
+$lang['subscr_m_not_subscribed'] = 'Не сте абониран за текущата страницата или именно пространство.';
+$lang['subscr_m_new_header']   = 'Добави абонамент';
+$lang['subscr_m_current_header'] = 'Текущи абонаменти';
+$lang['subscr_m_unsubscribe']  = 'Прекратяване на абонамента';
+$lang['subscr_m_subscribe']    = 'Абониране';
+$lang['subscr_m_receive']      = 'Получаване';
+$lang['subscr_style_every']    = 'на имейл при всяка промяна';
+$lang['subscr_style_digest']   = 'на имейл с обобщение на промените във всяка страница (всеки %.2f дни)';
+$lang['subscr_style_list']     = 'на списък с променените страници от последния имейл (всеки %.2f дни)';
+$lang['authtempfail']          = 'Удостоверяването на потребители не е възможно за момента. Ако продължи дълго, моля уведомете администратора на Wiki страницата.';
+$lang['i_chooselang']          = 'Изберете вашия език';
+$lang['i_installer']           = 'Инсталатор на DokuWiki';
+$lang['i_wikiname']            = 'Име на Wiki-то';
+$lang['i_enableacl']           = 'Ползване на списък за достъп (ACL) [препоръчително]';
+$lang['i_superuser']           = 'Супер потребител';
+$lang['i_problems']            = 'Открити са проблеми, които възпрепятстват инсталирането. Ще можете да продължите след като отстраните долуизброените проблеми.';
+$lang['i_modified']            = 'Поради мерки за сигурност инсталаторът работи само с нови и непроменени инсталационни файлове.
+								  Трябва да разархивирате отново файловете от сваления архив или да се посъветвате с <a href="http://dokuwiki.org/install">Инструкциите за инсталиране на Dokuwiki</a>.';
+$lang['i_funcna']              = 'PHP функцията <code>%s</code> не е достъпна. Може би е забранена от доставчика на хостинг.';
+$lang['i_phpver']              = 'Инсталираната версия <code>%s</code> на PHP е по-стара от необходимата <code>%s</code>. Актуализирайте PHP инсталацията.';
+$lang['i_mbfuncoverload']      = 'Необходимо е да изключите mbstring.func_overload в php.ini за да може DokuWiki да стартира.';
+$lang['i_permfail']            = '<code>%s</code> не е достъпна за писане от DokuWiki. Трябва да промените правата за достъп до директорията!';
+$lang['i_confexists']          = '<code>%s</code> вече съществува';
+$lang['i_writeerr']            = '<code>%s</code> не можа да бъде създаден. Трябва да проверите правата за достъп до директорията/файла и да създадете файла ръчно.';
+$lang['i_badhash']             = 'Файлът dokuwiki.php не може да бъде разпознат или е променен (hash=<code>%s</code>)';
+$lang['i_badval']              = '<code>%s</code> - непозволена или празна стойност';
+$lang['i_success']             = 'Настройването приключи успешно. Вече можете да изтриете файла install.php. Продължете към <a href="doku.php?id=wiki:welcome">Вашето новата инсталация на DokuWiki</a>.';
+$lang['i_failure']             = 'Възникнаха грешки при записването на файловете с настройки. Вероятно ще се наложи да ги поправите ръчно,
+                                  за да можете да ползвате <a href="doku.php?id=wiki:welcome">Вашето ново DokuWiki</a>.';
+$lang['i_policy']              = 'Първоначална политика за достъп';
+$lang['i_pol0']                = 'Отворено Wiki (всеки може да чете, пише и качва)';
+$lang['i_pol1']                = 'Публично Wiki (всеки може да чете, само регистрирани пишат и качват)';
+$lang['i_pol2']                = 'Затворено Wiki (само регистрирани четат, пишат и качват)';
+$lang['i_allowreg']            = 'Разрешете на потребителите за се регистрират сами';
+$lang['i_retry']               = 'Повторен опит';
+$lang['i_license']             = 'Моля, изберете лиценз под който желаете да публикувате съдържанието:';
+$lang['i_license_none']        = 'Без показване на информация относно лиценза';
+$lang['i_pop_field']           = 'Моля, помогнете за усъвършенстването на DokuWiki:';
+$lang['i_pop_label']           = 'Изпращане на анонимна информация до разработчиците на DokuWiki, веднъж седмично';
+$lang['recent_global']         = 'В момента преглеждате промените в именно пространство <b>%s</b>. Може да прегледате и <a href="%s">промените в цялото Wiki</a>.';
+$lang['years']                 = 'преди %d години';
+$lang['months']                = 'преди %d месеца';
+$lang['weeks']                 = 'преди %d седмици';
+$lang['days']                  = 'преди %d дни';
+$lang['hours']                 = 'преди %d часа';
+$lang['minutes']               = 'преди %d минути';
+$lang['seconds']               = 'преди %d секунди';
+$lang['wordblock']             = 'Направените от Вас промени не са съхранени, защото съдържат забранен текст (SPAM).';
+$lang['media_uploadtab']       = 'Качване';
+$lang['media_searchtab']       = 'Търсене';
+$lang['media_file']            = 'Файл';
+$lang['media_viewtab']         = 'Преглед';
+$lang['media_edittab']         = 'Редактиране';
+$lang['media_historytab']      = 'История';
+$lang['media_list_thumbs']     = 'Миниатюри';
+$lang['media_list_rows']       = 'Редове';
+$lang['media_sort_name']       = 'Име';
+$lang['media_sort_date']       = 'Дата';
+$lang['media_namespaces']      = 'Изберете:';
+$lang['media_files']           = 'Файлове в %s';
+$lang['media_upload']          = 'Качване в %s';
+$lang['media_search']          = 'Търсене в %s';
+$lang['media_view']            = '%s';
+$lang['media_viewold']         = '%s в %s';
+$lang['media_edit']            = 'Редактиране на %s';
+$lang['media_history']         = 'История на %s';
+$lang['media_meta_edited']     = 'редактиране на метаданните';
+$lang['media_perm_read']       = 'За съжаление нямате достатъчно права, за да можете да прочетете файла.';
+$lang['media_perm_upload']     = 'За съжаление нямате достатъчно права, за да можете да качите файла.';
+$lang['media_update']          = 'Качване на нова версия';
+$lang['media_restore']         = 'Възстановяване на тази версия';
+$lang['currentns']             = 'Текущо именно пространство';
+$lang['searchresult']          = 'Резултати от търсенето';
+$lang['plainhtml']             = 'Обикновен HTML';
+$lang['email_signature_text'] = 'Писмото е генерирано от DokuWiki на адрес
+@DOKUWIKIURL@';
diff --git a/wiki/inc/lang/bg/locked.txt b/wiki/inc/lang/bg/locked.txt
new file mode 100644
index 0000000..7cdfba7
--- /dev/null
+++ b/wiki/inc/lang/bg/locked.txt
@@ -0,0 +1,3 @@
+====== Страницата е заключена ======
+
+В момента страницата е заключена за редактиране от друг потребител. Трябва да изчакате потребителя да приключи с редактирането на страницата или автоматичното отключване на страницата.
diff --git a/wiki/inc/lang/bg/login.txt b/wiki/inc/lang/bg/login.txt
new file mode 100644
index 0000000..e5061c3
--- /dev/null
+++ b/wiki/inc/lang/bg/login.txt
@@ -0,0 +1,3 @@
+====== Вписване ======
+
+Не сте се вписали! Въведете данните си за удостоверяване отдолу, за да го направите. Бисквитките (cookies) трябва да са включени.
diff --git a/wiki/inc/lang/bg/mailtext.txt b/wiki/inc/lang/bg/mailtext.txt
new file mode 100644
index 0000000..60cffed
--- /dev/null
+++ b/wiki/inc/lang/bg/mailtext.txt
@@ -0,0 +1,12 @@
+Страница в DokuWiki е добавена или променена. Ето детайлите:
+
+Дата : @DATE@
+Браузър : @BROWSER@
+IP адрес : @IPADDRESS@
+Име на хоста : @HOSTNAME@
+Стара версия: @OLDPAGE@
+Нова версия: @NEWPAGE@
+Обобщение: @SUMMARY@
+Потребител : @USER@
+
+@DIFF@
diff --git a/wiki/inc/lang/bg/mailwrap.html b/wiki/inc/lang/bg/mailwrap.html
new file mode 100644
index 0000000..7df0cdc
--- /dev/null
+++ b/wiki/inc/lang/bg/mailwrap.html
@@ -0,0 +1,13 @@
+<html>
+<head>
+    <title>@TITLE@</title>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+</head>
+<body>
+
+@HTMLBODY@
+
+<br /><hr />
+<small>@EMAILSIGNATURE@</small>
+</body>
+</html>
diff --git a/wiki/inc/lang/bg/newpage.txt b/wiki/inc/lang/bg/newpage.txt
new file mode 100644
index 0000000..22d3bb6
--- /dev/null
+++ b/wiki/inc/lang/bg/newpage.txt
@@ -0,0 +1,4 @@
+====== Несъществуваща тема ======
+
+Последвали сте препратка към тема, която не съществува. Ако правата ви позволяват, може да я създадете чрез бутона ''Създаване на страница''.
+
diff --git a/wiki/inc/lang/bg/norev.txt b/wiki/inc/lang/bg/norev.txt
new file mode 100644
index 0000000..fb7aeef
--- /dev/null
+++ b/wiki/inc/lang/bg/norev.txt
@@ -0,0 +1,4 @@
+====== Няма такава версия ======
+
+Избраната версия не съществува. Натиснете бутона ''История'' за отваряне на списъка със стари версии на документа.
+
diff --git a/wiki/inc/lang/bg/password.txt b/wiki/inc/lang/bg/password.txt
new file mode 100644
index 0000000..77fa48b
--- /dev/null
+++ b/wiki/inc/lang/bg/password.txt
@@ -0,0 +1,6 @@
+Здравейте @FULLNAME@!
+
+Вашите потребителски данни за @TITLE@ на @DOKUWIKIURL@
+
+Потребител : @LOGIN@
+Парола : @PASSWORD@
diff --git a/wiki/inc/lang/bg/preview.txt b/wiki/inc/lang/bg/preview.txt
new file mode 100644
index 0000000..41fde73
--- /dev/null
+++ b/wiki/inc/lang/bg/preview.txt
@@ -0,0 +1,3 @@
+====== Преглед ======
+
+Ето как ще изглежда страницата. Текста все още **не е запазен**!
\ No newline at end of file
diff --git a/wiki/inc/lang/bg/pwconfirm.txt b/wiki/inc/lang/bg/pwconfirm.txt
new file mode 100644
index 0000000..3d0a967
--- /dev/null
+++ b/wiki/inc/lang/bg/pwconfirm.txt
@@ -0,0 +1,10 @@
+Здравейте @FULLNAME@!
+
+Някой е поискал нова парола за потребител @TITLE@
+на @DOKUWIKIURL@
+
+Ако не сте поискали нова парола, тогава просто игнорирайте това писмо.
+
+За да потвърдите, че искането е наистина от вас, моля ползвайте следния линк:
+
+@CONFIRM@
diff --git a/wiki/inc/lang/bg/read.txt b/wiki/inc/lang/bg/read.txt
new file mode 100644
index 0000000..861d47f
--- /dev/null
+++ b/wiki/inc/lang/bg/read.txt
@@ -0,0 +1,2 @@
+Страницата е само за четене. Може да разглеждате кода, но не и да го променяте. Обърнете се съм администратора, ако смятате, че това не е редно.
+
diff --git a/wiki/inc/lang/bg/recent.txt b/wiki/inc/lang/bg/recent.txt
new file mode 100644
index 0000000..c920290
--- /dev/null
+++ b/wiki/inc/lang/bg/recent.txt
@@ -0,0 +1,4 @@
+====== Скорошни промени ======
+
+Следните страници са били променени наскоро.
+
diff --git a/wiki/inc/lang/bg/register.txt b/wiki/inc/lang/bg/register.txt
new file mode 100644
index 0000000..3334280
--- /dev/null
+++ b/wiki/inc/lang/bg/register.txt
@@ -0,0 +1,4 @@
+====== Регистриране като нов потребител ======
+
+Моля, попълнете всичките полета отдолу, за да бъде създаден нов профил. Уверете се, че въведеният **имейл адрес е правилен**. Ако няма поле за парола, ще ви бъде изпратена такава на въведения адрес. Потребителското име трябва да бъде валидно [[doku>pagename|име на страница]].
+
diff --git a/wiki/inc/lang/bg/registermail.txt b/wiki/inc/lang/bg/registermail.txt
new file mode 100644
index 0000000..3c555f5
--- /dev/null
+++ b/wiki/inc/lang/bg/registermail.txt
@@ -0,0 +1,10 @@
+Регистриран е нов потребител. Ето детайлите:
+
+Потребител  : @NEWUSER@
+Пълно име : @NEWNAME@
+E. поща : @NEWEMAIL@
+
+Дата : @DATE@
+Браузър : @BROWSER@
+IP адрес : @IPADDRESS@
+Име на хоста : @HOSTNAME@
diff --git a/wiki/inc/lang/bg/resendpwd.txt b/wiki/inc/lang/bg/resendpwd.txt
new file mode 100644
index 0000000..19dffc0
--- /dev/null
+++ b/wiki/inc/lang/bg/resendpwd.txt
@@ -0,0 +1,3 @@
+====== Пращане на нова парола ======
+
+Моля, въведете потребителското си име във формата по-долу, ако желаете да получите нова парола. Чрез имейл ще получите линк, с който да потвърдите.
diff --git a/wiki/inc/lang/bg/resetpwd.txt b/wiki/inc/lang/bg/resetpwd.txt
new file mode 100644
index 0000000..caa4adf
--- /dev/null
+++ b/wiki/inc/lang/bg/resetpwd.txt
@@ -0,0 +1,4 @@
+====== Задаване на нова парола ======
+
+Моля, въведете нова парола за вашия акаунт в Wiki страницата.
+
diff --git a/wiki/inc/lang/bg/revisions.txt b/wiki/inc/lang/bg/revisions.txt
new file mode 100644
index 0000000..0e14662
--- /dev/null
+++ b/wiki/inc/lang/bg/revisions.txt
@@ -0,0 +1,4 @@
+====== Стари версии======
+
+Това са старите версии на документа. За да възстановите стара версия, изберете я долу, натиснете ''Редактиране'' и я запазете.
+
diff --git a/wiki/inc/lang/bg/searchpage.txt b/wiki/inc/lang/bg/searchpage.txt
new file mode 100644
index 0000000..6da6042
--- /dev/null
+++ b/wiki/inc/lang/bg/searchpage.txt
@@ -0,0 +1,4 @@
+====== Търсене ======
+
+Резултата от търсенето ще намерите по-долу. @CREATEPAGEINFO@
+
diff --git a/wiki/inc/lang/bg/showrev.txt b/wiki/inc/lang/bg/showrev.txt
new file mode 100644
index 0000000..a3848f8
--- /dev/null
+++ b/wiki/inc/lang/bg/showrev.txt
@@ -0,0 +1,2 @@
+**Това е стара версия на документа!**
+----
diff --git a/wiki/inc/lang/bg/stopwords.txt b/wiki/inc/lang/bg/stopwords.txt
new file mode 100644
index 0000000..03fd137
--- /dev/null
+++ b/wiki/inc/lang/bg/stopwords.txt
@@ -0,0 +1,29 @@
+# Това е списък с думи за игнориране при индексиране, с една дума на ред
+# Когато редактирате този файл, не забравяйте да използвате UNIX символ за нов ред
+# Не е нужно да включвате думи по-кратки от 3 символа - те биват игнорирани така или иначе
+# Списъкът се основава на думи от http://www.ranks.nl/stopwords/
+about
+are
+and
+you
+your
+them
+their
+com
+for
+from
+into
+how
+that
+the
+this
+was
+what
+when
+where
+who
+will
+with
+und
+the
+www
diff --git a/wiki/inc/lang/bg/subscr_digest.txt b/wiki/inc/lang/bg/subscr_digest.txt
new file mode 100644
index 0000000..8f8cfea
--- /dev/null
+++ b/wiki/inc/lang/bg/subscr_digest.txt
@@ -0,0 +1,15 @@
+Здравейте!
+
+Страницата @PAGE@ в @TITLE@ wiki е променена.
+Промените са по-долу:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Стара версия: @OLDPAGE@
+Нова версия: @NEWPAGE@
+
+Ако желаете да прекратите уведомяването за страницата трябва да се впишете на адрес @DOKUWIKIURL@, да посетите
+@SUBSCRIBE@
+и да прекратите абонамента за промени по страницата или именното пространство.
diff --git a/wiki/inc/lang/bg/subscr_form.txt b/wiki/inc/lang/bg/subscr_form.txt
new file mode 100644
index 0000000..e32a5ec
--- /dev/null
+++ b/wiki/inc/lang/bg/subscr_form.txt
@@ -0,0 +1,3 @@
+====== Диспечер на абонаменти ======
+
+Страницата ви позволява да управлявате текущите си абонаменти за страници и именни пространства.
\ No newline at end of file
diff --git a/wiki/inc/lang/bg/subscr_list.txt b/wiki/inc/lang/bg/subscr_list.txt
new file mode 100644
index 0000000..1e2b981
--- /dev/null
+++ b/wiki/inc/lang/bg/subscr_list.txt
@@ -0,0 +1,12 @@
+Здравейте!
+
+Променени са страници от именното пространство @PAGE@ от @TITLE@ wiki.
+Ето променените страници:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Ако желаете да прекратите уведомяването за страницата трябва да се впишете на адрес @DOKUWIKIURL@, да посетите
+@SUBSCRIBE@
+и да прекратите абонамента за промени по страницата или именното пространство.
diff --git a/wiki/inc/lang/bg/subscr_single.txt b/wiki/inc/lang/bg/subscr_single.txt
new file mode 100644
index 0000000..36b2df3
--- /dev/null
+++ b/wiki/inc/lang/bg/subscr_single.txt
@@ -0,0 +1,18 @@
+Здравейте!
+
+Страницата @PAGE@ в @TITLE@ wiki е променена.
+Промените са по-долу:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Дата : @DATE@
+Потребител : @USER@
+Обобщение: @SUMMARY@
+Стара версия: @OLDPAGE@
+Нова версия: @NEWPAGE@
+
+Ако желаете да прекратите уведомяването за страницата трябва да се впишете на адрес @DOKUWIKIURL@, да посетите
+@SUBSCRIBE@
+и да прекратите абонамента за промени по страницата или именното пространство.
diff --git a/wiki/inc/lang/bg/updateprofile.txt b/wiki/inc/lang/bg/updateprofile.txt
new file mode 100644
index 0000000..6113f0d
--- /dev/null
+++ b/wiki/inc/lang/bg/updateprofile.txt
@@ -0,0 +1,3 @@
+====== Обновете профила си ======
+
+Трябва само да допълните полетата, които искате да промените. Потребителското не може да бъде променяно.
diff --git a/wiki/inc/lang/bg/uploadmail.txt b/wiki/inc/lang/bg/uploadmail.txt
new file mode 100644
index 0000000..0c14437
--- /dev/null
+++ b/wiki/inc/lang/bg/uploadmail.txt
@@ -0,0 +1,10 @@
+Качен е файл на вашето DokuWiki. Ето детайлите
+
+Файл : @MEDIA@
+Дата  : @DATE@
+Браузър : @BROWSER@
+IP адрес : @IPADDRESS@
+Име на хоста : @HOSTNAME@
+Размер : @SIZE@
+MIME тип : @MIME@
+Потребител : @USER@
diff --git a/wiki/inc/lang/bn/admin.txt b/wiki/inc/lang/bn/admin.txt
new file mode 100644
index 0000000..ede23c7
--- /dev/null
+++ b/wiki/inc/lang/bn/admin.txt
@@ -0,0 +1,3 @@
+====== প্রশাসন ======
+
+আপনি DokuWiki পাওয়া প্রশাসনিক কাজগুলো একটি তালিকা পেতে পারেন নীচে.
\ No newline at end of file
diff --git a/wiki/inc/lang/bn/adminplugins.txt b/wiki/inc/lang/bn/adminplugins.txt
new file mode 100644
index 0000000..c491ff9
--- /dev/null
+++ b/wiki/inc/lang/bn/adminplugins.txt
@@ -0,0 +1 @@
+===== অতিরিক্ত প্লাগইন =====
\ No newline at end of file
diff --git a/wiki/inc/lang/bn/backlinks.txt b/wiki/inc/lang/bn/backlinks.txt
new file mode 100644
index 0000000..61a7cac
--- /dev/null
+++ b/wiki/inc/lang/bn/backlinks.txt
@@ -0,0 +1,3 @@
+====== ব্যাকলিঙ্কগুলি ======
+
+এই বর্তমান পৃষ্ঠায় ফিরে সংযোগ আছে বলে মনে হচ্ছে যে পেজের একটি তালিকা.
\ No newline at end of file
diff --git a/wiki/inc/lang/bn/conflict.txt b/wiki/inc/lang/bn/conflict.txt
new file mode 100644
index 0000000..b18ad95
--- /dev/null
+++ b/wiki/inc/lang/bn/conflict.txt
@@ -0,0 +1,5 @@
+====== একটি নতুন সংস্করণ উপস্থিত ======
+
+আপনি সম্পাদিত ডকুমেন্টের একটি নতুন সংস্করণ বিদ্যমান. আপনি এটি সম্পাদনা যখন অন্য ব্যবহারকারীর নথি পরিবর্তিত যখন এটি হয়.
+
+পুঙ্খানুপুঙ্খভাবে নিচে দেখানো পার্থক্য পরীক্ষা, তারপর রাখা যা সংস্করণে ঠিক. আপনি "সংরক্ষণ" চয়ন, আপনার সংস্করণ সংরক্ষিত হবে অথবা বর্তমান সংস্করণ রাখা ''বাতিল'' হিট করুন.
\ No newline at end of file
diff --git a/wiki/inc/lang/bn/denied.txt b/wiki/inc/lang/bn/denied.txt
new file mode 100644
index 0000000..5ba0fcf
--- /dev/null
+++ b/wiki/inc/lang/bn/denied.txt
@@ -0,0 +1,3 @@
+====== অনুমতি অস্বীকার =====
+
+দুঃখিত, আপনি কি এগিয়ে যেতে যথেষ্ট অধিকার নেই.
\ No newline at end of file
diff --git a/wiki/inc/lang/bn/diff.txt b/wiki/inc/lang/bn/diff.txt
new file mode 100644
index 0000000..5952e28
--- /dev/null
+++ b/wiki/inc/lang/bn/diff.txt
@@ -0,0 +1,3 @@
+====== পার্থক্য ======
+
+এর মানে আপনি পৃষ্ঠার দুটি সংস্করণের মধ্যে পার্থক্য দেখায়.
\ No newline at end of file
diff --git a/wiki/inc/lang/bn/draft.txt b/wiki/inc/lang/bn/draft.txt
new file mode 100644
index 0000000..0b614f4
--- /dev/null
+++ b/wiki/inc/lang/bn/draft.txt
@@ -0,0 +1,5 @@
+====== খসড়া ফাইল ====== পাওয়া
+
+এই পৃষ্ঠাতে আপনার সর্বশেষ সম্পাদনা সময় সঠিকভাবে সম্পন্ন করা হয় নি. DokuWiki স্বয়ংক্রিয়ভাবে আপনি এখন আপনার সম্পাদনা চালিয়ে যেতে ব্যবহার করতে পারেন যা আপনার কাজ করার সময় একটি খসড়া সংরক্ষিত. আপনি আপনার শেষ সময় থেকে সংরক্ষিত ছিল যে তথ্য দেখতে পারেন নিচে.
+
+আপনি / /ফিরাইয়া আনা / / আপনার হারিয়ে সম্পাদনা সময়, / / মুছে দিন / / স্বতঃসংরক্ষিত খসড়া অথবা / / বাতিল / / সম্পাদনা প্রক্রিয়া পুনরুদ্ধার করতে চান তা স্থির করুন.
\ No newline at end of file
diff --git a/wiki/inc/lang/bn/edit.txt b/wiki/inc/lang/bn/edit.txt
new file mode 100644
index 0000000..b294b64
--- /dev/null
+++ b/wiki/inc/lang/bn/edit.txt
@@ -0,0 +1 @@
+পাতা সম্পাদনা করুন এবং ''সংরক্ষণ'' আঘাত. দেখুন [[উইকি: সিনট্যাক্স]] উইকি সিনট্যাক্স জন্য. আপনি এটি **উন্নত** করতে পারেন শুধুমাত্র যদি পাতাটি সম্পাদনা করুন. আপনি কিছু কিছু বিষয় পরীক্ষা আপনার প্রথম পদক্ষেপ করা শিখতে চান [[খেলার মাঠ: খেলার মাঠ | খেলার মাঠ]].
\ No newline at end of file
diff --git a/wiki/inc/lang/bn/editrev.txt b/wiki/inc/lang/bn/editrev.txt
new file mode 100644
index 0000000..1ea7236
--- /dev/null
+++ b/wiki/inc/lang/bn/editrev.txt
@@ -0,0 +1,2 @@
+** আপনি নথির একটি পুরোনো সংস্করণ লোড করেছেন! ** যদি আপনি এটি সংরক্ষণ করেন, আপনি এই তথ্য দিয়ে একটি নতুন সংস্করণ তৈরি করবে.
+----
\ No newline at end of file
diff --git a/wiki/inc/lang/bn/index.txt b/wiki/inc/lang/bn/index.txt
new file mode 100644
index 0000000..9f5ad75
--- /dev/null
+++ b/wiki/inc/lang/bn/index.txt
@@ -0,0 +1,3 @@
+====== সাইটম্যাপ ======
+
+এই দ্বারা আদেশ সমস্ত উপলব্ধ পৃষ্ঠাগুলি উপর একটি সাইট ম্যাপ হল [[Doku> নামব্যবধান | নামব্যবধান]].
\ No newline at end of file
diff --git a/wiki/inc/lang/bn/lang.php b/wiki/inc/lang/bn/lang.php
new file mode 100644
index 0000000..5cb66a8
--- /dev/null
+++ b/wiki/inc/lang/bn/lang.php
@@ -0,0 +1,226 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Foysol <ragebot1125@gmail.com>
+ * @author ninetailz <ninetailz1125@gmail.com>
+ * @author Khan M. B. Asad <muhammad2017@gmail.com>
+ * @author Ninetailz <ninetailz1125@gmail.com>
+ */
+$lang['encoding']              = 'utf-8';
+$lang['direction']             = 'ltr';
+$lang['doublequoteopening']    = '“';
+$lang['doublequoteclosing']    = '”';
+$lang['singlequoteopening']    = '‘';
+$lang['singlequoteclosing']    = '’';
+$lang['apostrophe']            = '’';
+$lang['btn_edit']              = 'এই পৃষ্ঠা সম্পাদনা করুন';
+$lang['btn_source']            = 'দেখান পাতা উৎস';
+$lang['btn_show']              = 'দেখান পৃষ্ঠা';
+$lang['btn_create']            = 'এই পৃষ্ঠা তৈরি করুন';
+$lang['btn_search']            = 'অনুসন্ধান';
+$lang['btn_preview']           = 'পূর্বরূপ';
+$lang['btn_top']               = 'উপরে ফিরে যান ';
+$lang['btn_newer']             = '<< আরো সাম্প্রতিক';
+$lang['btn_older']             = 'কম সাম্প্রতিক >>';
+$lang['btn_revs']              = 'প্রাচীন সংশোধন';
+$lang['btn_recent']            = 'সাধিত পরিবর্তনসমূহ';
+$lang['btn_upload']            = 'আপলোড করুন';
+$lang['btn_cancel']            = 'বাতিল করা';
+$lang['btn_index']             = 'সাইট ম্যাপ';
+$lang['btn_secedit']           = 'সম্পাদন করা';
+$lang['btn_login']             = 'লগইন';
+$lang['btn_logout']            = 'লগ আউট';
+$lang['btn_admin']             = 'অ্যাডমিন';
+$lang['btn_update']            = 'আধুনিক করা';
+$lang['btn_delete']            = 'মুছে ফেলা';
+$lang['btn_back']              = 'পিছনে';
+$lang['btn_backlink']          = 'ব্যাকলিঙ্কগুলি';
+$lang['btn_subscribe']         = 'সাবস্ক্রিপশন পরিচালনা করুন';
+$lang['btn_profile']           = 'প্রোফাইল আপডেট করুন';
+$lang['btn_reset']             = 'রিসেট করুন';
+$lang['btn_resendpwd']         = 'সেট করুন নতুন পাসওয়ার্ড';
+$lang['btn_draft']             = 'সম্পাদনা খসড়া';
+$lang['btn_recover']           = 'খসড়া উদ্ধার';
+$lang['btn_draftdel']          = 'খসড়া মুছে দিন';
+$lang['btn_revert']            = 'পুনরূদ্ধার করা';
+$lang['btn_register']          = 'খাতা';
+$lang['btn_apply']             = 'প্রয়োগ করা';
+$lang['btn_media']             = 'মিডিয়া ম্যানেজার';
+$lang['btn_deleteuser']        = 'আমার অ্যাকাউন্ট অপসারণ করুন';
+$lang['btn_img_backto']        = 'ফিরে যান %s';
+$lang['btn_mediaManager']      = 'মিডিয়া ম্যানেজারে দেখুন';
+$lang['loggedinas']            = 'লগ ইন:';
+$lang['user']                  = 'ইউজারনেম';
+$lang['pass']                  = 'পাসওয়ার্ড';
+$lang['newpass']               = 'নতুন পাসওয়ার্ড';
+$lang['oldpass']               = 'বর্তমান পাসওয়ার্ড নিশ্চিত করুন';
+$lang['passchk']               = 'আরো একবার';
+$lang['remember']              = 'আমাকে মনে রেখো';
+$lang['fullname']              = 'আমাকে মনে রেখো';
+$lang['email']                 = 'ই মেইল';
+$lang['profile']               = 'ব্যবহারকারী প্রোফাইল';
+$lang['badlogin']              = 'দুঃখিত, ব্যবহারকারীর নাম বা পাসওয়ার্ড ভুল ছিল.';
+$lang['badpassconfirm']        = 'দুঃখিত, পাসওয়ার্ড ভুল ছিল';
+$lang['minoredit']             = 'ক্ষুদ্র পরিবর্তনসমূহ';
+$lang['draftdate']             = 'খসড়া উপর স্বতঃসংরক্ষণ';
+$lang['nosecedit']             = 'পাতা ইতিমধ্যে পরিবর্তিত হয়েছিল, অধ্যায় তথ্যের পরিবর্তে পুরো পাতা লোড তারিখ সীমার বাইরে ছিল.
+';
+$lang['regmissing']            = 'দুঃখিত, আপনি সমস্ত ক্ষেত্রগুলি পূরণ করা আবশ্যক.';
+$lang['reguexists']            = 'দুঃখিত, এই লগইন সঙ্গে একটি ব্যবহারকারী ইতিমধ্যেই বিদ্যমান.';
+$lang['regsuccess']            = 'ব্যবহারকারী তৈরি করা হয়েছে এবং পাসওয়ার্ড ইমেইল করে পাঠানো হয়েছিল.';
+$lang['regsuccess2']           = 'ব্যবহারকারী তৈরি করা হয়েছে.';
+$lang['regmailfail']           = 'একটি ত্রুটি পাসওয়ার্ড মেইল পাঠানোর নেভিগেশন ছিল মনে হচ্ছে. অ্যাডমিন যোগাযোগ করুন!';
+$lang['regbadmail']            = 'প্রদত্ত ইমেইল ঠিকানা সঠিক মনে হচ্ছে - আপনি এই একটি ত্রুটি মনে হলে, অ্যাডমিন যোগাযোগ';
+$lang['regbadpass']            = 'দুটি প্রদত্ত পাসওয়ার্ড অভিন্ন নয়, আবার চেষ্টা করুন.';
+$lang['regpwmail']             = 'আপনার DokuWiki পাসওয়ার্ড';
+$lang['reghere']               = 'যদিও তোমার কোনো একাউন্ট নেই? শুধু একটি পেতে';
+$lang['profna']                = 'এই উইকি প্রোফাইল পরিবর্তন সমর্থন করে না';
+$lang['profnochange']          = 'এমন কোন পরিবর্তন, না কিছুই.';
+$lang['profnoempty']           = 'একটি খালি নাম অথবা ইমেইল ঠিকানা অনুমোদিত নয়.';
+$lang['profchanged']           = 'ইউজার প্রোফাইল সফলভাবে আপডেট.';
+$lang['profnodelete']          = 'এই উইকি ব্যবহারকারী মুছে ফেলার সমর্থন করে না';
+$lang['profdeleteuser']        = 'একাউন্ট মুছে দিন';
+$lang['profdeleted']           = 'আপনার অ্যাকাউন্টটি এই উইকি থেকে মুছে ফেলা হয়েছে';
+$lang['profconfdelete']        = 'আমি এই উইকি থেকে আমার অ্যাকাউন্ট অপসারণ করতে ইচ্ছুক. <br/> এই ক্রিয়াটি পূর্বাবস্থায় ফেরানো যায় না.';
+$lang['profconfdeletemissing'] = 'নিশ্চিতকরণ চেক বক্স ticked না';
+$lang['pwdforget']             = 'আপনার পাসওয়ার্ড ভুলে গেছেন? একটি নতুন পান';
+$lang['resendna']              = 'এই উইকি পাসওয়ার্ড পুনরায় প্রেরণ সমর্থন করে না.';
+$lang['resendpwd']             = 'জন্য সেট করুন নতুন পাসওয়ার্ড';
+$lang['resendpwdmissing']      = 'দুঃখিত, আপনি সমস্ত ক্ষেত্রগুলি পূরণ করা আবশ্যক.';
+$lang['resendpwdnouser']       = 'দুঃখিত, আমরা আমাদের ডাটাবেসের মধ্যে ব্যবহারকারীর খুঁজে পাচ্ছি না.';
+$lang['resendpwdbadauth']      = 'দুঃখিত, এই auth কোড বৈধ নয়. আপনি সম্পূর্ণ কনফার্মেশন লিঙ্ক ব্যবহার নিশ্চিত করুন.';
+$lang['resendpwdconfirm']      = 'একটি নিশ্চায়ন লিঙ্ক ইমেলের মাধ্যমে পাঠানো হয়েছে.';
+$lang['resendpwdsuccess']      = 'আপনার নতুন পাসওয়ার্ড ইমেইলের মাধ্যমে পাঠানো হয়েছে.';
+$lang['license']               = 'অন্যথায় নোট যেখানে ছাড়া, এই উইকি নেভিগেশন কন্টেন্ট নিম্নলিখিত লাইসেন্সের আওতায় লাইসেন্সকৃত:';
+$lang['licenseok']             = 'দ্রষ্টব্য: আপনি নিম্নলিখিত লাইসেন্সের অধীনে আপনার বিষয়বস্তু লাইসেন্স সম্মত হন এই পৃষ্ঠার সম্পাদনার দ্বারা:';
+$lang['searchmedia']           = 'অনুসন্ধান ফাইলের নাম:';
+$lang['searchmedia_in']        = 'অনুসন্ধান %s -এ';
+$lang['txt_upload']            = 'আপলোড করার জন্য নির্বাচন করুন ফাইল:';
+$lang['txt_filename']          = 'হিসাবে আপলোড করুন (ঐচ্ছিক):';
+$lang['txt_overwrt']           = 'বিদ্যমান ফাইল মুছে যাবে';
+$lang['maxuploadsize']         = 'সর্বোচ্চ আপলোড করুন. %s-ফাইলের প্রতি.';
+$lang['lockedby']              = 'বর্তমানে দ্বারা লক:';
+$lang['lockexpire']            = 'তালা এ মেয়াদ শেষ:';
+$lang['js']['willexpire']      = 'এই পৃষ্ঠার সম্পাদনার জন্য আপনার লক এক মিনিটের মধ্যে মেয়াদ শেষ সম্পর্কে. \ দ্বন্দ্ব লক টাইমার রিসেট প্রিভিউ বাটন ব্যবহার এড়াতে.';
+$lang['js']['notsavedyet']     = 'অসংরক্ষিত পরিবর্তন হারিয়ে যাবে.';
+$lang['js']['searchmedia']     = 'ফাইলের জন্য অনুসন্ধান';
+$lang['js']['keepopen']        = 'নির্বাচনের উপর উইন্ডো খোলা রাখুন';
+$lang['js']['hidedetails']     = 'বিশদ আড়াল করুন';
+$lang['js']['mediatitle']      = 'লিংক সেটিংস';
+$lang['js']['mediadisplay']    = 'লিংক টাইপ';
+$lang['js']['mediaalign']      = 'শ্রেণীবিন্যাস';
+$lang['js']['mediasize']       = 'চিত্র আকার';
+$lang['js']['mediatarget']     = 'লিংক টার্গেট';
+$lang['js']['mediaclose']      = 'বন্ধ করা';
+$lang['js']['mediainsert']     = 'ঢোকান';
+$lang['js']['mediadisplayimg'] = 'ছবিটি দেখান';
+$lang['js']['mediadisplaylnk'] = 'শুধুমাত্র লিঙ্ক দেখান';
+$lang['js']['mediasmall']      = 'ক্ষুদ্র সংস্করণ';
+$lang['js']['mediamedium']     = 'মাধ্যম সংস্করণ';
+$lang['js']['medialarge']      = 'বড় সংস্করণ';
+$lang['js']['mediaoriginal']   = 'আসল সংস্করণ';
+$lang['js']['medialnk']        = 'বিস্তারিত পৃষ্ঠায় লিংক';
+$lang['js']['mediadirect']     = 'মূল সরাসরি লিঙ্ক';
+$lang['js']['medianolnk']      = 'কোনো লিঙ্ক নাই';
+$lang['js']['medianolink']     = 'ইমেজ লিঙ্ক কোরো না';
+$lang['js']['medialeft']       = 'বাম দিকে ইমেজ সারিবদ্ধ কর';
+$lang['js']['mediaright']      = 'ডান দিকে ইমেজ সারিবদ্ধ কর';
+$lang['js']['mediacenter']     = 'মাঝখানে ইমেজ সারিবদ্ধ কর';
+$lang['js']['medianoalign']    = 'কোনো সারিবদ্ধ করা প্রয়োজন নেই';
+$lang['js']['nosmblinks']      = 'উইন্ডোস শেয়ার এর সাথে সংযোগ সাধন কেবল মাইক্রোসফ্ট ইন্টারনেট এক্সপ্লোরারেই সম্ভব।\nতবে আপনি লিংকটি কপি পেস্ট করতেই পারেন।';
+$lang['js']['linkwiz']         = 'লিংক উইজার্ড';
+$lang['js']['linkto']          = 'সংযোগের লক্ষ্য:';
+$lang['js']['del_confirm']     = 'নির্বাচিত আইটেম(গুলো) আসলেই মুছে ফেলতে চান?';
+$lang['js']['restore_confirm'] = 'এই সংস্করণ সত্যিই পূর্বাবস্থায় ফিরিয়ে আনতে চান?';
+$lang['js']['media_diff']      = 'পার্থক্যগুলো দেখুন:';
+$lang['js']['media_diff_both'] = 'পাশাপাশি';
+$lang['js']['media_diff_opacity'] = 'শাইন-থ্রু';
+$lang['js']['media_diff_portions'] = 'ঝেঁটিয়ে বিদায়';
+$lang['js']['media_select']    = 'ফাইল নির্বাচন...';
+$lang['js']['media_upload_btn'] = 'আপলোড';
+$lang['js']['media_done_btn']  = 'সাধিত';
+$lang['js']['media_drop']      = 'আপলোডের জন্য এখানে ফাইল ফেলুন';
+$lang['js']['media_cancel']    = 'অপসারণ';
+$lang['js']['media_overwrt']   = 'বর্তমান ফাইল ওভাররাইট করুন';
+$lang['rssfailed']             = 'ফিডটি জোগাড় করতে গিয়ে একটি ত্রুটি ঘটেছে:';
+$lang['nothingfound']          = 'কিছু পাওয়া যায়নি।';
+$lang['mediaselect']           = 'মিডিয়া ফাইল';
+$lang['uploadsucc']            = 'আপলোড সফল';
+$lang['uploadfail']            = 'আপলোড ব্যর্থ। অনুমতি জনিত ত্রুটি কী?';
+$lang['uploadwrong']           = 'আপলোড প্রত্যাখ্যাত। এই ফাইল এক্সটেনশন অননুমোদিত।';
+$lang['uploadexist']           = 'ফাইল ইতিমধ্যেই বিরাজমান। কিছু করা হয়নি।';
+$lang['uploadbadcontent']      = 'আপলোডকৃত সামগ্রী %s ফাইল এক্সটেনশন এর সাথে মিলেনি।';
+$lang['uploadspam']            = 'স্প্যাম ব্ল্যাকলিস্ট আপলোড আটকে দিয়েছে।';
+$lang['uploadxss']             = 'সামগ্রীটি ক্ষতিকর ভেবে আপলোড আটকে দেয়া হয়েছে।';
+$lang['uploadsize']            = 'আপলোডকৃত ফাইলটি বেশি বড়ো। (সর্বোচ্চ %s)';
+$lang['deletesucc']            = '"%s" ফাইলটি মুছে ফেলা হয়েছে।';
+$lang['deletefail']            = '"%s" ডিলিট করা যায়নি - অনুমতি আছে কি না দেখুন।';
+$lang['mediainuse']            = '"%s" ফাইলটি মোছা হয়নি - এটি এখনো ব্যবহৃত হচ্ছে।';
+$lang['namespaces']            = 'নামস্থান';
+$lang['mediafiles']            = 'ফাইল পাওয়া যাবে ';
+$lang['accessdenied']          = 'আপনি এই পৃষ্ঠাটি দেখতে অনুমতি দেওয়া হয়নি';
+$lang['mediausage']            = 'এই ফাইলের উল্লেখ নিম্নলিখিত সিনট্যাক্স ব্যবহার করুন:';
+$lang['mediaview']             = 'মূল ফাইলটি দেখুন';
+$lang['mediaroot']             = 'মূল';
+$lang['mediaupload']           = 'এখানে বর্তমান নামস্থান একটি ফাইল আপলোড করুন. , Subnamespaces তৈরি আপনি ফাইল নির্বাচন পরে কোলন দ্বারা বিভাজিত আপনার ফাইলের নাম তাদের পূর্বে লিখুন করুন. কোন ফাইল এছাড়াও ড্র্যাগ এবং ড্রপ দ্বারা নির্বাচন করা সম্ভব.';
+$lang['mediaextchange']        = 'ফাইল এক্সটেনশন .%s থেকে .%s\'এ পরিবর্তন হলো !';
+$lang['reference']             = 'তথ্যসূত্রের জন্য ';
+$lang['ref_inuse']             = 'এই ফাইল মুছে ফেলা যাবে না কারণ এটি এখনও ব্যবহৃত হচ্ছে নিম্নলিখিত পাতা দ্বারা:';
+$lang['ref_hidden']            = 'এই পাতায় কিছু রেফারেন্স পড়ার আপনার আনুমতি নেই';
+$lang['hits']                  = 'সফল ';
+$lang['quickhits']             = 'পৃষ্ঠা মেলে';
+$lang['toc']                   = 'সূচীপত্র';
+$lang['current']               = 'বর্তমান';
+$lang['yours']                 = 'আপনার সংস্করণ
+';
+$lang['diff']                  = 'বর্তমান সংস্করণের পার্থক্য দেখান ';
+$lang['diff2']                 = 'নির্বাচিত সংস্করণের মধ্যে পার্থক্য দেখান ';
+$lang['diff_type']             = 'পার্থক্য দেখুন:';
+$lang['diff_inline']           = 'ইনলাইন';
+$lang['diff_side']             = 'পাশাপাশি';
+$lang['diffprevrev']           = 'পূর্ববর্তী সংস্করণ';
+$lang['diffnextrev']           = 'পরবর্তী সংস্করণ';
+$lang['difflastrev']           = 'সর্বশেষ সংস্করণ';
+$lang['diffbothprevrev']       = 'উভয় পক্ষের পূর্ববর্তী সংস্করণ';
+$lang['diffbothnextrev']       = 'উভয় পক্ষের পরবর্তী সংস্করণ';
+$lang['line']                  = 'লাইন';
+$lang['breadcrumb']            = 'ট্রেস:';
+$lang['youarehere']            = 'আপনি এখানে আছেন:';
+$lang['lastmod']               = 'শেষ বার পরিমার্জিত';
+$lang['by']                    = 'দ্বারা';
+$lang['deleted']               = 'মুছে ফেলা';
+$lang['created']               = 'তৈরি করা';
+$lang['restored']              = 'পুরানো সংস্করণের পুনঃস্থাপন (%s)';
+$lang['external_edit']         = 'বাহ্যিক সম্পাদনা';
+$lang['summary']               = 'সম্পাদনা সারাংশ';
+$lang['noflash']               = 'এ href="http://www.adobe.com/products/flashplayer/"> অ্যাডোবি ফ্ল্যাশ প্লাগইন </a> এই সামগ্রী প্রদর্শন করার জন্য প্রয়োজন হয়.';
+$lang['download']              = 'ডাউনলোড স্নিপেট ';
+$lang['tools']                 = 'সরঞ্জামসমূহ';
+$lang['user_tools']            = 'ব্যবহারকারীর সরঞ্জামসমূহ';
+$lang['site_tools']            = 'সাইটের সরঞ্জামসমূহ';
+$lang['page_tools']            = 'পৃষ্ঠার সরঞ্জামসমূহ';
+$lang['skip_to_content']       = 'বিষয়ে এড়িয়ে যান';
+$lang['sidebar']               = 'সাইডবার';
+$lang['mail_newpage']          = 'পৃষ্ঠা যোগ করা হয়েছে:';
+$lang['mail_changed']          = 'পৃষ্ঠা পরিবর্তন করা হয়েছে:';
+$lang['mail_subscribe_list']   = 'পৃষ্ঠাগুলির নামস্থান পরিবর্তন:';
+$lang['mail_new_user']         = 'নতুন ব্যবহারকারী:';
+$lang['mail_upload']           = 'ফাইল আপলোড করেছেন:';
+$lang['changes_type']          = 'দেখুন পরিবর্তনসমূহ';
+$lang['pages_changes']         = 'পৃষ্ঠাগুলি';
+$lang['media_changes']         = 'মিডিয়া ফাইলগুলি';
+$lang['both_changes']          = 'পেজ এবং মিডিয়া ফাইল উভয়েই';
+$lang['qb_bold']               = 'গাঢ় লেখা';
+$lang['qb_italic']             = 'বাঁকা লেখা';
+$lang['qb_underl']             = 'আন্ডারলাইন টেক্সট';
+$lang['qb_code']               = 'মোনোস্কেপ লেখা';
+$lang['qb_strike']             = 'স্ট্রাইক মাধ্যমে টেক্সট';
+$lang['qb_h1']                 = 'স্তর 1 শিরোনাম';
+$lang['qb_h2']                 = 'স্তর 2 শিরোনাম';
+$lang['qb_h3']                 = 'স্তর 3 শিরোনাম';
+$lang['qb_h4']                 = 'স্তর 4 শিরোনাম';
+$lang['qb_h5']                 = 'স্তর 5 শিরোনাম';
+$lang['qb_h']                  = 'শিরোনাম';
+$lang['qb_hs']                 = 'নির্বাচন করুন শিরোনাম';
diff --git a/wiki/inc/lang/ca-valencia/admin.txt b/wiki/inc/lang/ca-valencia/admin.txt
new file mode 100644
index 0000000..60b1b6e
--- /dev/null
+++ b/wiki/inc/lang/ca-valencia/admin.txt
@@ -0,0 +1,4 @@
+====== Administració ======
+
+Baix pot trobar una llista de tasques administratives disponibles en DokuWiki.
+
diff --git a/wiki/inc/lang/ca-valencia/adminplugins.txt b/wiki/inc/lang/ca-valencia/adminplugins.txt
new file mode 100644
index 0000000..010701e
--- /dev/null
+++ b/wiki/inc/lang/ca-valencia/adminplugins.txt
@@ -0,0 +1 @@
+===== Plugins adicionals =====
diff --git a/wiki/inc/lang/ca-valencia/backlinks.txt b/wiki/inc/lang/ca-valencia/backlinks.txt
new file mode 100644
index 0000000..bd7fde8
--- /dev/null
+++ b/wiki/inc/lang/ca-valencia/backlinks.txt
@@ -0,0 +1,3 @@
+====== Vínculs remitents ======
+
+Una llista de pàgines que pareixen vincular a la pàgina actual.
diff --git a/wiki/inc/lang/ca-valencia/conflict.txt b/wiki/inc/lang/ca-valencia/conflict.txt
new file mode 100644
index 0000000..6e91fe5
--- /dev/null
+++ b/wiki/inc/lang/ca-valencia/conflict.txt
@@ -0,0 +1,6 @@
+====== Ya existix una versió més nova ======
+
+Existix una versió més nova del document que ha editat. Açò ha passat perquè un altre usuari ha modificat el document mentre vosté estava editant-lo.
+
+Estudie be les diferències mostrades avall i decidixca quina versió vol guardar. Si pulsa ''Guardar'' es guardarà la versió que està editant. Pulse ''Cancelar'' per a conservar la versió modificada per l'atre usuari.
+
diff --git a/wiki/inc/lang/ca-valencia/denied.txt b/wiki/inc/lang/ca-valencia/denied.txt
new file mode 100644
index 0000000..6640e07
--- /dev/null
+++ b/wiki/inc/lang/ca-valencia/denied.txt
@@ -0,0 +1,4 @@
+====== Permís denegat ======
+
+Disculpe, pero no té permís per a continuar.
+
diff --git a/wiki/inc/lang/ca-valencia/diff.txt b/wiki/inc/lang/ca-valencia/diff.txt
new file mode 100644
index 0000000..2b5c60e
--- /dev/null
+++ b/wiki/inc/lang/ca-valencia/diff.txt
@@ -0,0 +1,4 @@
+====== Diferències ======
+
+Ací es mostren les diferències entre dos versions de la pàgina.
+
diff --git a/wiki/inc/lang/ca-valencia/draft.txt b/wiki/inc/lang/ca-valencia/draft.txt
new file mode 100644
index 0000000..d3972a7
--- /dev/null
+++ b/wiki/inc/lang/ca-valencia/draft.txt
@@ -0,0 +1,6 @@
+====== Borrador trobat ======
+
+L'última edició d'esta pàgina no es completà correctament. DokuWiki guarda automàticament un borrador que ara pot recuperar per a continuar editant. Baix pot vore la data en què es guardà l'últim borrador.
+
+Per favor, decidisca si vol //recuperar// la sessió que pergué, //borrar// el borrador o //cancelar// esta edició.
+
diff --git a/wiki/inc/lang/ca-valencia/edit.txt b/wiki/inc/lang/ca-valencia/edit.txt
new file mode 100644
index 0000000..e1ca6bf
--- /dev/null
+++ b/wiki/inc/lang/ca-valencia/edit.txt
@@ -0,0 +1,2 @@
+Edite la pàgina i pulse 'Guardar". Consulte la [[wiki:syntax|Sintaxis]] del Wiki. Per favor, edite la pàgina només **si pot millorar-la**. Si vol fer proves, deprenga a utilisar el Wiki en el [[playground:playground|espai de proves]].
+
diff --git a/wiki/inc/lang/ca-valencia/editrev.txt b/wiki/inc/lang/ca-valencia/editrev.txt
new file mode 100644
index 0000000..54feb3b
--- /dev/null
+++ b/wiki/inc/lang/ca-valencia/editrev.txt
@@ -0,0 +1,2 @@
+**Ha carregat una versió antiga del document!** Si la guarda crearà una nova versió en el contingut d'esta.
+----
diff --git a/wiki/inc/lang/ca-valencia/index.txt b/wiki/inc/lang/ca-valencia/index.txt
new file mode 100644
index 0000000..5e57c16
--- /dev/null
+++ b/wiki/inc/lang/ca-valencia/index.txt
@@ -0,0 +1,4 @@
+====== Índex ======
+
+Un índex de totes les pàgines disponibles ordenades per [[doku>namespaces|espais de noms]].
+
diff --git a/wiki/inc/lang/ca-valencia/install.html b/wiki/inc/lang/ca-valencia/install.html
new file mode 100644
index 0000000..804b803
--- /dev/null
+++ b/wiki/inc/lang/ca-valencia/install.html
@@ -0,0 +1,8 @@
+<p>Esta pàgina l'ajudarà en la primera instalació i configuració de <a href="http://dokuwiki.org">Dokuwiki</a>. N'hi ha més informació de l'instalador disponible en la
+<a href="http://dokuwiki.org/installer">pàgina de documentació</a>.</p>
+
+<p>DokuWiki utilitza arxius corrents per al magatzemament de les pàgines del wiki i atra informació associada ad estes pàgines (p. e. imàgens, índexs de busca, versions antigues, etc.). Per a que DokuWiki funcione correctament <strong>deu</strong> tindre accés d'escritura als directoris que contenen estos archius. Est instalador no pot ajustar els permissos del directori. Normalment haurà de fer-ho directament en una consola de del sistema o, si utilisa un hostage, per FTP o en el panel de control (p. e. cPanel).</p>
+
+<p>L'instali·lador configurarà <abbr title="access control list">ACL</abbr> en el seu DokuWiki, que al mateix temps permet l'accés de l'administrador i l'accés al menú d'administració de DokuWiki per a instalar plugins, gestionar usuaris, gestionar els accessos a les pàgines del wiki i la modificació dels ajusts de configuració. No és necessari per a que DokuWiki funcione, pero farà més fàcil la seua administració.</p>
+
+<p>Els usuaris experimentats o en necessitats especials de configuració deuen utilitzar estos vínculs per a informació referent a <a href="http://dokuwiki.org/install">instruccions d'instalació</a> i <a href="http://dokuwiki.org/config">ajusts de configuració</a>.</p>
diff --git a/wiki/inc/lang/ca-valencia/lang.php b/wiki/inc/lang/ca-valencia/lang.php
new file mode 100644
index 0000000..da6bd67
--- /dev/null
+++ b/wiki/inc/lang/ca-valencia/lang.php
@@ -0,0 +1,223 @@
+<?php
+/**
+ * valencian language file
+ *
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Bernat Arlandis i Mañó <berarma@ya.com>
+ * @author Bernat Arlandis <berarma@llenguaitecnologia.com>
+ * 
+ */
+$lang['encoding']              = 'utf-8';
+$lang['direction']             = 'ltr';
+$lang['doublequoteopening']    = '“';
+$lang['doublequoteclosing']    = '”';
+$lang['singlequoteopening']    = '‘';
+$lang['singlequoteclosing']    = '’';
+$lang['apostrophe']            = '’';
+$lang['btn_edit']              = 'Editar esta pàgina';
+$lang['btn_source']            = 'Mostrar font';
+$lang['btn_show']              = 'Mostrar pàgina';
+$lang['btn_create']            = 'Crear esta pàgina';
+$lang['btn_search']            = 'Buscar';
+$lang['btn_save']              = 'Guardar';
+$lang['btn_preview']           = 'Vista prèvia';
+$lang['btn_top']               = 'Tornar dalt';
+$lang['btn_newer']             = '<< més recents';
+$lang['btn_older']             = 'manco recents >>';
+$lang['btn_revs']              = 'Versions antigues';
+$lang['btn_recent']            = 'Canvis recents';
+$lang['btn_upload']            = 'Pujar';
+$lang['btn_cancel']            = 'Cancelar';
+$lang['btn_index']             = 'Índex';
+$lang['btn_secedit']           = 'Editar';
+$lang['btn_login']             = 'Iniciar sessió';
+$lang['btn_logout']            = 'Tancar sessió';
+$lang['btn_admin']             = 'Administrar';
+$lang['btn_update']            = 'Actualisar';
+$lang['btn_delete']            = 'Borrar';
+$lang['btn_back']              = 'Arrere';
+$lang['btn_backlink']          = 'Vínculs remitents';
+$lang['btn_subscribe']         = 'Subscriure\'s a la pàgina';
+$lang['btn_profile']           = 'Actualitzar perfil';
+$lang['btn_reset']             = 'Reiniciar';
+$lang['btn_draft']             = 'Editar borrador';
+$lang['btn_recover']           = 'Recuperar borrador';
+$lang['btn_draftdel']          = 'Borrar borrador';
+$lang['btn_revert']            = 'Recuperar';
+$lang['btn_register']          = 'Registrar-se';
+$lang['loggedinas']            = 'Sessió de:';
+$lang['user']                  = 'Nom d\'usuari';
+$lang['pass']                  = 'Contrasenya';
+$lang['newpass']               = 'Contrasenya nova';
+$lang['oldpass']               = 'Confirmar la contrasenya actual';
+$lang['passchk']               = 'una atra volta';
+$lang['remember']              = 'Recorda\'m';
+$lang['fullname']              = 'Nom complet';
+$lang['email']                 = 'Correu electrònic';
+$lang['profile']               = 'Perfil d\'usuari';
+$lang['badlogin']              = 'Disculpe, pero el nom d\'usuari o la contrasenya són incorrectes.';
+$lang['minoredit']             = 'Canvis menors';
+$lang['draftdate']             = 'Borrador gravat el';
+$lang['nosecedit']             = 'La pàgina ha canviat mentres tant, l\'informació de la secció no estava al dia, s\'ha carregat la pàgina sancera.';
+$lang['regmissing']            = 'Disculpe, pero deu omplir tots els camps.';
+$lang['reguexists']            = 'Disculpe, pero ya existix un usuari en este nom.';
+$lang['regsuccess']            = 'S\'ha creat l\'usuari i se li ha enviat la contrasenya per correu electrònic.';
+$lang['regsuccess2']           = 'S\'ha creat l\'usuari.';
+$lang['regmailfail']           = 'Pareix que ha hagut un error enviant el correu en la contrasenya. ¡Per favor, contacte en l\'administrador!';
+$lang['regbadmail']            = 'La direcció de correu no pareix vàlida - contacte en l\'administrador si pensa que és deu a un erro nostre';
+$lang['regbadpass']            = 'Les dos contrasenyes que ha donat no són idèntiques, per favor, torne a intentar-ho.';
+$lang['regpwmail']             = 'La seua contrasenya de DokuWiki';
+$lang['reghere']               = '¿Encara no té un conte? Cree-se\'n un';
+$lang['profna']                = 'Este wiki no li permet modificar el perfil';
+$lang['profnochange']          = 'Sense canvis, no hi ha res que fer.';
+$lang['profnoempty']           = 'No es permet deixar el nom o la direcció de correu buits.';
+$lang['profchanged']           = 'Perfil de l\'usuari actualitzat.';
+$lang['pwdforget']             = '¿Ha oblidat la contrasenya? Demane\'n una nova';
+$lang['resendna']              = 'Este wiki no permet reenviar la contrasenya.';
+$lang['resendpwdmissing']      = 'Disculpe, pero deu omplir tots els camps.';
+$lang['resendpwdnouser']       = 'Disculpe, pero no trobem ad est usuari en la base de senyes.';
+$lang['resendpwdbadauth']      = 'Disculpe, pero este còdic d\'autenticació no es vàlit. Verifique que haja utilisat el víncul de confirmació sancer.';
+$lang['resendpwdconfirm']      = 'Li hem enviat un víncul de confirmació al correu.';
+$lang['resendpwdsuccess']      = 'Se li ha enviat una nova contrasenya per correu electrònic.';
+$lang['license']               = 'Excepte quan s\'indique una atra cosa, el contingut d\'este wiki està llicenciat baix la següent llicència:';
+$lang['licenseok']             = 'Nota: a l\'editar esta pàgina accepta llicenciar el seu contingut baix la següent llicència:';
+$lang['searchmedia']           = 'Buscar nom d\'archiu:';
+$lang['searchmedia_in']        = 'Buscar en %s';
+$lang['txt_upload']            = 'Seleccione l\'archiu que vol pujar:';
+$lang['txt_filename']          = 'Enviar com (opcional):';
+$lang['txt_overwrt']           = 'Sobreescriure archius existents';
+$lang['lockedby']              = 'Actualment bloquejat per:';
+$lang['lockexpire']            = 'El bloqueig venç a les:';
+$lang['js']['willexpire']            = 'El seu bloqueig per a editar esta pàgina vencerà en un minut.\nPer a evitar conflictes utilise el botó de vista prèvia i reiniciarà el contador.';
+$lang['js']['notsavedyet']     = 'Els canvis no guardats es perdran.\n¿Segur que vol continuar?';
+$lang['rssfailed']             = 'Ha ocorregut un erro al solicitar este canal: ';
+$lang['nothingfound']          = 'No s\'ha trobat res.';
+$lang['mediaselect']           = 'Arxius de mijos';
+$lang['uploadsucc']            = 'Enviament correcte';
+$lang['uploadfail']            = 'Enviament fallit. ¿Potser no tinga els permissos necessaris?';
+$lang['uploadwrong']           = 'Enviament denegat. ¡Esta extensió d\'archiu està prohibida!';
+$lang['uploadexist']           = 'L\'arxiu ya existix. No s\'ha fet res.';
+$lang['uploadbadcontent']      = 'El contingut enviat no coincidix en l\'extensió de l\'archiu %s';
+$lang['uploadspam']            = 'L\'enviament ha segut bloquejat per la llista anti-spam.';
+$lang['uploadxss']             = 'L\'enviament ha segut bloquejat per ser possiblement perillós.';
+$lang['uploadsize']            = 'L\'archiu enviat és massa gran. (màx. %s)';
+$lang['deletesucc']            = 'S\'ha borrat l\'archiu "%s".';
+$lang['deletefail']            = 'No s\'ha pogut borrar "%s" - comprove els permissos.';
+$lang['mediainuse']            = 'L\'arxiu "%s" no s\'ha borrat - encara s\'està utilisant.';
+$lang['namespaces']            = 'Espais de noms';
+$lang['mediafiles']            = 'Archius disponibles en';
+$lang['js']['searchmedia']     = 'Buscar archius';
+$lang['js']['keepopen']        = 'Mantindre la finestra oberta al seleccionar';
+$lang['js']['hidedetails']     = 'Ocultar detalls';
+$lang['js']['nosmblinks']      = 'Els vínculs a recursos compartits de Windows només funcionen en Microsoft Internet Explorer. No obstant, es poden copiar i apegar.';
+$lang['js']['linkwiz']         = 'Assistent de vínculs';
+$lang['js']['linkto']          = 'Vincular a:';
+$lang['js']['del_confirm']     = '¿Realment vol borrar el(s) ítem(s) seleccionat(s)?';
+$lang['mediausage']            = 'Utilize la següent sintaxis per a referenciar est archiu:';
+$lang['mediaview']             = 'Vore l\'archiu original';
+$lang['mediaroot']             = 'base';
+$lang['mediaupload']           = 'Enviar un arxiu a l\'espai de noms actual. Per a crear sub-espais, afigga\'ls separats per dos punts davant del nom de l\'arxiu que pose en "Enviar com".';
+$lang['mediaextchange']        = '¡Extensió de l\'archiu canviada de .%s a .%s!';
+$lang['reference']             = 'Referències per a';
+$lang['ref_inuse']             = 'No es pot borrar l\'arxiu perque encara s\'utilisa en les següents pàgines:';
+$lang['ref_hidden']            = 'Algunes referències estan en pàgines que no té permissos per a vore';
+$lang['hits']                  = 'Encerts';
+$lang['quickhits']             = 'Noms de pàgines coincidents';
+$lang['toc']                   = 'Taula de continguts';
+$lang['current']               = 'Actual';
+$lang['yours']                 = 'La seua versió';
+$lang['diff']                  = 'Mostrar diferències en la versió actual';
+$lang['diff2']                 = 'Mostrar diferències entre versions';
+$lang['line']                  = 'Llínea';
+$lang['breadcrumb']            = 'Traça:';
+$lang['youarehere']            = 'Vosté està ací:';
+$lang['lastmod']               = 'Última modificació el:';
+$lang['by']                    = 'per';
+$lang['deleted']               = 'borrat';
+$lang['created']               = 'creat';
+$lang['restored']              = 'restaurada l\'última versió (%s)';
+$lang['external_edit']         = 'edició externa';
+$lang['summary']               = 'Editar sumari';
+$lang['noflash']               = 'Necessita el <a href="http://www.adobe.com/products/flashplayer/">plúgin d\'Adobe Flash</a> per a vore este contingut.';
+$lang['download']              = 'Descarregar un tros';
+$lang['mail_newpage']          = 'pàgina afegida:';
+$lang['mail_changed']          = 'pàgina canviada:';
+$lang['mail_new_user']         = 'Usuari nou:';
+$lang['mail_upload']           = 'archiu enviat:';
+$lang['qb_bold']               = 'Negreta';
+$lang['qb_italic']             = 'Itàlica';
+$lang['qb_underl']             = 'Subrallat';
+$lang['qb_code']               = 'Còdic';
+$lang['qb_strike']             = 'Tachat';
+$lang['qb_h1']                 = 'Titular de nivell 1';
+$lang['qb_h2']                 = 'Titular de nivell 2';
+$lang['qb_h3']                 = 'Titular de nivell 3';
+$lang['qb_h4']                 = 'Titular de nivell 4';
+$lang['qb_h5']                 = 'Titular de nivell 5';
+$lang['qb_h']                  = 'Titular';
+$lang['qb_hs']                 = 'Triar titular';
+$lang['qb_hplus']              = 'Titular superior';
+$lang['qb_hminus']             = 'Titular inferior';
+$lang['qb_hequal']             = 'Titular al mateix nivell';
+$lang['qb_link']               = 'Víncul intern';
+$lang['qb_extlink']            = 'Víncul extern';
+$lang['qb_hr']                 = 'Llínea horisontal';
+$lang['qb_ol']                 = 'Llista numerada';
+$lang['qb_ul']                 = 'Llista ';
+$lang['qb_media']              = 'Afegir imàgens i atres archius';
+$lang['qb_sig']                = 'Afegir firma';
+$lang['qb_smileys']            = 'Smileys';
+$lang['qb_chars']              = 'Caràcters especials';
+$lang['upperns']               = 'anar a l\'espai de noms superior';
+$lang['metaedit']              = 'Editar meta-senyes';
+$lang['metasaveerr']           = 'Error escrivint meta-senyes';
+$lang['metasaveok']            = 'Meta-senyes guardades';
+$lang['btn_img_backto']        = 'Tornar a %s';
+$lang['img_title']             = 'Títol:';
+$lang['img_caption']           = 'Subtítol:';
+$lang['img_date']              = 'Data:';
+$lang['img_fname']             = 'Nom de l\'arxiu:';
+$lang['img_fsize']             = 'Tamany:';
+$lang['img_artist']            = 'Fotógraf:';
+$lang['img_copyr']             = 'Copyright:';
+$lang['img_format']            = 'Format:';
+$lang['img_camera']            = 'Càmara:';
+$lang['img_keywords']          = 'Paraules clau:';
+$lang['authtempfail']          = 'L\'autenticació d\'usuaris està desactivada temporalment. Si la situació persistix, per favor, informe a l\'administrador del Wiki.';
+$lang['i_chooselang']          = 'Trie l\'idioma';
+$lang['i_installer']           = 'Instal·lador de DokuWiki';
+$lang['i_wikiname']            = 'Nom del Wiki';
+$lang['i_enableacl']           = 'Activar ACL (recomanat)';
+$lang['i_superuser']           = 'Super-usuari';
+$lang['i_problems']            = 'L\'instalador ha trobat els problemes mostrats més avall. No pot continuar fins que no els arregle.';
+$lang['i_modified']            = 'Per raons de seguritat, este procés només funcionarà en una instalació nova i verge de DokuWiki.
+Deuria tornar a extraure els archius del paquet que ha descarregat o consultar les
+<a href="http://dokuwiki.org/install">instruccions d\'instalació de Dokuwiki</a> completes';
+$lang['i_funcna']              = 'La funció de PHP <code>%s</code> no està disponible. ¿Pot ser que el seu proveïdor d\'hostage l\'haja desactivada per algun motiu?';
+$lang['i_phpver']              = 'La versió de PHP <code>%s</code> és menor que
+la <code>%s</code> que es necessita. Necessita actualitzar PHP.';
+$lang['i_permfail']            = 'DokuWiki no pot escriure en <code>%s</code>. ¡Necessita arreglar els permissos d\'este directori!';
+$lang['i_confexists']          = '<code>%s</code> ya existix';
+$lang['i_writeerr']            = 'No es pot crear <code>%s</code>. Haurà de comprovar els permissos del directori/archiu i crear manualment l\'arxiu.';
+$lang['i_badhash']             = 'dokuwiki.php substituït o modificat (hash=<code>%s</code>)';
+$lang['i_badval']              = '<code>%s</code> - valor illegal o buit';
+$lang['i_success']             = 'La configuració ha finalisat correctament. Ya pot borrar l\'arxiu install.php. Passe al
+<a href="doku.php?id=wiki:welcome">nou DokuWiki</a>.';
+$lang['i_failure']             = 'Han aparegut alguns erros escrivint els archius de configuració. Deurà arreglar-los manualment abans de que
+puga utilisar el <a href="doku.php?id=wiki:welcome">nou DokuWiki</a>.';
+$lang['i_policy']              = 'Política inicial ACL';
+$lang['i_pol0']                = 'Wiki obert (llegir, escriure i enviar tots)';
+$lang['i_pol1']                = 'Wiki públic (llegir tots, escriure i enviar només usuaris registrats)';
+$lang['i_pol2']                = 'Wiki tancat (llegir, escriure i enviar només usuaris registrats)';
+$lang['i_retry']               = 'Reintentar';
+$lang['recent_global']         = 'Està veent els canvis dins de l\'espai de noms <b>%s</b>. També pot <a href="%s">vore els canvis recents en el wiki sancer</a>.';
+$lang['years']                 = 'fa %d anys';
+$lang['months']                = 'fa %d mesos';
+$lang['weeks']                 = 'fa %d semanes';
+$lang['days']                  = 'fa %d dies';
+$lang['hours']                 = 'fa %d hores';
+$lang['minutes']               = 'fa %d minuts';
+$lang['seconds']               = 'fa %d segons';
+$lang['email_signature_text'] = 'Este correu ha segut generat per DokuWiki en
+@DOKUWIKIURL@';
+
diff --git a/wiki/inc/lang/ca-valencia/locked.txt b/wiki/inc/lang/ca-valencia/locked.txt
new file mode 100644
index 0000000..bdb2bdf
--- /dev/null
+++ b/wiki/inc/lang/ca-valencia/locked.txt
@@ -0,0 +1,3 @@
+====== Pàgina bloquejada ======
+
+Esta pàgina està actualment bloquejada mentres l'edita un atre usuari. Ha d'esperar fins que l'usuari acabe d'editar la pàgina o vença el bloqueig.
diff --git a/wiki/inc/lang/ca-valencia/login.txt b/wiki/inc/lang/ca-valencia/login.txt
new file mode 100644
index 0000000..23cfd98
--- /dev/null
+++ b/wiki/inc/lang/ca-valencia/login.txt
@@ -0,0 +1,4 @@
+====== Inici de sessió ======
+
+Encara no ha iniciat sessió! Introduïxca les seues credencials d'autenticació per a iniciar-la. Necessita tindre les galetes del navegador activades.
+
diff --git a/wiki/inc/lang/ca-valencia/mailtext.txt b/wiki/inc/lang/ca-valencia/mailtext.txt
new file mode 100644
index 0000000..b9de236
--- /dev/null
+++ b/wiki/inc/lang/ca-valencia/mailtext.txt
@@ -0,0 +1,12 @@
+S'ha afegit o modificat una pàgina en el seu DokuWiki. Les senyes són:
+
+Data: @DATE@
+Navegador: @BROWSER@
+Direcció IP: @IPADDRESS@
+Nom de la màquina: @HOSTNAME@
+Revisió anterior: @OLDPAGE@
+Nova revisió: @NEWPAGE@
+Resum: @SUMMARY@
+Usuari: @USER@
+
+@DIFF@
diff --git a/wiki/inc/lang/ca-valencia/newpage.txt b/wiki/inc/lang/ca-valencia/newpage.txt
new file mode 100644
index 0000000..9605ab0
--- /dev/null
+++ b/wiki/inc/lang/ca-valencia/newpage.txt
@@ -0,0 +1,3 @@
+====== Este tema encara no existix ======
+
+Ha seguit un víncul a una pàgina que encara no existix. Si té els permissos necessaris pot crear-la utilizant el botó ''Crear esta pàgina''.
diff --git a/wiki/inc/lang/ca-valencia/norev.txt b/wiki/inc/lang/ca-valencia/norev.txt
new file mode 100644
index 0000000..434e62d
--- /dev/null
+++ b/wiki/inc/lang/ca-valencia/norev.txt
@@ -0,0 +1,3 @@
+====== No existix la versió ======
+
+La versió especificada no existix. Utilise el botó ''Versions antigues'' per a vore una llista de versions antigues d'este document.
\ No newline at end of file
diff --git a/wiki/inc/lang/ca-valencia/password.txt b/wiki/inc/lang/ca-valencia/password.txt
new file mode 100644
index 0000000..d9a781e
--- /dev/null
+++ b/wiki/inc/lang/ca-valencia/password.txt
@@ -0,0 +1,6 @@
+¡Hola @FULLNAME@!
+
+Estes són les seues senyes d'usuari per a @TITLE@ en @DOKUWIKIURL@
+
+Usuari      : @LOGIN@
+Contrasenya : @PASSWORD@
diff --git a/wiki/inc/lang/ca-valencia/preview.txt b/wiki/inc/lang/ca-valencia/preview.txt
new file mode 100644
index 0000000..e4cddec
--- /dev/null
+++ b/wiki/inc/lang/ca-valencia/preview.txt
@@ -0,0 +1,4 @@
+====== Previsualisació ======
+
+Açò es una previsualització per a vore cóm quedarà la pàgina. Recorde que encara no està guardada!
+
diff --git a/wiki/inc/lang/ca-valencia/pwconfirm.txt b/wiki/inc/lang/ca-valencia/pwconfirm.txt
new file mode 100644
index 0000000..a537567
--- /dev/null
+++ b/wiki/inc/lang/ca-valencia/pwconfirm.txt
@@ -0,0 +1,11 @@
+¡Hola @FULLNAME@!
+
+Algú ha solicitat una nova contrasenya per a entrar com a
+@TITLE en @DOKUWIKIURL@
+
+Si no ha segut vosté qui ha solicitat la nova contrasenya ignore este correu.
+
+Per a confirmar que la petició ha segut feta realment per vosté
+utilise el següent víncul.
+
+@CONFIRM@
diff --git a/wiki/inc/lang/ca-valencia/read.txt b/wiki/inc/lang/ca-valencia/read.txt
new file mode 100644
index 0000000..28e4245
--- /dev/null
+++ b/wiki/inc/lang/ca-valencia/read.txt
@@ -0,0 +1,2 @@
+Esta pàgina és només de llectura. Pot vore el còdic font, pero no pot canviar-lo. Pregunte a l'administrador si creu que és un error.
+
diff --git a/wiki/inc/lang/ca-valencia/recent.txt b/wiki/inc/lang/ca-valencia/recent.txt
new file mode 100644
index 0000000..ca1f5c5
--- /dev/null
+++ b/wiki/inc/lang/ca-valencia/recent.txt
@@ -0,0 +1,5 @@
+====== Canvis recents ======
+
+Les següents pàgines han canviat recentment.
+
+
diff --git a/wiki/inc/lang/ca-valencia/register.txt b/wiki/inc/lang/ca-valencia/register.txt
new file mode 100644
index 0000000..ec4ff8b
--- /dev/null
+++ b/wiki/inc/lang/ca-valencia/register.txt
@@ -0,0 +1,4 @@
+====== Registrar-se com a usuari nou ======
+
+Escriga tota la informació que se li demana al davall per a crear un nou conte en este wiki. Assegure's de donar una **direcció de correu electrònic vàlida** - si no se li demana una contrasenya ací se li enviarà a eixa adreça. El nom d'usuari deuria ser un [[doku>pagename|nom de pàgina]] vàlid.
+
diff --git a/wiki/inc/lang/ca-valencia/registermail.txt b/wiki/inc/lang/ca-valencia/registermail.txt
new file mode 100644
index 0000000..02f2c1a
--- /dev/null
+++ b/wiki/inc/lang/ca-valencia/registermail.txt
@@ -0,0 +1,10 @@
+S'ha registrat un usuari nou. Estes són les senyes:
+
+Nom d'usuari : @NEWUSER@
+Nom complet : @NEWNAME@
+Correu electrònic : @NEWEMAIL@
+
+Data : @DATE@
+Navegador : @BROWSER@
+Direcció IP : @IPADDRESS@
+Nom de la màquina : @HOSTNAME@
diff --git a/wiki/inc/lang/ca-valencia/resendpwd.txt b/wiki/inc/lang/ca-valencia/resendpwd.txt
new file mode 100644
index 0000000..2feac09
--- /dev/null
+++ b/wiki/inc/lang/ca-valencia/resendpwd.txt
@@ -0,0 +1,4 @@
+====== Enviar contrasenya nova ======
+
+Per favor, introduïxca el nom d'usuari en el formulari per a demanar una nova contrasenya per al seu conte en este wiki. Se li enviarà un víncul de confirmació a la direcció de correu en que estiga registrat.
+
diff --git a/wiki/inc/lang/ca-valencia/revisions.txt b/wiki/inc/lang/ca-valencia/revisions.txt
new file mode 100644
index 0000000..d83a2e9
--- /dev/null
+++ b/wiki/inc/lang/ca-valencia/revisions.txt
@@ -0,0 +1,4 @@
+====== Versions antigues ======
+
+Versions antigues del document actual. Per a recuperar una versió anterior de la pàgina, tríe-la ací baix, pulse ''Editar esta pàgina'' i guarde-la.
+
diff --git a/wiki/inc/lang/ca-valencia/searchpage.txt b/wiki/inc/lang/ca-valencia/searchpage.txt
new file mode 100644
index 0000000..390d606
--- /dev/null
+++ b/wiki/inc/lang/ca-valencia/searchpage.txt
@@ -0,0 +1,4 @@
+====== Buscar ======
+
+Pot vore els resultats de la busca ací baix.  @CREATEPAGEINFO@
+
diff --git a/wiki/inc/lang/ca-valencia/showrev.txt b/wiki/inc/lang/ca-valencia/showrev.txt
new file mode 100644
index 0000000..86f2822
--- /dev/null
+++ b/wiki/inc/lang/ca-valencia/showrev.txt
@@ -0,0 +1,2 @@
+**¡Açò és una versió antiga del document!**
+----
diff --git a/wiki/inc/lang/ca-valencia/stopwords.txt b/wiki/inc/lang/ca-valencia/stopwords.txt
new file mode 100644
index 0000000..39c5bb3
--- /dev/null
+++ b/wiki/inc/lang/ca-valencia/stopwords.txt
@@ -0,0 +1,73 @@
+# This is a list of words the indexer ignores, one word per line
+# When you edit this file be sure to use UNIX line endings (single newline)
+# No need to include words shorter than 3 chars - these are ignored anyway
+ell
+ella
+nosaltres
+vosaltres
+ells
+els
+los
+dels
+les
+una
+uns
+unes
+seu
+seua
+seus
+seues
+meu
+meua
+meus
+meues
+teu
+teua
+teus
+teues
+nostre
+nostres
+vostre
+vostres
+nos
+vos
+#eix
+eixe
+eixa
+aquell
+aquella
+aquells
+aquelles
+#est
+este
+esta
+estos
+estes
+està
+això
+açò
+allò
+des
+sóc
+eres
+som
+sou
+són
+fon
+per
+com
+cóm
+qui
+que
+què
+quan
+quant
+quants
+quanta
+quantes
+mentres
+però
+atre
+atra
+atres
+també
diff --git a/wiki/inc/lang/ca-valencia/updateprofile.txt b/wiki/inc/lang/ca-valencia/updateprofile.txt
new file mode 100644
index 0000000..9116fed
--- /dev/null
+++ b/wiki/inc/lang/ca-valencia/updateprofile.txt
@@ -0,0 +1,5 @@
+====== Actualise el seu perfil ======
+
+Només deu completar els camps que vol canviar. No es pot canviar el nom d'usuari.
+
+
diff --git a/wiki/inc/lang/ca-valencia/uploadmail.txt b/wiki/inc/lang/ca-valencia/uploadmail.txt
new file mode 100644
index 0000000..a67397d
--- /dev/null
+++ b/wiki/inc/lang/ca-valencia/uploadmail.txt
@@ -0,0 +1,10 @@
+S'ha enviat un archiu al seu DokuWiki. Les senyes:
+
+Arxiu: @MEDIA@
+Data: @DATE@
+Navegador: @BROWSER@
+Direcció IP: @IPADDRESS@
+Nom de la màquina: @HOSTNAME@
+Tamany: @SIZE@
+Tipo MIME: @MIME@
+Usuari: @USER@
diff --git a/wiki/inc/lang/ca/admin.txt b/wiki/inc/lang/ca/admin.txt
new file mode 100644
index 0000000..5c0a6d0
--- /dev/null
+++ b/wiki/inc/lang/ca/admin.txt
@@ -0,0 +1,4 @@
+====== Administració ======
+
+Heus ací una llista de les tasques administratives disponibles en DokuWiki.
+
diff --git a/wiki/inc/lang/ca/adminplugins.txt b/wiki/inc/lang/ca/adminplugins.txt
new file mode 100644
index 0000000..9ea165c
--- /dev/null
+++ b/wiki/inc/lang/ca/adminplugins.txt
@@ -0,0 +1 @@
+===== Connectors addicionals =====
\ No newline at end of file
diff --git a/wiki/inc/lang/ca/backlinks.txt b/wiki/inc/lang/ca/backlinks.txt
new file mode 100644
index 0000000..e2ecaf4
--- /dev/null
+++ b/wiki/inc/lang/ca/backlinks.txt
@@ -0,0 +1,4 @@
+====== Enllaços ======
+
+Heus ací una llista de pàgines enllaçades amb la pàgina actual.
+
diff --git a/wiki/inc/lang/ca/conflict.txt b/wiki/inc/lang/ca/conflict.txt
new file mode 100644
index 0000000..53183f0
--- /dev/null
+++ b/wiki/inc/lang/ca/conflict.txt
@@ -0,0 +1,6 @@
+====== Hi ha una versió més recent ======
+
+Existeix una versió més recent del document que heu editat. Això passa quan un altre usuari canvia el document mentre l'estàveu editant.
+
+Examineu detingudament les diferències que es mostren més avall i després decidiu quina versió voleu mantenir. Si trieu ''desa'', es desarà la vostra versió. Si trieu ''cancel·la'' es mantindrà la versió actual.
+
diff --git a/wiki/inc/lang/ca/denied.txt b/wiki/inc/lang/ca/denied.txt
new file mode 100644
index 0000000..3f66d6b
--- /dev/null
+++ b/wiki/inc/lang/ca/denied.txt
@@ -0,0 +1,4 @@
+====== Permís denegat ======
+
+No teniu prou drets per continuar.
+
diff --git a/wiki/inc/lang/ca/diff.txt b/wiki/inc/lang/ca/diff.txt
new file mode 100644
index 0000000..83ca867
--- /dev/null
+++ b/wiki/inc/lang/ca/diff.txt
@@ -0,0 +1,4 @@
+====== Diferències ======
+
+Ací es mostren les diferències entre la revisió seleccionada i la versió actual de la pàgina.
+
diff --git a/wiki/inc/lang/ca/draft.txt b/wiki/inc/lang/ca/draft.txt
new file mode 100644
index 0000000..68593c2
--- /dev/null
+++ b/wiki/inc/lang/ca/draft.txt
@@ -0,0 +1,5 @@
+====== S'ha trobat un esborrany ======
+
+La darrera sessió vostra d'edició d'aquesta pàgina no es va completar correctament. DokuWiki en va desar automàticament un esborrany mentre treballàveu, el qual podeu utilitzar ara per continuar l'edició. Més avall podeu veure la data i hora en què es va desar durant la vostra darrera sessió.
+
+Decidiu si voleu //recuperar// la vostra darrera sessió d'edició, //suprimir// l'esborrany que es va desar automàticament o //cancel·lar// el procés d'edició.
\ No newline at end of file
diff --git a/wiki/inc/lang/ca/edit.txt b/wiki/inc/lang/ca/edit.txt
new file mode 100644
index 0000000..743b0ff
--- /dev/null
+++ b/wiki/inc/lang/ca/edit.txt
@@ -0,0 +1,2 @@
+Editeu la pàgina i premeu ''Desa''. Per a més informació sobre la sintaxi Wiki vegeu [[wiki:syntax|sintaxi]]. Si us plau, editeu la pàgina només si podeu **millorar-la**. Si voleu fer proves, aprengueu a donar les primeres passes al [[playground:playground|pati]].
+
diff --git a/wiki/inc/lang/ca/editrev.txt b/wiki/inc/lang/ca/editrev.txt
new file mode 100644
index 0000000..b2f304c
--- /dev/null
+++ b/wiki/inc/lang/ca/editrev.txt
@@ -0,0 +1,2 @@
+**Heu penjat una revisió anterior del document.** Si la deseu, creareu una nova versió amb aquestes dades.
+----
diff --git a/wiki/inc/lang/ca/index.txt b/wiki/inc/lang/ca/index.txt
new file mode 100644
index 0000000..6ba71fd
--- /dev/null
+++ b/wiki/inc/lang/ca/index.txt
@@ -0,0 +1,4 @@
+====== Índex ======
+
+Heus ací un índex de totes les pàgines disponibles, ordenades per [[doku>namespaces|espais]].
+
diff --git a/wiki/inc/lang/ca/install.html b/wiki/inc/lang/ca/install.html
new file mode 100644
index 0000000..363e598
--- /dev/null
+++ b/wiki/inc/lang/ca/install.html
@@ -0,0 +1,8 @@
+<p>Aquesta pàgina us ajuda a fer la primera instal·lació i la configuració de <a href="http://dokuwiki.org">Dokuwiki</a>. Hi ha més informació sobre aquest instal·lador en la seva <a href="http://dokuwiki.org/installer">pàgina de documentació</a>.</p>
+
+<p>DokuWiki utilitza fitxers normals per a emmagatzemar les pàgines wiki i la informació associada a aquestes pàgines (p. ex. imatges, índexs de cerca, revisions anteriors, etc.). Per tal de funcionar correctament DokuWiki <strong>necessita</strong> tenir accés d'escriptura als directoris que contenen aquests fitxers. Aquest instal·lador no pot configurar els permisos del directori. Normalment això cal fer-ho directament en la línia d'ordres o, si esteu utilitzant un hostatge, mitjançant FTP o el tauler de control del vostre hostatge (p. ex. cPanel).</p>
+
+<p>Aquest instal·lador configurarà el vostre DokuWiki per a <abbr title="access control list">ACL</abbr>, cosa que, al seu torn, permet l'accés de l'administrador al menú d'administració, on pot instal·lar connectors, gestionar usuaris, gestionar l'accés a les pàgines wiki i modificar els paràmetres de configuració. No és un requisit per al funcionament de DokuWiki, però el fa més fàcil d'administrar.</p>
+
+<p>Els usuaris experts o els que tinguin requeriments específics poden utilitzar els enllaços següents per a obtenir més detalls sobre <a href="http://dokuwiki.org/install">instruccions d'instal·lació</a>
+i <a href="http://dokuwiki.org/config">paràmetres de configuració</a>.</p>
\ No newline at end of file
diff --git a/wiki/inc/lang/ca/jquery.ui.datepicker.js b/wiki/inc/lang/ca/jquery.ui.datepicker.js
new file mode 100644
index 0000000..9febd90
--- /dev/null
+++ b/wiki/inc/lang/ca/jquery.ui.datepicker.js
@@ -0,0 +1,37 @@
+/* Inicialització en català per a l'extensió 'UI date picker' per jQuery. */
+/* Writers: (joan.leon@gmail.com). */
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "../widgets/datepicker" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery.datepicker );
+	}
+}( function( datepicker ) {
+
+datepicker.regional.ca = {
+	closeText: "Tanca",
+	prevText: "Anterior",
+	nextText: "Següent",
+	currentText: "Avui",
+	monthNames: [ "gener","febrer","març","abril","maig","juny",
+	"juliol","agost","setembre","octubre","novembre","desembre" ],
+	monthNamesShort: [ "gen","feb","març","abr","maig","juny",
+	"jul","ag","set","oct","nov","des" ],
+	dayNames: [ "diumenge","dilluns","dimarts","dimecres","dijous","divendres","dissabte" ],
+	dayNamesShort: [ "dg","dl","dt","dc","dj","dv","ds" ],
+	dayNamesMin: [ "dg","dl","dt","dc","dj","dv","ds" ],
+	weekHeader: "Set",
+	dateFormat: "dd/mm/yy",
+	firstDay: 1,
+	isRTL: false,
+	showMonthAfterYear: false,
+	yearSuffix: "" };
+datepicker.setDefaults( datepicker.regional.ca );
+
+return datepicker.regional.ca;
+
+} ) );
diff --git a/wiki/inc/lang/ca/lang.php b/wiki/inc/lang/ca/lang.php
new file mode 100644
index 0000000..5133b37
--- /dev/null
+++ b/wiki/inc/lang/ca/lang.php
@@ -0,0 +1,347 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Carles Bellver <carles.bellver@cent.uji.es>
+ * @author Carles Bellver <carles.bellver@gmail.com>
+ * @author daniel@6temes.cat
+ * @author Eduard Díaz <edudiaz@scopia.es>
+ * @author controlonline.net <controlonline.net@gmail.com>
+ * @author Pauet <pauet@gmx.com>
+ * @author Àngel Pérez Beroy <aperezberoy@gmail.com>
+ * @author David Surroca <david.tb303@gmail.com>
+ */
+$lang['encoding']              = 'utf-8';
+$lang['direction']             = 'ltr';
+$lang['doublequoteopening']    = '“';
+$lang['doublequoteclosing']    = '”';
+$lang['singlequoteopening']    = '‘';
+$lang['singlequoteclosing']    = '’';
+$lang['apostrophe']            = '’';
+$lang['btn_edit']              = 'Edita aquesta pàgina';
+$lang['btn_source']            = 'Mostra codi font';
+$lang['btn_show']              = 'Mostra pàgina';
+$lang['btn_create']            = 'Crea aquesta pàgina';
+$lang['btn_search']            = 'Cerca';
+$lang['btn_save']              = 'Desa';
+$lang['btn_preview']           = 'Previsualitza';
+$lang['btn_top']               = 'Torna dalt';
+$lang['btn_newer']             = '<< més recent';
+$lang['btn_older']             = 'menys recent >>';
+$lang['btn_revs']              = 'Revisions anteriors';
+$lang['btn_recent']            = 'Canvis recents';
+$lang['btn_upload']            = 'Penja';
+$lang['btn_cancel']            = 'Cancel·la';
+$lang['btn_index']             = 'Mapa del lloc';
+$lang['btn_secedit']           = 'Edita';
+$lang['btn_login']             = 'Entra';
+$lang['btn_logout']            = 'Surt';
+$lang['btn_admin']             = 'Admin';
+$lang['btn_update']            = 'Actualitza';
+$lang['btn_delete']            = 'Suprimeix';
+$lang['btn_back']              = 'Enrere';
+$lang['btn_backlink']          = 'Què hi enllaça';
+$lang['btn_subscribe']         = 'Subscripció a canvis d\'aquesta pàgina';
+$lang['btn_profile']           = 'Actualització del perfil';
+$lang['btn_reset']             = 'Reinicia';
+$lang['btn_resendpwd']         = 'Estableix una nova contrasenya';
+$lang['btn_draft']             = 'Edita esborrany';
+$lang['btn_recover']           = 'Recupera esborrany';
+$lang['btn_draftdel']          = 'Suprimeix esborrany';
+$lang['btn_revert']            = 'Restaura';
+$lang['btn_register']          = 'Registra\'m';
+$lang['btn_apply']             = 'Aplica';
+$lang['btn_media']             = 'Mànager Multimèdia';
+$lang['btn_deleteuser']        = 'Esborrar compte';
+$lang['btn_img_backto']        = 'Torna a %s';
+$lang['btn_mediaManager']      = 'Veure a multimèdia mànager ';
+$lang['loggedinas']            = 'Heu entrat com:';
+$lang['user']                  = 'Nom d\'usuari';
+$lang['pass']                  = 'Contrasenya';
+$lang['newpass']               = 'Nova contrasenya';
+$lang['oldpass']               = 'Confirmeu la contrasenya actual';
+$lang['passchk']               = 'una altra vegada';
+$lang['remember']              = 'Recorda\'m';
+$lang['fullname']              = 'Nom complet';
+$lang['email']                 = 'Correu electrònic';
+$lang['profile']               = 'Perfil d\'usuari';
+$lang['badlogin']              = 'Nom d\'usuari o contrasenya incorrectes.';
+$lang['badpassconfirm']        = 'Contrasenya incorrecta';
+$lang['minoredit']             = 'Canvis menors';
+$lang['draftdate']             = 'L\'esborrany s\'ha desat automàticament';
+$lang['nosecedit']             = 'Mentrestant la pàgina ha estat modificada. La informació de seccions estava obsoleta i ha calgut carregar la pàgina sencera.';
+$lang['regmissing']            = 'Heu d\'omplir tots els camps.';
+$lang['reguexists']            = 'Ja existeix un altre usuari amb aquest nom.';
+$lang['regsuccess']            = 'S\'ha creat l\'usuari. La contrasenya s\'ha enviat per correu.';
+$lang['regsuccess2']           = 'S\'ha creat l\'usuari.';
+$lang['regfail']               = 'L\'usuari no pot ser creat';
+$lang['regmailfail']           = 'Sembla que un error ha impedit enviar la contrasenya per correu. Contacteu amb l\'administrador.';
+$lang['regbadmail']            = 'L\'adreça de correu que heu donat no sembla vàlida. Si creieu que això és un error, contacu amb l\'administrador.';
+$lang['regbadpass']            = 'Les dues contrasenyes no són iguals. Torneu a intentar-ho.';
+$lang['regpwmail']             = 'La vostra contrasenya per al Wiki';
+$lang['reghere']               = 'Si no teniu un compte, aquí en podeu obtenir un';
+$lang['profna']                = 'Aquest wiki no permet modificar el perfil';
+$lang['profnochange']          = 'No heu introduït cap canvi.';
+$lang['profnoempty']           = 'No es pot deixar en blanc el nom o l\'adreça de correu.';
+$lang['profchanged']           = 'El perfil d\'usuari s\'ha actualitzat correctament.';
+$lang['profnodelete']          = 'Aquesta wiki no permet esborrar usuaris';
+$lang['profdeleteuser']        = 'Esborrar compte';
+$lang['profdeleted']           = 'El vostre compte ha sigut esborrat d\'aquest compte';
+$lang['profconfdelete']        = 'Vull esmorrar el meu compte d\'aquesta wiki. </br> Aquesta acció no pot desfer-se.';
+$lang['profconfdeletemissing'] = 'Confirmació no acceptada';
+$lang['proffail']              = 'Perfil d\'usuari no actialitzat';
+$lang['pwdforget']             = 'Heu oblidat la contrasenya? Podeu obtenir-ne una de nova.';
+$lang['resendna']              = 'Aquest wiki no permet tornar a enviar la contrasenya.';
+$lang['resendpwd']             = 'Estableix una nova contrasenya per';
+$lang['resendpwdmissing']      = 'Heu d\'emplenar tots els camps.';
+$lang['resendpwdnouser']       = 'No s\'ha pogut trobar aquest usuari a la base de dades.';
+$lang['resendpwdbadauth']      = 'Aquest codi d\'autenticació no és vàlid. Assegureu-vos d\'utilitzar l\'enllaç de confirmació complet.';
+$lang['resendpwdconfirm']      = 'Se us ha enviat per correu electrònic un enllaç de confirmació.';
+$lang['resendpwdsuccess']      = 'Se us ha enviat la nova contrasenya per correu electrònic.';
+$lang['license']               = 'Excepte on es digui una altra cosa, el contingut d\'aquest wiki està subjecte a la llicència següent:';
+$lang['licenseok']             = 'Nota. En editar aquesta pàgina esteu acceptant que el vostre contingut estigui subjecte a la llicència següent:';
+$lang['searchmedia']           = 'Cerca pel nom de fitxer';
+$lang['searchmedia_in']        = 'Cerca en: %s';
+$lang['txt_upload']            = 'Trieu el fitxer que voleu penjar:';
+$lang['txt_filename']          = 'Introduïu el nom wiki (opcional):';
+$lang['txt_overwrt']           = 'Sobreescriu el fitxer actual';
+$lang['maxuploadsize']         = 'Puja com a màxim %s per arxiu.';
+$lang['lockedby']              = 'Actualment blocat per:';
+$lang['lockexpire']            = 'Venciment del blocatge:';
+$lang['js']['willexpire']      = 'El blocatge per a editar aquesta pàgina venç d\'aquí a un minut.\nUtilitzeu la visualització prèvia per reiniciar el rellotge i evitar conflictes.';
+$lang['js']['notsavedyet']     = 'Heu fet canvis que es perdran si no els deseu.
+Voleu continuar?';
+$lang['js']['searchmedia']     = 'Cerca fitxers';
+$lang['js']['keepopen']        = 'Manté la finestra oberta';
+$lang['js']['hidedetails']     = 'Oculta detalls';
+$lang['js']['mediatitle']      = 'Propietats de l\'enllaç';
+$lang['js']['mediadisplay']    = 'Tipus d\'enllaç';
+$lang['js']['mediaalign']      = 'Alineació';
+$lang['js']['mediasize']       = 'Mida de la imatge';
+$lang['js']['mediatarget']     = 'Destí de l\'enllaç';
+$lang['js']['mediaclose']      = 'Tanca';
+$lang['js']['mediainsert']     = 'Inserta';
+$lang['js']['mediadisplayimg'] = 'Mostra la imatge';
+$lang['js']['mediadisplaylnk'] = 'Mostra només l\'enllaç';
+$lang['js']['mediasmall']      = 'Versió petita';
+$lang['js']['mediamedium']     = 'Versió mitjana';
+$lang['js']['medialarge']      = 'Versió gran';
+$lang['js']['mediaoriginal']   = 'Versió original';
+$lang['js']['medialnk']        = 'Enllaç a la pàgina de detalls';
+$lang['js']['mediadirect']     = 'Enllaç directe a l\'original';
+$lang['js']['medianolnk']      = 'No hi ha enllaç';
+$lang['js']['medianolink']     = 'No enllacis la imatge';
+$lang['js']['medialeft']       = 'Alinea la imatge a l\'esquerra.';
+$lang['js']['mediaright']      = 'Alinea la imatge a la dreta.';
+$lang['js']['mediacenter']     = 'Alinea la imatge al mig.';
+$lang['js']['medianoalign']    = 'No facis servir alineació.';
+$lang['js']['nosmblinks']      = 'Els enllaços amb recursos compartits de Windows només funcionen amb el Microsoft Internet Explorer.
+Si voleu podeu copiar i enganxar l\'enllaç.';
+$lang['js']['linkwiz']         = 'Auxiliar d\'enllaços';
+$lang['js']['linkto']          = 'Enllaça a:';
+$lang['js']['del_confirm']     = 'Suprimiu aquesta entrada?';
+$lang['js']['restore_confirm'] = 'Vols realment restaurar aquesta versió?';
+$lang['js']['media_diff']      = 'Veure les diferències:';
+$lang['js']['media_diff_both'] = 'Un al costat de l\'altre';
+$lang['js']['media_diff_opacity'] = 'Resalta';
+$lang['js']['media_diff_portions'] = 'Llisca';
+$lang['js']['media_select']    = 'Escull els arxius';
+$lang['js']['media_upload_btn'] = 'Pujar';
+$lang['js']['media_done_btn']  = 'Fet';
+$lang['js']['media_drop']      = 'Arrossega aquí els arxius a pujar';
+$lang['js']['media_cancel']    = 'esborra';
+$lang['js']['media_overwrt']   = 'Sobreescriu els arxius existents';
+$lang['rssfailed']             = 'S\'ha produït un error en recollir aquesta alimentació: ';
+$lang['nothingfound']          = 'No s\'ha trobat res.';
+$lang['mediaselect']           = 'Selecció de fitxers';
+$lang['uploadsucc']            = 'S\'ha penjat el fitxer';
+$lang['uploadfail']            = 'No es pot penjar el fitxer. Potser no teniu prou permisos?';
+$lang['uploadwrong']           = 'No es pot penjar el fitxer. Aquesta extensió està prohibida.';
+$lang['uploadexist']           = 'El fitxer ja existeix. No s\'ha penjat.';
+$lang['uploadbadcontent']      = 'El contingut que heu penjat coincideix amb l\'extensió de fitxer %s.';
+$lang['uploadspam']            = 'La càrrega ha estat blocada per la llista negra de brossa.';
+$lang['uploadxss']             = 'La càrrega ha estat blocada perquè podria ser un contingut maligne.';
+$lang['uploadsize']            = 'El fitxer que voleu penjar és massa gran (màxim %s)';
+$lang['deletesucc']            = 'S\'ha suprimit el fitxer "%s".';
+$lang['deletefail']            = 'No s\'ha pogut suprimir el fitxer "%s". Comproveu els permisos.';
+$lang['mediainuse']            = 'No s\'ha pogut suprimir el fitxer "%s". Encara s\'està utilitzant.';
+$lang['namespaces']            = 'Espais';
+$lang['mediafiles']            = 'Fitxers disponibles en';
+$lang['accessdenied']          = 'No teniu permís per a veure aquesta pàgina.';
+$lang['mediausage']            = 'Utilitzeu la sintaxi següent per referir-vos a aquest enllaç:';
+$lang['mediaview']             = 'Mostra el fitxer original';
+$lang['mediaroot']             = 'arrel';
+$lang['mediaupload']           = 'Pengeu aquí un fitxer dins de l\'espai actual. Per a crear un nou subespai, poseu-ne el nom davant del nom de fitxer i separeu-los amb el signe de dos punts.';
+$lang['mediaextchange']        = 'S\'ha canviat l\'extensió del fitxer de .%s a .%s';
+$lang['reference']             = 'Referències per a';
+$lang['ref_inuse']             = 'El fitxer no es pot suprimir perquè l\'estan utilitzant les pàgines següents:';
+$lang['ref_hidden']            = 'Algunes referències apareixen en pàgines per a les quals no teniu permís de lectura';
+$lang['hits']                  = 'Resultats';
+$lang['quickhits']             = 'Noms de pàgina coincidents';
+$lang['toc']                   = 'Taula de continguts';
+$lang['current']               = 'actual';
+$lang['yours']                 = 'La vostra versió';
+$lang['diff']                  = 'Mostra diferències amb la versió actual';
+$lang['diff2']                 = 'Mostra diferències entre les revisions seleccionades';
+$lang['difflink']              = 'Enllaç a la visualització de la comparació';
+$lang['diff_type']             = 'Veieu les diferències:';
+$lang['diff_inline']           = 'En línia';
+$lang['diff_side']             = 'Un al costat de l\'altre';
+$lang['diffprevrev']           = 'Revisió prèvia';
+$lang['diffnextrev']           = 'Següent revisió';
+$lang['difflastrev']           = 'Ultima revisió';
+$lang['diffbothprevrev']       = 'Ambdós costats versió prèvia';
+$lang['diffbothnextrev']       = 'Ambdós costats nova versio';
+$lang['line']                  = 'Línia';
+$lang['breadcrumb']            = 'Camí:';
+$lang['youarehere']            = 'Sou aquí:';
+$lang['lastmod']               = 'Darrera modificació:';
+$lang['by']                    = 'per';
+$lang['deleted']               = 'suprimit';
+$lang['created']               = 'creat';
+$lang['restored']              = 's\'ha restaurat una versió anterior %s';
+$lang['external_edit']         = 'edició externa';
+$lang['summary']               = 'Resum d\'edició';
+$lang['noflash']               = 'Per a visualitzar aquest contingut necessiteu el <a href="http://www.adobe.com/products/flashplayer/">connector d\'Adobe Flash</a>.';
+$lang['download']              = 'Baixa el fragment';
+$lang['tools']                 = 'Eines';
+$lang['user_tools']            = 'Eines de l\'usuari';
+$lang['site_tools']            = 'Eines del lloc';
+$lang['page_tools']            = 'Eines de la pàgina';
+$lang['skip_to_content']       = 'salta al contingut';
+$lang['sidebar']               = 'Barra lateral';
+$lang['mail_newpage']          = 'pàgina afegida:';
+$lang['mail_changed']          = 'pàgina modificada:';
+$lang['mail_subscribe_list']   = 'pagines canviades a l0espai de noms:';
+$lang['mail_new_user']         = 'nou usuari:';
+$lang['mail_upload']           = 'fitxer penjat:';
+$lang['changes_type']          = 'Veure els canvis de';
+$lang['pages_changes']         = 'Pàgines';
+$lang['media_changes']         = 'Arxius gràfics';
+$lang['both_changes']          = 'Pàgines i arxius gràfics';
+$lang['qb_bold']               = 'Negreta';
+$lang['qb_italic']             = 'Cursiva';
+$lang['qb_underl']             = 'Subratllat';
+$lang['qb_code']               = 'Codi';
+$lang['qb_strike']             = 'Text barrat';
+$lang['qb_h1']                 = 'Encapçalament nivell 1';
+$lang['qb_h2']                 = 'Encapçalament nivell 2';
+$lang['qb_h3']                 = 'Encapçalament nivell 3';
+$lang['qb_h4']                 = 'Encapçalament nivell 4';
+$lang['qb_h5']                 = 'Encapçalament nivell 5';
+$lang['qb_h']                  = 'Encapçalament';
+$lang['qb_hs']                 = 'Selcciona l\'encapçalament';
+$lang['qb_hplus']              = 'Encapçalament més alt';
+$lang['qb_hminus']             = 'Encapçalament més baix';
+$lang['qb_hequal']             = 'Encapçalament del mateix nivell';
+$lang['qb_link']               = 'Enllaç intern';
+$lang['qb_extlink']            = 'Enllaç extern';
+$lang['qb_hr']                 = 'Ratlla horitzontal';
+$lang['qb_ol']                 = 'Element de llista numerada';
+$lang['qb_ul']                 = 'Element de llista de pics';
+$lang['qb_media']              = 'Afegeix imatges o altres fitxers';
+$lang['qb_sig']                = 'Insereix signatura';
+$lang['qb_smileys']            = 'Emoticones';
+$lang['qb_chars']              = 'Caràcters especials';
+$lang['upperns']               = 'Salta a l\'espai superior';
+$lang['metaedit']              = 'Edita metadades';
+$lang['metasaveerr']           = 'No s\'han pogut escriure les metadades';
+$lang['metasaveok']            = 'S\'han desat les metadades';
+$lang['img_title']             = 'Títol:';
+$lang['img_caption']           = 'Peu d\'imatge:';
+$lang['img_date']              = 'Data:';
+$lang['img_fname']             = 'Nom de fitxer:';
+$lang['img_fsize']             = 'Mida:';
+$lang['img_artist']            = 'Fotògraf:';
+$lang['img_copyr']             = 'Copyright:';
+$lang['img_format']            = 'Format:';
+$lang['img_camera']            = 'Càmera:';
+$lang['img_keywords']          = 'Paraules clau:';
+$lang['img_width']             = 'Ample:';
+$lang['img_height']            = 'Alçada:';
+$lang['subscr_subscribe_success'] = 'S\'ha afegit %s a la llista de subscripcions per %s';
+$lang['subscr_subscribe_error'] = 'Hi ha hagut un error a l\'afegir %s a la llista per %s';
+$lang['subscr_subscribe_noaddress'] = 'No hi ha cap adreça associada pel vostre nom d\'usuari, no podeu ser afegit a la llista de subscripcions';
+$lang['subscr_unsubscribe_success'] = 'S\'ha esborrat %s de la llista de subscripcions per %s';
+$lang['subscr_unsubscribe_error'] = 'Hi ha hagut un error a l\'esborrar %s de la llista de subscripcions per %s';
+$lang['subscr_already_subscribed'] = '%s ja està subscrit a %s';
+$lang['subscr_not_subscribed'] = '%s no està subscrit a %s';
+$lang['subscr_m_not_subscribed'] = 'En aquests moments no esteu subscrit a l\'actual pàgina o espai';
+$lang['subscr_m_new_header']   = 'Afegeix subcripció';
+$lang['subscr_m_current_header'] = 'Subscripcions actuals';
+$lang['subscr_m_unsubscribe']  = 'Donar-se de baixa';
+$lang['subscr_m_subscribe']    = 'Donar-se d\'alta';
+$lang['subscr_m_receive']      = 'Rebre';
+$lang['subscr_style_every']    = 'Envia\'m un correu electrònic per a cada canvi';
+$lang['subscr_style_digest']   = 'Envia\'m un correu electrònic amb un resum dels canvis per a cada pàgina (cada %.2f dies)';
+$lang['subscr_style_list']     = 'llistat de pàgines canviades des de l\'últim correu electrònic  (cada %.2f dies)';
+$lang['authtempfail']          = 'L\'autenticació d\'usuaris no està disponible temporalment. Si aquesta situació persisteix, si us plau informeu els administradors del wiki.';
+$lang['i_chooselang']          = 'Trieu l\'idioma';
+$lang['i_installer']           = 'Instal·lador de DokuWiki';
+$lang['i_wikiname']            = 'Nom del wiki';
+$lang['i_enableacl']           = 'Habilita ACL (recomanat)';
+$lang['i_superuser']           = 'Superusuari';
+$lang['i_problems']            = 'L\'instal·lador ha trobat alguns problemes, que s\'indiquen més avall. No podeu continuar fins que no els hàgiu solucionat.';
+$lang['i_modified']            = 'Per raons de seguretat aquesta seqüència només funciona amb una instal·lació nova i no modificada de Dokuwiki. Hauríeu de tornar a baixar el paquet i/o descomprimir-lo o consultar les <a href="http://dokuwiki.org/install">instruccions d\'instal·lació de Dokuwiki</a> completes';
+$lang['i_funcna']              = 'La funció PHP <code>%s</code> no està disponible. Potser el vostre proveïdor de serveis l\'ha inhabilitada per alguna raó';
+$lang['i_phpver']              = 'La vostra versió de PHP <code>%s</code> és inferior a la requerida <code>%s</code>. Necessiteu actualitzar la vostra instal·lació de PHP.';
+$lang['i_mbfuncoverload']      = 'mbstring.func_overload cal que sigui deshabilitada en php.ini perquè funcioni DokuWiki';
+$lang['i_permfail']            = 'DokuWiki no pot escriure <code>%s</code>. Heu d\'arreglar els permisos d\'aquest directori';
+$lang['i_confexists']          = '<code>%s</code> ja existeix';
+$lang['i_writeerr']            = 'No es pot crear <code>%s</code>. Comproveu els permisos del directori i/o del fitxer i creeu el fitxer manualment.';
+$lang['i_badhash']             = 'dokuwiki.php no reconegut o modificat (hash=<code>%s</code>)';
+$lang['i_badval']              = '<code>%s</code> - valor il·legal o buit';
+$lang['i_success']             = 'La configuració s\'ha acabat amb èxit. Ara podeu suprimir el fitxer install.php. Aneu al <a href="doku.php?id=wiki:welcome">vostre nou DokuWiki</a>.';
+$lang['i_failure']             = 'S\'han produït alguns errors en escriure els fitxers de configuració. Potser caldrà que els arregleu manualment abans d\'utilitzar el <a href="doku.php?id=wiki:welcome">vostre nou DokuWiki</a>.';
+$lang['i_policy']              = 'Política ACL inicial';
+$lang['i_pol0']                = 'Wiki obert (tothom pot llegir, escriure i penjar fitxers)';
+$lang['i_pol1']                = 'Wiki públic (tothom pot llegir, els usuaris registrats poden escriure i penjar fitxers)';
+$lang['i_pol2']                = 'Wiki tancat (només els usuaris registrats poden llegir, escriure i penjar fitxers)';
+$lang['i_allowreg']            = 'Permet d\'autoinscripció d\'usuaris';
+$lang['i_retry']               = 'Reintenta';
+$lang['i_license']             = 'Escolliu el tipus de llicència que voleu fer servir per al vostre contingut:';
+$lang['i_license_none']        = 'No mostrar cap informació sobre llicencies';
+$lang['i_pop_field']           = 'Si us plau, ajuda\'ns a millorar la DokuWiki';
+$lang['i_pop_label']           = 'Una vegada al mes, enviar anònimament dades als programadors de la DokuWiki';
+$lang['recent_global']         = 'Esteu veient els canvis recents de l\'espai <strong>%s</strong>. També podeu veure els <a href="%s">canvis recents de tot el wiki</a>.';
+$lang['years']                 = 'fa %d anys';
+$lang['months']                = 'fa %d mesos';
+$lang['weeks']                 = 'fa %d setmanes';
+$lang['days']                  = 'fa %d dies';
+$lang['hours']                 = 'fa %d hores';
+$lang['minutes']               = 'fa %d minuts';
+$lang['seconds']               = 'fa %d segons';
+$lang['wordblock']             = 'El vostre canvi no s\'ha guardat perquè conté text blocat (spam)';
+$lang['media_uploadtab']       = 'Puja';
+$lang['media_searchtab']       = 'Busca';
+$lang['media_file']            = 'Fitxer';
+$lang['media_viewtab']         = 'Mostra';
+$lang['media_edittab']         = 'Edita';
+$lang['media_historytab']      = 'Històric';
+$lang['media_list_thumbs']     = 'Miniatura';
+$lang['media_list_rows']       = 'Files';
+$lang['media_sort_name']       = 'Nom';
+$lang['media_sort_date']       = 'Data';
+$lang['media_namespaces']      = 'Escolliu l\'espai';
+$lang['media_files']           = 'Arxius a %s';
+$lang['media_upload']          = 'Puja a %s';
+$lang['media_search']          = 'Busca a %s';
+$lang['media_view']            = '%s';
+$lang['media_viewold']         = '%s a %s';
+$lang['media_edit']            = 'Edita %s';
+$lang['media_history']         = 'Històric de %s';
+$lang['media_meta_edited']     = 'metadata editada';
+$lang['media_perm_read']       = 'No teniu permisos suficients per a llegir arxius.';
+$lang['media_perm_upload']     = 'No teniu permisos suficients per a pujar arxius';
+$lang['media_update']          = 'Puja la nova versió';
+$lang['media_restore']         = 'Restaura aquesta versió';
+$lang['media_acl_warning']     = 'Aquesta llista pot no estar completa per restriccions ACL i per llistes ocultes';
+$lang['currentns']             = 'Espai de noms actual';
+$lang['searchresult']          = 'Resultats cerca';
+$lang['plainhtml']             = 'HTML pla';
+$lang['wikimarkup']            = 'Wiki Marcatge';
+$lang['page_nonexist_rev']     = 'Pàgina no existeix a %s. Aixó es conseqüencia d\'haver-la creada a <a href="%s">%s</a>.';
+$lang['unable_to_parse_date']  = 'Impossible de esbrinar el paràmetre "%s".';
+$lang['email_signature_text']  = 'Aquest mail ha estat generat per DokuWiki a
+@DOKUWIKIURL@';
diff --git a/wiki/inc/lang/ca/locked.txt b/wiki/inc/lang/ca/locked.txt
new file mode 100644
index 0000000..93487c2
--- /dev/null
+++ b/wiki/inc/lang/ca/locked.txt
@@ -0,0 +1,3 @@
+====== Pàgina blocada ======
+
+Aquesta pàgina actualment està blocada per a edició per un altre usuari. Haureu d'esperar fins que aquest usuari acabe d'editar-la o fins que venci el blocatge.
diff --git a/wiki/inc/lang/ca/login.txt b/wiki/inc/lang/ca/login.txt
new file mode 100644
index 0000000..37ca4d5
--- /dev/null
+++ b/wiki/inc/lang/ca/login.txt
@@ -0,0 +1,4 @@
+====== Entrada ======
+
+No heu entrat. Introduïu les vostres credencials d'autenticació en aquest formulari. A partir d'aquest moment heu de tenir les galetes habilitades en el vostre navegador.
+
diff --git a/wiki/inc/lang/ca/mailtext.txt b/wiki/inc/lang/ca/mailtext.txt
new file mode 100644
index 0000000..dd7f0c5
--- /dev/null
+++ b/wiki/inc/lang/ca/mailtext.txt
@@ -0,0 +1,11 @@
+S'ha afegit o modificat una pàgina en el vostre wiki. Ací teniu més detalls:
+
+Data           : @DATE@
+Navegador      : @BROWSER@
+IP             : @IPADDRESS@
+Rev. anterior  : @OLDPAGE@
+Rev. actual    : @NEWPAGE@
+Resum d'edició : @SUMMARY@
+Usuari         : @USER@
+
+@DIFF@
diff --git a/wiki/inc/lang/ca/mailwrap.html b/wiki/inc/lang/ca/mailwrap.html
new file mode 100644
index 0000000..d257190
--- /dev/null
+++ b/wiki/inc/lang/ca/mailwrap.html
@@ -0,0 +1,13 @@
+<html>
+<head>
+<title>@TITLE@</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+</head>
+<body>
+
+@HTMLBODY@
+
+<br /><hr />
+<small>@EMAILSIGNATURE@</small>
+</body>
+</html>
\ No newline at end of file
diff --git a/wiki/inc/lang/ca/newpage.txt b/wiki/inc/lang/ca/newpage.txt
new file mode 100644
index 0000000..d0a2db9
--- /dev/null
+++ b/wiki/inc/lang/ca/newpage.txt
@@ -0,0 +1,3 @@
+====== Aquest tema encara no existeix ======
+
+Heu seguit un enllaç a un tema que encara no existeix. Podeu crear-lo per mitjà del botó ''Crea aquesta pàgina''.
diff --git a/wiki/inc/lang/ca/norev.txt b/wiki/inc/lang/ca/norev.txt
new file mode 100644
index 0000000..b5089c5
--- /dev/null
+++ b/wiki/inc/lang/ca/norev.txt
@@ -0,0 +1,5 @@
+====== No existeix aquesta revisió ======
+
+
+La revisió especificada no existeix. Utilitzeu el botó ''Revisions anteriors'' per obtenir una llista de revisions d'aquest document.
+
diff --git a/wiki/inc/lang/ca/password.txt b/wiki/inc/lang/ca/password.txt
new file mode 100644
index 0000000..d4bd9f9
--- /dev/null
+++ b/wiki/inc/lang/ca/password.txt
@@ -0,0 +1,6 @@
+Benvolgut/da @FULLNAME@,
+
+Aquestes són les teves dades per a entrar en @TITLE@ en l'adreça @DOKUWIKIURL@
+
+Usuari      : @LOGIN@
+Contrasenya : @PASSWORD@
diff --git a/wiki/inc/lang/ca/preview.txt b/wiki/inc/lang/ca/preview.txt
new file mode 100644
index 0000000..fa2f98c
--- /dev/null
+++ b/wiki/inc/lang/ca/preview.txt
@@ -0,0 +1,4 @@
+====== Previsualització ======
+
+Heus ací una previsualització del vostre text. Recordeu que encara **no l'heu desat!**
+
diff --git a/wiki/inc/lang/ca/pwconfirm.txt b/wiki/inc/lang/ca/pwconfirm.txt
new file mode 100644
index 0000000..226e126
--- /dev/null
+++ b/wiki/inc/lang/ca/pwconfirm.txt
@@ -0,0 +1,11 @@
+@FULLNAME@,
+
+Algú ha sol·licitat una nova contrasenya per al vostre compte d'usuari en @TITLE@
+@DOKUWIKIURL@
+
+Si no heu fet aquesta sol·licitud, simplement no feu cas de la resta del missatge.
+
+Per confirmar que realment heu sol·licitat una nova contrasenya, utilitzeu
+l'enllaç següent:
+
+@CONFIRM@
diff --git a/wiki/inc/lang/ca/read.txt b/wiki/inc/lang/ca/read.txt
new file mode 100644
index 0000000..e173ad2
--- /dev/null
+++ b/wiki/inc/lang/ca/read.txt
@@ -0,0 +1,2 @@
+Aquesta pàgina és només de lectura. Podeu veure'n el codi font, però no podeu canviar-la. Consulteu el vostre administrador si penseu que això és degut a algun error.
+
diff --git a/wiki/inc/lang/ca/recent.txt b/wiki/inc/lang/ca/recent.txt
new file mode 100644
index 0000000..cea2f5c
--- /dev/null
+++ b/wiki/inc/lang/ca/recent.txt
@@ -0,0 +1,5 @@
+====== Canvis recents ======
+
+Les pàgines següents s'han modificat recentment.
+
+
diff --git a/wiki/inc/lang/ca/register.txt b/wiki/inc/lang/ca/register.txt
new file mode 100644
index 0000000..a91e6df
--- /dev/null
+++ b/wiki/inc/lang/ca/register.txt
@@ -0,0 +1,4 @@
+====== Registre d'un usuari nou ======
+
+Empleneu tota la informació que se us demana per crear un compte nou en aquest wiki. Assegureu-vos que doneu una **adreça de correu vàlida**, on se us enviarà la vostra contrasenya. El nom d'usuari o usuària ha de ser vàlid com a [[doku>pagename|nom de pàgina]].
+
diff --git a/wiki/inc/lang/ca/registermail.txt b/wiki/inc/lang/ca/registermail.txt
new file mode 100644
index 0000000..a15351a
--- /dev/null
+++ b/wiki/inc/lang/ca/registermail.txt
@@ -0,0 +1,10 @@
+S'ha registrat un nou usuari. Heus ací els detalls:
+
+Nom d'usuari: @NEWUSER@
+Nom complet:  @NEWNAME@
+E-mail: @NEWEMAIL@
+
+Data: @DATE@
+Navegador: @BROWSER@
+Adreça IP: @IPADDRESS@
+Ordinador: @HOSTNAME@
diff --git a/wiki/inc/lang/ca/resendpwd.txt b/wiki/inc/lang/ca/resendpwd.txt
new file mode 100644
index 0000000..cd59f89
--- /dev/null
+++ b/wiki/inc/lang/ca/resendpwd.txt
@@ -0,0 +1,3 @@
+====== Nova contrasenya ======
+
+Per sol·licitar una nova contrasenya, introduïu el vostre nom d'usuari en el formulari següent. Se us enviarà un enllaç de confirmació a l'adreça de correu amb què us vau registrar.
\ No newline at end of file
diff --git a/wiki/inc/lang/ca/resetpwd.txt b/wiki/inc/lang/ca/resetpwd.txt
new file mode 100644
index 0000000..565f1d5
--- /dev/null
+++ b/wiki/inc/lang/ca/resetpwd.txt
@@ -0,0 +1,3 @@
+===== Establiu una nova contrasenya =====
+
+Introdueixi una nova contrasenya pel seu compte a aquest wiki.
\ No newline at end of file
diff --git a/wiki/inc/lang/ca/revisions.txt b/wiki/inc/lang/ca/revisions.txt
new file mode 100644
index 0000000..5c044d8
--- /dev/null
+++ b/wiki/inc/lang/ca/revisions.txt
@@ -0,0 +1,4 @@
+====== Revisions anteriors ======
+
+Heus ací les revisions anteriors del document actual. Per restaurar una revisió anterior, seleccioneu-la de la llista, feu clic en ''Edita aquesta pàgina'' i deseu-la.
+
diff --git a/wiki/inc/lang/ca/searchpage.txt b/wiki/inc/lang/ca/searchpage.txt
new file mode 100644
index 0000000..68da58c
--- /dev/null
+++ b/wiki/inc/lang/ca/searchpage.txt
@@ -0,0 +1,4 @@
+====== Cerca ======
+
+Heus ací els resultats de la cerca. @CREATEPAGEINFO@
+
diff --git a/wiki/inc/lang/ca/showrev.txt b/wiki/inc/lang/ca/showrev.txt
new file mode 100644
index 0000000..b141182
--- /dev/null
+++ b/wiki/inc/lang/ca/showrev.txt
@@ -0,0 +1,2 @@
+**Aquesta és una revisió antiga del document**
+----
diff --git a/wiki/inc/lang/ca/stopwords.txt b/wiki/inc/lang/ca/stopwords.txt
new file mode 100644
index 0000000..03be425
--- /dev/null
+++ b/wiki/inc/lang/ca/stopwords.txt
@@ -0,0 +1,106 @@
+# Això és una llista de paraules que seran omeses per l'indexador, una paraula per línia
+# Utilitzeu finals de línia UNIX
+# No cal incloure paraules de menys de 3 caràcters: s'ometran igualment
+# Llista basada en http://www.ranks.nl/stopwords/
+abans
+algun
+alguna
+alguns
+algunes
+altre
+altra
+altres
+amb
+ambdós
+anar
+ans
+aquell
+aquella
+aquelles
+aquells
+aquí
+bastant
+cada
+com
+dalt
+des
+dins
+ell
+ella
+elles
+ells
+els
+ens
+entre
+era
+erem
+eren
+eres
+estan
+estat
+estava
+estem
+esteu
+estic
+està
+ets
+faig
+fan
+fas
+fem
+fer
+feu
+haver
+inclòs
+llarg
+llavors
+mentre
+meu
+mode
+molt
+molts
+nosaltres
+per
+per que
+perquè
+però
+podem
+poden
+poder
+podeu
+potser
+primer
+puc
+quan
+quant
+qui
+sabem
+saben
+saber
+sabeu
+sap
+saps
+sense
+ser
+seu
+seus
+sóc
+solament
+sols
+som
+sota
+també
+tene
+tenim
+tenir
+teniu
+teu
+tinc
+tot
+una
+uns
+unes
+uns
+vaig
+van
+vosaltres
diff --git a/wiki/inc/lang/ca/subscr_digest.txt b/wiki/inc/lang/ca/subscr_digest.txt
new file mode 100644
index 0000000..c5666d2
--- /dev/null
+++ b/wiki/inc/lang/ca/subscr_digest.txt
@@ -0,0 +1,16 @@
+Hola!
+
+La pàgina @PAGE@ al wiki @TITLE@ ha canviat.
+A continuació podeu veure els canvis:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Versió anterior: @OLDPAGE@
+Nova versió: @NEWPAGE@
+
+Si voleu cancel·lar les notificacions per a la pàgina, accediu al wiki a
+@DOKUWIKIURL@, visiteu
+@SUBSCRIBE@
+i doneu-vos de baixa dels canvis de la pàgina o de l'espai.
diff --git a/wiki/inc/lang/ca/subscr_form.txt b/wiki/inc/lang/ca/subscr_form.txt
new file mode 100644
index 0000000..3c63ce6
--- /dev/null
+++ b/wiki/inc/lang/ca/subscr_form.txt
@@ -0,0 +1,3 @@
+===== Gestió de les Subscripcions =====
+
+Des d'aquesta pàgina, podeu gestionar les vostres subscripcions per a les pàgines i els espais que seleccioneu. 
\ No newline at end of file
diff --git a/wiki/inc/lang/ca/subscr_list.txt b/wiki/inc/lang/ca/subscr_list.txt
new file mode 100644
index 0000000..56b9ee9
--- /dev/null
+++ b/wiki/inc/lang/ca/subscr_list.txt
@@ -0,0 +1,16 @@
+Hola!
+
+Alguna(es) pàgina(es) de l'espai @PAGE@ al wiki @TITLE@ han canviat.
+A continuació podeu veure els canvis:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Versió anterior: @OLDPAGE@
+Nova versió: @NEWPAGE@
+
+Si voleu cancel·lar les notificacions per a la pàgina, accediu al wiki a
+@DOKUWIKIURL@, visiteu
+@SUBSCRIBE@
+i doneu-vos de baixa dels canvis de la pàgina o de l'espai.
diff --git a/wiki/inc/lang/ca/subscr_single.txt b/wiki/inc/lang/ca/subscr_single.txt
new file mode 100644
index 0000000..a1711f2
--- /dev/null
+++ b/wiki/inc/lang/ca/subscr_single.txt
@@ -0,0 +1,16 @@
+Hola!
+
+La pàgina  @PAGE@ amb el títol @TITLE@ ha canviat.
+Aquí son els canvis:
+
+-------------------------------------------------------- 
+@DIFF@ 
+--------------------------------------------------------
+
+Data : @DATE@ 
+Usuari : @USER@ 
+Resum edició: @SUMMARY@ 
+Versió vella: @OLDPAGE@ 
+Nova versió: @NEWPAGE@
+
+Per cancel·lar la pàgina de notificacions, entra a la wiki a  @DOKUWIKIURL@ i llavors ves a @SUBSCRIBE@ i desinscriu-te dels canvis dels noms d'espai(namespace) i pàgines.
\ No newline at end of file
diff --git a/wiki/inc/lang/ca/updateprofile.txt b/wiki/inc/lang/ca/updateprofile.txt
new file mode 100644
index 0000000..0ba0226
--- /dev/null
+++ b/wiki/inc/lang/ca/updateprofile.txt
@@ -0,0 +1,3 @@
+====== Actualització del perfil d'usuari ======
+
+Només cal que completeu els camps que vulgueu canviar. El nom d'usuari no es pot canviar.
\ No newline at end of file
diff --git a/wiki/inc/lang/ca/uploadmail.txt b/wiki/inc/lang/ca/uploadmail.txt
new file mode 100644
index 0000000..01b7648
--- /dev/null
+++ b/wiki/inc/lang/ca/uploadmail.txt
@@ -0,0 +1,10 @@
+S'ha penjat un fitxer al vostre DokuWiki. Heus ací els detalls:
+
+Fitxer: @MEDIA@
+Data: @DATE@
+Navegador: @BROWSER@
+Adreça IP: @IPADDRESS@
+Ordinador: @HOSTNAME@
+Mida: @SIZE@
+Tipus MIME: @MIME@
+Usuari: @USER@
diff --git a/wiki/inc/lang/cs/admin.txt b/wiki/inc/lang/cs/admin.txt
new file mode 100644
index 0000000..df7c5b6
--- /dev/null
+++ b/wiki/inc/lang/cs/admin.txt
@@ -0,0 +1,3 @@
+====== Správa ======
+
+Níže je možno spravovat vaší DokuWiki.
diff --git a/wiki/inc/lang/cs/adminplugins.txt b/wiki/inc/lang/cs/adminplugins.txt
new file mode 100644
index 0000000..88e547a
--- /dev/null
+++ b/wiki/inc/lang/cs/adminplugins.txt
@@ -0,0 +1 @@
+===== Další zásuvné moduly =====
\ No newline at end of file
diff --git a/wiki/inc/lang/cs/backlinks.txt b/wiki/inc/lang/cs/backlinks.txt
new file mode 100644
index 0000000..59430ee
--- /dev/null
+++ b/wiki/inc/lang/cs/backlinks.txt
@@ -0,0 +1,3 @@
+====== Zpětné odkazy ======
+
+Zde je seznam stránek, které pravděpodobně odkazují na aktuální stránku.
diff --git a/wiki/inc/lang/cs/conflict.txt b/wiki/inc/lang/cs/conflict.txt
new file mode 100644
index 0000000..b332a47
--- /dev/null
+++ b/wiki/inc/lang/cs/conflict.txt
@@ -0,0 +1,5 @@
+====== Existuje novější verze ======
+
+Existuje novější verze právě upravovaného dokumentu. To se stává, pokud někdo jiný změnil dokument, který právě upravujete.
+
+Prohlédněte si níže uvedené rozdíly, případně rozdíly z obou verzí ručně spojte dohromady a rozhodněte se, kterou verzi uchovat. Pokud zvolíte ''Uložit'', bude uložena vaše verze. Jinak stiskněte ''Zrušit'' pro uchování původní verze.
diff --git a/wiki/inc/lang/cs/denied.txt b/wiki/inc/lang/cs/denied.txt
new file mode 100644
index 0000000..29524e5
--- /dev/null
+++ b/wiki/inc/lang/cs/denied.txt
@@ -0,0 +1,3 @@
+====== Nepovolená akce ======
+
+Promiňte, ale nemáte dostatečná oprávnění k této činnosti.
diff --git a/wiki/inc/lang/cs/diff.txt b/wiki/inc/lang/cs/diff.txt
new file mode 100644
index 0000000..d49e569
--- /dev/null
+++ b/wiki/inc/lang/cs/diff.txt
@@ -0,0 +1,4 @@
+====== Rozdíly ======
+
+Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.
+
diff --git a/wiki/inc/lang/cs/draft.txt b/wiki/inc/lang/cs/draft.txt
new file mode 100644
index 0000000..ebdfb8d
--- /dev/null
+++ b/wiki/inc/lang/cs/draft.txt
@@ -0,0 +1,5 @@
+====== Nalezen koncept ======
+
+Vaše minulá editace této stránky nebyla korektně dokončena. DokuWiki během editace automaticky uložila koncept, který nyní můžete použít a pokračovat v editaci. Níže je vidět text uložený během minulé editace.
+
+Prosím rozhodněte se, jestli chcete automaticky uložený koncept //obnovit// a pokračovat v editaci, nebo jej chcete //vymazat//, nebo úplně //zrušit// celý proces editace.
diff --git a/wiki/inc/lang/cs/edit.txt b/wiki/inc/lang/cs/edit.txt
new file mode 100644
index 0000000..1a135ae
--- /dev/null
+++ b/wiki/inc/lang/cs/edit.txt
@@ -0,0 +1 @@
+Upravte stránku a stiskněte ''Uložit''. Na stránce [[wiki:syntax]] se můžete dozvědět více o wiki syntaxi. Prosím upravujte stránky pouze, pokud je můžete **vylepšit**. V případě, že si chcete něco pouze vyzkoušet, použijte raději [[playground:playground|pískoviště]].
diff --git a/wiki/inc/lang/cs/editrev.txt b/wiki/inc/lang/cs/editrev.txt
new file mode 100644
index 0000000..44f0bc6
--- /dev/null
+++ b/wiki/inc/lang/cs/editrev.txt
@@ -0,0 +1,2 @@
+**Máte načtenou starší verzi dokumentu!** Pokud ji uložíte, vytvoříte tím novou aktuální verzi.
+----
diff --git a/wiki/inc/lang/cs/index.txt b/wiki/inc/lang/cs/index.txt
new file mode 100644
index 0000000..d19626f
--- /dev/null
+++ b/wiki/inc/lang/cs/index.txt
@@ -0,0 +1,3 @@
+====== Index ======
+
+Zde je k dispozici index všech dostupných stránek seřazený podle [[doku>namespaces|jmenných prostorů]].
diff --git a/wiki/inc/lang/cs/install.html b/wiki/inc/lang/cs/install.html
new file mode 100644
index 0000000..043e924
--- /dev/null
+++ b/wiki/inc/lang/cs/install.html
@@ -0,0 +1,23 @@
+<p>Tato stránka vám pomůže při první instalaci a konfiguraci
+<a href="http://dokuwiki.org">Dokuwiki</a>. Více
+informací o tomto instalátoru naleznete v jeho vlastní <a
+href="http://dokuwiki.org/installer">dokumentaci</a>.</p>
+
+<p>DokuWiki používá obyčejné soubory pro uložení wiki stránek a dalších informací
+spojených s nimi (např. obrázků, vyhledávacích indexů, starších verzí). Aby DokuWiki
+správně fungovala <strong>musí</strong> mít přístup k adresářům, kde jsou uloženy
+tyto soubory. Tento instalátor není schopen sám nastavit přístupová práva k souborům
+a adresářům. To se obyčejně dělá přímo v shellu nebo, používáte-li hosting, přes
+FTP nebo ovládací panel vašeho hostingu (např. cPanel).</p>
+
+<p>Tento instalátor nastaví <abbr title="access control list">ACL</abbr>
+(přístupová práva uživatelů) pro vaši DokuWiki, což umožní správci přihlásit
+se do administrační části DokuWiki a tam instalovat pluginy, spravovat uživatele,
+nastavovat přístup k wiki stránkám a měnit další nastavení wiki. Není to
+nutné, ale zpříjemní to správu DokuWiki.</p>
+
+<p>Zkušení uživatelé nebo uživatelé se speciálními požadavky by se
+měli podívat na následující stránky pro další informace ohledně
+<a href="http://dokuwiki.org/install">instalace</a> a
+<a href="http://dokuwiki.org/config">nastavení</a> DokuWiki.</p>
+
diff --git a/wiki/inc/lang/cs/jquery.ui.datepicker.js b/wiki/inc/lang/cs/jquery.ui.datepicker.js
new file mode 100644
index 0000000..c2f79cf
--- /dev/null
+++ b/wiki/inc/lang/cs/jquery.ui.datepicker.js
@@ -0,0 +1,37 @@
+/* Czech initialisation for the jQuery UI date picker plugin. */
+/* Written by Tomas Muller (tomas@tomas-muller.net). */
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "../widgets/datepicker" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery.datepicker );
+	}
+}( function( datepicker ) {
+
+datepicker.regional.cs = {
+	closeText: "Zavřít",
+	prevText: "&#x3C;Dříve",
+	nextText: "Později&#x3E;",
+	currentText: "Nyní",
+	monthNames: [ "leden","únor","březen","duben","květen","červen",
+	"červenec","srpen","září","říjen","listopad","prosinec" ],
+	monthNamesShort: [ "led","úno","bře","dub","kvě","čer",
+	"čvc","srp","zář","říj","lis","pro" ],
+	dayNames: [ "neděle", "pondělí", "úterý", "středa", "čtvrtek", "pátek", "sobota" ],
+	dayNamesShort: [ "ne", "po", "út", "st", "čt", "pá", "so" ],
+	dayNamesMin: [ "ne","po","út","st","čt","pá","so" ],
+	weekHeader: "Týd",
+	dateFormat: "dd.mm.yy",
+	firstDay: 1,
+	isRTL: false,
+	showMonthAfterYear: false,
+	yearSuffix: "" };
+datepicker.setDefaults( datepicker.regional.cs );
+
+return datepicker.regional.cs;
+
+} ) );
diff --git a/wiki/inc/lang/cs/lang.php b/wiki/inc/lang/cs/lang.php
new file mode 100644
index 0000000..8a57c0e
--- /dev/null
+++ b/wiki/inc/lang/cs/lang.php
@@ -0,0 +1,366 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Jonáš Dyba <jonas.dyba@gmail.com>
+ * @author Bohumir Zamecnik <bohumir@zamecnik.org>
+ * @author Tomas Valenta <t.valenta@sh.cvut.cz>
+ * @author Zbynek Krivka <zbynek.krivka@seznam.cz>
+ * @author Marek Sacha <sachamar@fel.cvut.cz>
+ * @author Lefty <lefty@multihost.cz>
+ * @author Vojta Beran <xmamut@email.cz>
+ * @author Jakub A. Těšínský (j@kub.cz)
+ * @author mkucera66 <mkucera66@seznam.cz>
+ * @author Zbyněk Křivka <krivka@fit.vutbr.cz>
+ * @author Petr Klíma <qaxi@seznam.cz>
+ * @author Radovan Buroň <radovan@buron.cz>
+ * @author Viktor Zavadil <vzavadil@newps.cz>
+ * @author Jaroslav Lichtblau <jlichtblau@seznam.cz>
+ * @author Turkislav <turkislav@blabla.com>
+ * @author Daniel Slováček <danslo@danslo.cz>
+ * @author Martin Růžička <martinr@post.cz>
+ * @author Pavel Krupička <pajdacz@gmail.com>
+ */
+$lang['encoding']              = 'utf-8';
+$lang['direction']             = 'ltr';
+$lang['doublequoteopening']    = '„';
+$lang['doublequoteclosing']    = '“';
+$lang['singlequoteopening']    = '‚';
+$lang['singlequoteclosing']    = '‘';
+$lang['apostrophe']            = '\'';
+$lang['btn_edit']              = 'Upravit stránku';
+$lang['btn_source']            = 'Zdrojový kód stránky';
+$lang['btn_show']              = 'Zobrazit stránku';
+$lang['btn_create']            = 'Vytvořit stránku';
+$lang['btn_search']            = 'Hledat';
+$lang['btn_save']              = 'Uložit';
+$lang['btn_preview']           = 'Náhled';
+$lang['btn_top']               = 'Nahoru';
+$lang['btn_newer']             = '<< novější';
+$lang['btn_older']             = 'starší >>';
+$lang['btn_revs']              = 'Starší verze';
+$lang['btn_recent']            = 'Poslední úpravy';
+$lang['btn_upload']            = 'Načíst';
+$lang['btn_cancel']            = 'Zrušit';
+$lang['btn_index']             = 'Mapa stránek';
+$lang['btn_secedit']           = 'Upravit';
+$lang['btn_login']             = 'Přihlásit se';
+$lang['btn_logout']            = 'Odhlásit se';
+$lang['btn_admin']             = 'Správa';
+$lang['btn_update']            = 'Aktualizovat';
+$lang['btn_delete']            = 'Vymazat';
+$lang['btn_back']              = 'Zpět';
+$lang['btn_backlink']          = 'Zpětné odkazy';
+$lang['btn_subscribe']         = 'Odebírat e-mailem změny stránky';
+$lang['btn_profile']           = 'Upravit profil';
+$lang['btn_reset']             = 'Reset';
+$lang['btn_resendpwd']         = 'Nastavit nové heslo';
+$lang['btn_draft']             = 'Upravit koncept';
+$lang['btn_recover']           = 'Obnovit koncept';
+$lang['btn_draftdel']          = 'Vymazat koncept';
+$lang['btn_revert']            = 'Vrátit zpět';
+$lang['btn_register']          = 'Registrovat';
+$lang['btn_apply']             = 'Použít';
+$lang['btn_media']             = 'Správa médií';
+$lang['btn_deleteuser']        = 'Odstranit můj účet';
+$lang['btn_img_backto']        = 'Zpět na %s';
+$lang['btn_mediaManager']      = 'Zobrazit ve správě médií';
+$lang['loggedinas']            = 'Přihlášen(a) jako:';
+$lang['user']                  = 'Uživatelské jméno';
+$lang['pass']                  = 'Heslo';
+$lang['newpass']               = 'Nové heslo';
+$lang['oldpass']               = 'Současné heslo';
+$lang['passchk']               = 'Zopakovat';
+$lang['remember']              = 'Zapamatovat';
+$lang['fullname']              = 'Celé jméno';
+$lang['email']                 = 'E-mail';
+$lang['profile']               = 'Uživatelský profil';
+$lang['badlogin']              = 'Zadané uživatelské jméno a heslo není správně.';
+$lang['badpassconfirm']        = 'Bohužel špatné heslo';
+$lang['minoredit']             = 'Drobné změny';
+$lang['draftdate']             = 'Koncept automaticky uložen v';
+$lang['nosecedit']             = 'Stránka byla v mezičase změněna. Informace o sekci již nebylo platné, byla načtena celá stránka.';
+$lang['search_fullresults']    = 'Fulltextové výsledky';
+$lang['js']['willexpire']      = 'Váš zámek pro editaci za chvíli vyprší.\nAbyste předešli konfliktům, stiskněte tlačítko Náhled a zámek se prodlouží.';
+$lang['js']['notsavedyet']     = 'Jsou tu neuložené změny, které budou ztraceny.
+Chcete opravdu pokračovat?';
+$lang['js']['searchmedia']     = 'Hledat soubory';
+$lang['js']['keepopen']        = 'Po vybrání souboru nechat okno otevřené';
+$lang['js']['hidedetails']     = 'Skrýt detaily';
+$lang['js']['mediatitle']      = 'Nastavení odkazu';
+$lang['js']['mediadisplay']    = 'Typ odkazu';
+$lang['js']['mediaalign']      = 'Zarovnání';
+$lang['js']['mediasize']       = 'Velikost obrázku';
+$lang['js']['mediatarget']     = 'Cíl odkazu';
+$lang['js']['mediaclose']      = 'Zavřít';
+$lang['js']['mediainsert']     = 'Vložit';
+$lang['js']['mediadisplayimg'] = 'Zobrazit obrázek';
+$lang['js']['mediadisplaylnk'] = 'Zobrazit pouze odkaz';
+$lang['js']['mediasmall']      = 'Malá verze';
+$lang['js']['mediamedium']     = 'Střední verze';
+$lang['js']['medialarge']      = 'Velká verze';
+$lang['js']['mediaoriginal']   = 'Původní verze';
+$lang['js']['medialnk']        = 'Odkaz na stránku s detailem';
+$lang['js']['mediadirect']     = 'Přímý odkaz na originál';
+$lang['js']['medianolnk']      = 'Žádný odkaz';
+$lang['js']['medianolink']     = 'Neodkazovat na obrázek';
+$lang['js']['medialeft']       = 'Zarovnat obrázek doleva.';
+$lang['js']['mediaright']      = 'Zarovnat obrázek doprava.';
+$lang['js']['mediacenter']     = 'Zarovnat obrázek na střed.';
+$lang['js']['medianoalign']    = 'Nepoužívat zarovnání.';
+$lang['js']['nosmblinks']      = 'Odkazování na sdílené prostředky Windows funguje jen v Internet Exploreru.
+Přesto tento odkaz můžete zkopírovat a vložit jinde.';
+$lang['js']['linkwiz']         = 'Průvodce odkazy';
+$lang['js']['linkto']          = 'Odkaz na:';
+$lang['js']['del_confirm']     = 'Vymazat tuto položku?';
+$lang['js']['restore_confirm'] = 'Opravdu obnovit tuto verzi?';
+$lang['js']['media_diff']      = 'Prohlédnout rozdíly:';
+$lang['js']['media_diff_both'] = 'Vedle sebe';
+$lang['js']['media_diff_opacity'] = 'Zvýraznění';
+$lang['js']['media_diff_portions'] = 'Osvědčit';
+$lang['js']['media_select']    = 'Vybrat soubory...';
+$lang['js']['media_upload_btn'] = 'Nahrát';
+$lang['js']['media_done_btn']  = 'Hotovo';
+$lang['js']['media_drop']      = 'Sem přetáhněte soubory pro nahrátí';
+$lang['js']['media_cancel']    = 'odstranit';
+$lang['js']['media_overwrt']   = 'Přepsat existující soubory';
+$lang['search_starts_with']    = 'Začíná s';
+$lang['search_ends_with']      = 'Končí s';
+$lang['search_contains']       = 'Obsahuje';
+$lang['search_custom_match']   = 'Vlastní';
+$lang['search_past_7_days']    = 'Minulý týden';
+$lang['search_past_month']     = 'Minulý měsíc';
+$lang['search_past_year']      = 'Minulý rok';
+$lang['search_sort_by_mtime']  = 'Řadit podle naposledy změněných';
+$lang['regmissing']            = 'Musíte vyplnit všechny údaje.';
+$lang['reguexists']            = 'Uživatel se stejným jménem už je zaregistrován.';
+$lang['regsuccess']            = 'Uživatelský účet byl vytvořen a heslo zasláno e-mailem.';
+$lang['regsuccess2']           = 'Uživatelský účet byl vytvořen.';
+$lang['regfail']               = 'Uživatelský profil nemohl být vytvořen.';
+$lang['regmailfail']           = 'Zdá se, že nastala chyba při posílání mailu s heslem. Zkuste kontaktovat správce.';
+$lang['regbadmail']            = 'Zadaná e-mailová adresa není platná. Pokud si myslíte, že to je špatně, zkuste kontaktovat správce.';
+$lang['regbadpass']            = 'Heslo nebylo zadáno dvakrát stejně, zkuste to prosím znovu.';
+$lang['regpwmail']             = 'Vaše heslo do systému DokuWiki';
+$lang['reghere']               = 'Nemáte uživatelský účet? Zřiďte si ho';
+$lang['profna']                = 'Tato wiki neumožňuje změnu profilu';
+$lang['profnochange']          = 'Žádné změny nebyly provedeny.';
+$lang['profnoempty']           = 'Nelze vynechat jméno nebo e-mailovou adresu.';
+$lang['profchanged']           = 'Uživatelský profil změněn.';
+$lang['profnodelete']          = 'Tato wiki nepodporuje mazání uživatelů';
+$lang['profdeleteuser']        = 'Smazat účet';
+$lang['profdeleted']           = 'Váš uživatelský účet byl z této wiki smazán';
+$lang['profconfdelete']        = 'Chci smazat můj účet z této wiki. <br/> Tato akce je nevratná.';
+$lang['profconfdeletemissing'] = 'Potvrzovací tlačítko nezaškrtnuto';
+$lang['proffail']              = 'Uživatelský profil nebyl aktualizován.';
+$lang['pwdforget']             = 'Zapomněli jste heslo? Nechte si zaslat nové';
+$lang['resendna']              = 'Tato wiki neumožňuje zasílání nových hesel.';
+$lang['resendpwd']             = 'Nastavit nové heslo pro';
+$lang['resendpwdmissing']      = 'Musíte vyplnit všechny položky.';
+$lang['resendpwdnouser']       = 'Bohužel takový uživatel v systému není.';
+$lang['resendpwdbadauth']      = 'Tento autorizační kód není platný. Zadali jste opravdu celý odkaz na potvrzovací stránku?';
+$lang['resendpwdconfirm']      = 'Odkaz na potvrzovací stránku byl odeslán e-mailem.';
+$lang['resendpwdsuccess']      = 'Vaše nové heslo bylo odesláno e-mailem.';
+$lang['license']               = 'Kromě míst, kde je explicitně uvedeno jinak, je obsah této wiki licencován pod následující licencí:';
+$lang['licenseok']             = 'Poznámka: Tím, že editujete tuto stránku, souhlasíte, aby váš obsah byl licencován pod následující licencí:';
+$lang['searchmedia']           = 'Hledat jméno souboru:';
+$lang['searchmedia_in']        = 'Hledat v %s';
+$lang['txt_upload']            = 'Vyberte soubor jako přílohu:';
+$lang['txt_filename']          = 'Wiki jméno (volitelné):';
+$lang['txt_overwrt']           = 'Přepsat existující soubor';
+$lang['maxuploadsize']         = 'Max. velikost souboru %s';
+$lang['lockedby']              = 'Právě zamknuto:';
+$lang['lockexpire']            = 'Zámek vyprší:';
+$lang['rssfailed']             = 'Nastala chyba při vytváření tohoto RSS: ';
+$lang['nothingfound']          = 'Nic nenalezeno.';
+$lang['mediaselect']           = 'Výběr dokumentu';
+$lang['uploadsucc']            = 'Přenos proběhl v pořádku';
+$lang['uploadfail']            = 'Chyba při načítání. Možná kvůli špatně nastaveným právům?';
+$lang['uploadwrong']           = 'Načtení souboru s takovouto příponou není dovoleno.';
+$lang['uploadexist']           = 'Soubor už existuje, necháme ho být.';
+$lang['uploadbadcontent']      = 'Nahraný obsah neodpovídá jeho příponě souboru %s.';
+$lang['uploadspam']            = 'Načtený dokument byl odmítnut, je na spamovém blacklistu.';
+$lang['uploadxss']             = 'Načtený dokument byl odmítnut. Zdá se, že obsahuje škodlivé věci.';
+$lang['uploadsize']            = 'Nahraný soubor byl příliš velký (max. %s)';
+$lang['deletesucc']            = 'Soubor "%s" byl vymazán.';
+$lang['deletefail']            = 'Soubor "%s" nelze vymazat - zkontrolujte oprávnění.';
+$lang['mediainuse']            = 'Soubor "%s" nebyl vymazán - stále se používá.';
+$lang['namespaces']            = 'Jmenné prostory';
+$lang['mediafiles']            = 'Dostupné soubory';
+$lang['accessdenied']          = 'Nejste autorizován k přístupu na tuto stránku.';
+$lang['mediausage']            = 'K odkázání se na tento soubor použijte následující syntax:';
+$lang['mediaview']             = 'Zobrazit původní soubor';
+$lang['mediaroot']             = 'root';
+$lang['mediaupload']           = 'Načíst soubor do aktuálního jmenného prostoru. K vytvoření nových jmenných prostorů, přidejte jejich názvy na začátek wiki jména (oddělte dvojtečkou).';
+$lang['mediaextchange']        = 'Přípona souboru byla změněna z .%s na .%s!';
+$lang['reference']             = 'Odkazy na';
+$lang['ref_inuse']             = 'Soubor nelze vymazat, jelikož ho využívají následující stránky:';
+$lang['ref_hidden']            = 'Některé odkazy jsou na stránkách, kam nemáte právo přístupu';
+$lang['hits']                  = '- počet výskytů';
+$lang['quickhits']             = 'Odpovídající stránky';
+$lang['toc']                   = 'Obsah';
+$lang['current']               = 'aktuální';
+$lang['yours']                 = 'Vaše verze';
+$lang['diff']                  = 'Zobrazit rozdíly vůči aktuální verzi';
+$lang['diff2']                 = 'Zobrazit rozdíly mezi vybranými verzemi';
+$lang['difflink']              = 'Odkaz na výstup diff';
+$lang['diff_type']             = 'Zobrazit rozdíly:';
+$lang['diff_inline']           = 'Vložené';
+$lang['diff_side']             = 'Přidané';
+$lang['diffprevrev']           = 'Předchozí verze';
+$lang['diffnextrev']           = 'Následující verze';
+$lang['difflastrev']           = 'Poslední revize';
+$lang['diffbothprevrev']       = 'Obě strany předchozí revize';
+$lang['diffbothnextrev']       = 'Obě strany příští revize';
+$lang['line']                  = 'Řádek';
+$lang['breadcrumb']            = 'Historie:';
+$lang['youarehere']            = 'Umístění:';
+$lang['lastmod']               = 'Poslední úprava:';
+$lang['by']                    = 'autor:';
+$lang['deleted']               = 'odstraněno';
+$lang['created']               = 'vytvořeno';
+$lang['restored']              = 'stará verze byla obnovena (%s)';
+$lang['external_edit']         = 'upraveno mimo DokuWiki';
+$lang['summary']               = 'Komentář k úpravám';
+$lang['noflash']               = 'Pro přehrání obsahu potřebujete <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a>.';
+$lang['download']              = 'Stáhnout snippet';
+$lang['tools']                 = 'Nástroje';
+$lang['user_tools']            = 'Uživatelské nástroje';
+$lang['site_tools']            = 'Nástroje pro tento web';
+$lang['page_tools']            = 'Nástroje pro stránku';
+$lang['skip_to_content']       = 'jít k obsahu';
+$lang['sidebar']               = 'Postranní lišta';
+$lang['mail_newpage']          = 'nová stránka:';
+$lang['mail_changed']          = 'změna stránky:';
+$lang['mail_subscribe_list']   = 'stránky změněné ve jmenném prostoru:';
+$lang['mail_new_user']         = 'nový uživatel:';
+$lang['mail_upload']           = 'nahraný soubor:';
+$lang['changes_type']          = 'Prohlednou změny ';
+$lang['pages_changes']         = 'stránek';
+$lang['media_changes']         = 'souborů médií';
+$lang['both_changes']          = 'stránek i médií';
+$lang['qb_bold']               = 'Tučně';
+$lang['qb_italic']             = 'Kurzíva';
+$lang['qb_underl']             = 'Podtržení';
+$lang['qb_code']               = 'Neformátovat (zdrojový kód)';
+$lang['qb_strike']             = 'Přeškrtnutý text';
+$lang['qb_h1']                 = 'Nadpis 1. úrovně';
+$lang['qb_h2']                 = 'Nadpis 2. úrovně';
+$lang['qb_h3']                 = 'Nadpis 3. úrovně';
+$lang['qb_h4']                 = 'Nadpis 4. úrovně';
+$lang['qb_h5']                 = 'Nadpis 5. úrovně';
+$lang['qb_h']                  = 'Nadpis';
+$lang['qb_hs']                 = 'Vybrat nadpis';
+$lang['qb_hplus']              = 'Nadpis vyšší úrovně';
+$lang['qb_hminus']             = 'Nadpis nižší úrovně';
+$lang['qb_hequal']             = 'Nadpis stejné úrovně';
+$lang['qb_link']               = 'Interní odkaz';
+$lang['qb_extlink']            = 'Externí odkaz';
+$lang['qb_hr']                 = 'Vodorovná čára';
+$lang['qb_ol']                 = 'Číslovaný seznam';
+$lang['qb_ul']                 = 'Nečíslovaný seznam';
+$lang['qb_media']              = 'Vložit obrázky nebo jiné soubory';
+$lang['qb_sig']                = 'Vložit podpis';
+$lang['qb_smileys']            = 'Emotikony';
+$lang['qb_chars']              = 'Speciální znaky';
+$lang['upperns']               = 'skočit do nadřazeného jmenného prostoru';
+$lang['metaedit']              = 'Upravit Metadata';
+$lang['metasaveerr']           = 'Chyba při zápisu metadat';
+$lang['metasaveok']            = 'Metadata uložena';
+$lang['img_title']             = 'Titulek:';
+$lang['img_caption']           = 'Popis:';
+$lang['img_date']              = 'Datum:';
+$lang['img_fname']             = 'Jméno souboru:';
+$lang['img_fsize']             = 'Velikost:';
+$lang['img_artist']            = 'Autor fotografie:';
+$lang['img_copyr']             = 'Copyright:';
+$lang['img_format']            = 'Formát:';
+$lang['img_camera']            = 'Typ fotoaparátu:';
+$lang['img_keywords']          = 'Klíčová slova:';
+$lang['img_width']             = 'Šířka:';
+$lang['img_height']            = 'Výška:';
+$lang['subscr_subscribe_success'] = '%s byl přihlášen do seznamu odběratelů %s';
+$lang['subscr_subscribe_error'] = 'Došlo k chybě při přihlašování %s do seznamu odběratelů %s';
+$lang['subscr_subscribe_noaddress'] = 'K Vašemu loginu neexistuje žádná adresa, nemohl jste být přihlášen do seznamu odběratelů.';
+$lang['subscr_unsubscribe_success'] = '%s byl odhlášen ze seznamu odběratelů %s';
+$lang['subscr_unsubscribe_error'] = 'Došlo k chybě při odhlašování %s ze seznamu odběratelů %s';
+$lang['subscr_already_subscribed'] = '%s již je přihlášen do seznamu odběratelů %s';
+$lang['subscr_not_subscribed'] = '%s není přihlášen do seznamu odběratelů %s';
+$lang['subscr_m_not_subscribed'] = 'V současné době neodebíráte změny na aktuální stránce nebo ve jmenném prostoru.';
+$lang['subscr_m_new_header']   = 'Přihlásit k odebírání změn e-mailem';
+$lang['subscr_m_current_header'] = 'Aktuální odběratelé změn';
+$lang['subscr_m_unsubscribe']  = 'Odhlásit z odběru změn e-mailem';
+$lang['subscr_m_subscribe']    = 'Přihlásit se k odběru změn e-mailem';
+$lang['subscr_m_receive']      = 'Přejete si dostávat';
+$lang['subscr_style_every']    = 'e-mail pro každou změnu';
+$lang['subscr_style_digest']   = 'souhrnný e-mail změn pro každou stránku (každé %.2f dny/dní)';
+$lang['subscr_style_list']     = 'seznam změněných stránek od posledního e-mailu (každé %.2f dny/dní)';
+$lang['authtempfail']          = 'Autentizace uživatelů je dočasně nedostupná. Pokud tento problém přetrvává, informujte prosím správce této wiki.';
+$lang['i_chooselang']          = 'Vyberte si jazyk';
+$lang['i_installer']           = 'Instalace DokuWiki';
+$lang['i_wikiname']            = 'Název wiki';
+$lang['i_enableacl']           = 'Zapnout ACL (doporučeno)';
+$lang['i_superuser']           = 'Správce';
+$lang['i_problems']            = 'Instalátor narazil na níže popsané problémy. Nelze pokračovat v instalaci, dokud je neopravíte.';
+$lang['i_modified']            = 'Instalátor bude z bezpečnostních důvodů pracovat pouze s čistou a ještě neupravenou instalací DokuWiki. Buď znovu rozbalte soubory z instalačního balíčku, nebo zkuste prostudovat <a href="http://dokuwiki.org/install">instrukce pro instalaci DokuWiki</a>.';
+$lang['i_funcna']              = 'PHP funkce <code>%s</code> není dostupná. Váš webhosting ji možná z nějakého důvodu vypnul.';
+$lang['i_phpver']              = 'Verze vaší instalace PHP <code>%s</code> je nižší než požadovaná <code>%s</code>. Budete muset aktualizovat svou instalaci PHP.';
+$lang['i_mbfuncoverload']      = 'mbstring.func_overload musí být vypnut v php.ini pro běh DokuWiki.';
+$lang['i_permfail']            = 'DokuWiki nemůže zapisovat do <code>%s</code>. Budete muset opravit práva k tomuto adresáři.';
+$lang['i_confexists']          = '<code>%s</code> již existuje';
+$lang['i_writeerr']            = 'Nelze vytvořit <code>%s</code>. Budete muset zkontrolovat práva k souborům či adresářům a vytvořit tento soubor ručně.';
+$lang['i_badhash']             = 'soubor dokuwiki.php (hash=<code>%s</code>) nebyl rozpoznán nebo byl upraven';
+$lang['i_badval']              = '<code>%s</code> - neplatná nebo prázdná hodnota';
+$lang['i_success']             = 'Konfigurace byla úspěšně dokončena. Nyní můžete smazat soubor install.php. Pokračujte do <a href="doku.php?id=wiki:welcome">své nové DokuWiki</a>.';
+$lang['i_failure']             = 'Vyskytly se nějaké chyby při zápisu do konfiguračních souborů. Budete je nejspíš muset upravit ručně před použitím <a href="doku.php?id=wiki:welcome">své nové DokuWiki</a>.';
+$lang['i_policy']              = 'Úvodní politika ACL';
+$lang['i_pol0']                = 'Otevřená wiki (čtení, zápis a upload pro všechny)';
+$lang['i_pol1']                = 'Veřejná wiki (čtení pro všechny, zápis a upload pro registrované uživatele)';
+$lang['i_pol2']                = 'Uzavřená wiki (čtení, zápis a upload pouze pro registrované uživatele)';
+$lang['i_allowreg']            = 'Povol uživatelům registraci';
+$lang['i_retry']               = 'Zkusit znovu';
+$lang['i_license']             = 'Vyberte prosím licenci obsahu:';
+$lang['i_license_none']        = 'Nezobrazovat žádné licenční informace';
+$lang['i_pop_field']           = 'Prosím, pomozte nám vylepšit DokuWiki:';
+$lang['i_pop_label']           = 'Jednou měsíčně zaslat anonymní data o využívání DokuWiki jejím vývojářům';
+$lang['recent_global']         = 'Právě si prohlížíte změny ve jmenném prostoru <b>%s</b>. Také si můžete <a href="%s">zobrazit změny v celé wiki</a>.';
+$lang['years']                 = 'před %d roky';
+$lang['months']                = 'před %d měsíci';
+$lang['weeks']                 = 'před %d týdny';
+$lang['days']                  = 'před %d dny';
+$lang['hours']                 = 'před %d hodinami';
+$lang['minutes']               = 'před %d minutami';
+$lang['seconds']               = 'před %d sekundami';
+$lang['wordblock']             = 'Vaše změny nebyly uloženy, protože obsahují blokovaný text(spam).';
+$lang['media_uploadtab']       = 'Nahrát';
+$lang['media_searchtab']       = 'Hledat';
+$lang['media_file']            = 'Soubor';
+$lang['media_viewtab']         = 'Zobrazit';
+$lang['media_edittab']         = 'Upravit';
+$lang['media_historytab']      = 'Historie';
+$lang['media_list_thumbs']     = 'Zmenšeniny';
+$lang['media_list_rows']       = 'Řádky';
+$lang['media_sort_name']       = 'Jméno';
+$lang['media_sort_date']       = 'Datum';
+$lang['media_namespaces']      = 'Vyber jmenný prostor';
+$lang['media_files']           = 'Soubory v %s';
+$lang['media_upload']          = 'Upload do %s';
+$lang['media_search']          = 'Hledat v %s';
+$lang['media_view']            = '%s';
+$lang['media_viewold']         = '%s na %s';
+$lang['media_edit']            = 'Upravit %s';
+$lang['media_history']         = 'Historie %s';
+$lang['media_meta_edited']     = 'metadata upravena';
+$lang['media_perm_read']       = 'Bohužel, nemáte práva číst soubory.';
+$lang['media_perm_upload']     = 'Bohužel, nemáte práva nahrávat soubory.';
+$lang['media_update']          = 'Nahrát novou verzi';
+$lang['media_restore']         = 'Obnovit tuto verzi';
+$lang['media_acl_warning']     = 'Tento seznam nemusí být úplný z důvodu omezení práv ACL a skrytým stránkám.';
+$lang['currentns']             = 'Aktuální jmenný prostor';
+$lang['searchresult']          = 'Výsledek hledání';
+$lang['plainhtml']             = 'Čisté HTML';
+$lang['wikimarkup']            = 'Wiki jazyk';
+$lang['page_nonexist_rev']     = 'Stránka neexistovala na %s. Byla vytvořena dodatečne na <a href="%s">%s</a>.';
+$lang['unable_to_parse_date']  = 'Nelze rozebrat parametr "%s".';
+$lang['email_signature_text']  = 'Tento e-mail byl automaticky vygenerován systémem DokuWiki
+@DOKUWIKIURL@';
diff --git a/wiki/inc/lang/cs/locked.txt b/wiki/inc/lang/cs/locked.txt
new file mode 100644
index 0000000..23fd943
--- /dev/null
+++ b/wiki/inc/lang/cs/locked.txt
@@ -0,0 +1,3 @@
+====== Stránka je zamknutá ======
+
+Tato stránka je právě zamknutá pro úpravy jiným uživatelem. Musíte počkat, než onen uživatel dokončí své úpravy nebo než tento zámek vyprší.
diff --git a/wiki/inc/lang/cs/login.txt b/wiki/inc/lang/cs/login.txt
new file mode 100644
index 0000000..a44ae59
--- /dev/null
+++ b/wiki/inc/lang/cs/login.txt
@@ -0,0 +1,3 @@
+====== Přihlášení ======
+
+Momentálně nejste přihlášen(a)! Prosím vložte své identifikační údaje níže. Pro přihlášení musíte mít zapnuté cookies.
diff --git a/wiki/inc/lang/cs/mailtext.txt b/wiki/inc/lang/cs/mailtext.txt
new file mode 100644
index 0000000..8036ebe
--- /dev/null
+++ b/wiki/inc/lang/cs/mailtext.txt
@@ -0,0 +1,12 @@
+Stránka ve vaší DokuWiki byla změněna. Zde jsou podrobnosti:
+
+Datum       : @DATE@
+Prohlížeč   : @BROWSER@
+IP adresa   : @IPADDRESS@
+Hostitel    : @HOSTNAME@
+Stará verze : @OLDPAGE@
+Nová verze  : @NEWPAGE@
+Komentář    : @SUMMARY@
+Uživatel    : @USER@
+
+@DIFF@
diff --git a/wiki/inc/lang/cs/mailwrap.html b/wiki/inc/lang/cs/mailwrap.html
new file mode 100644
index 0000000..f15ec06
--- /dev/null
+++ b/wiki/inc/lang/cs/mailwrap.html
@@ -0,0 +1,13 @@
+<html>
+ <head>
+ <title>@TITLE@</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+ </head>
+ <body>
+
+ @HTMLBODY@
+
+ <br /><hr />
+ <small>@EMAILSIGNATURE@</small>
+ </body>
+ </html>
\ No newline at end of file
diff --git a/wiki/inc/lang/cs/newpage.txt b/wiki/inc/lang/cs/newpage.txt
new file mode 100644
index 0000000..091250a
--- /dev/null
+++ b/wiki/inc/lang/cs/newpage.txt
@@ -0,0 +1,3 @@
+====== Stránka s tímto názvem ještě neexistuje ======
+
+Odkaz vás zavedl na stránku, která ještě neexistuje. Můžete ji vytvořit stisknutím tlačítka ''Vytvořit stránku''.
diff --git a/wiki/inc/lang/cs/norev.txt b/wiki/inc/lang/cs/norev.txt
new file mode 100644
index 0000000..f601f58
--- /dev/null
+++ b/wiki/inc/lang/cs/norev.txt
@@ -0,0 +1,3 @@
+====== Taková verze neexistuje ======
+
+Zadaná verze neexistuje. Stiskněte tlačítko ''Starší verze'' pro seznam starších verzí tohoto dokumentu.
diff --git a/wiki/inc/lang/cs/password.txt b/wiki/inc/lang/cs/password.txt
new file mode 100644
index 0000000..6b7c682
--- /dev/null
+++ b/wiki/inc/lang/cs/password.txt
@@ -0,0 +1,7 @@
+Dobrý den!
+
+Zde jsou přihlašovací informace pro wiki @TITLE@ (@DOKUWIKIURL@)
+
+Jméno             : @FULLNAME@
+Uživatelské jméno : @LOGIN@
+Heslo             : @PASSWORD@
diff --git a/wiki/inc/lang/cs/preview.txt b/wiki/inc/lang/cs/preview.txt
new file mode 100644
index 0000000..079eda4
--- /dev/null
+++ b/wiki/inc/lang/cs/preview.txt
@@ -0,0 +1,3 @@
+====== Náhled ======
+
+Zde je náhled, jak bude dokument vypadat. Pozor: Soubor zatím **není uložen**!
diff --git a/wiki/inc/lang/cs/pwconfirm.txt b/wiki/inc/lang/cs/pwconfirm.txt
new file mode 100644
index 0000000..2605b48
--- /dev/null
+++ b/wiki/inc/lang/cs/pwconfirm.txt
@@ -0,0 +1,9 @@
+Dobrý den!
+
+Někdo požádal o nové heslo k vašemu uživatelskému účtu na wiki @TITLE@ (@DOKUWIKIURL@)
+
+Pokud jste o nové heslo nežádali, ignorujte prosím tento e-mail.
+
+Pro potvrzení, že jste tento požadavek poslali opravdu vy, prosím otevřete následující odkaz.
+
+@CONFIRM@
diff --git a/wiki/inc/lang/cs/read.txt b/wiki/inc/lang/cs/read.txt
new file mode 100644
index 0000000..d5b2d73
--- /dev/null
+++ b/wiki/inc/lang/cs/read.txt
@@ -0,0 +1 @@
+Tato stránka je pouze pro čtení. Můžete si pouze prohlédnout zdrojový kód, ale ne ho měnit. Zeptejte se správce, pokud si myslíte, že něco není v pořádku.
diff --git a/wiki/inc/lang/cs/recent.txt b/wiki/inc/lang/cs/recent.txt
new file mode 100644
index 0000000..e4ca5e9
--- /dev/null
+++ b/wiki/inc/lang/cs/recent.txt
@@ -0,0 +1,3 @@
+====== Poslední úpravy ======
+
+Následující stránky byly nedávno změněny.
diff --git a/wiki/inc/lang/cs/register.txt b/wiki/inc/lang/cs/register.txt
new file mode 100644
index 0000000..b0d6bb1
--- /dev/null
+++ b/wiki/inc/lang/cs/register.txt
@@ -0,0 +1,3 @@
+====== Zaregistrujte se jako nový uživatel ======
+
+Abyste získali uživatelský účet, vyplňte prosím všechny informace v následujícím formuláři. Zadejte **platnou** mailovou adresu, na níž bude zasláno heslo. Uživatelské jméno musí být v platném [[doku>pagename|formátu]] (který je stejný jako formát názvu stránky).
diff --git a/wiki/inc/lang/cs/registermail.txt b/wiki/inc/lang/cs/registermail.txt
new file mode 100644
index 0000000..3c449bc
--- /dev/null
+++ b/wiki/inc/lang/cs/registermail.txt
@@ -0,0 +1,10 @@
+Zaregistroval se nový uživatel. Zde jsou detaily:
+
+Uživatelské jméno : @NEWUSER@
+Celé jméno : @NEWNAME@
+E-mail : @NEWEMAIL@
+
+Datum : @DATE@
+Prohlížeč : @BROWSER@
+IP adresa : @IPADDRESS@
+Hostitel : @HOSTNAME@
diff --git a/wiki/inc/lang/cs/resendpwd.txt b/wiki/inc/lang/cs/resendpwd.txt
new file mode 100644
index 0000000..0820f28
--- /dev/null
+++ b/wiki/inc/lang/cs/resendpwd.txt
@@ -0,0 +1,3 @@
+====== Zaslat nové heslo ======
+
+Abyste získali nové heslo ke svému účtu v této wiki, vyplňte všechny níže uvedené informace. Nové heslo bude zasláno na e-mailovou adresu, kterou jste zadali při registraci. Uživatelské jméno by mělo být stejné jako vaše uživatelské jméno, s nímž se přihlašujete do této wiki.
diff --git a/wiki/inc/lang/cs/resetpwd.txt b/wiki/inc/lang/cs/resetpwd.txt
new file mode 100644
index 0000000..9aa449c
--- /dev/null
+++ b/wiki/inc/lang/cs/resetpwd.txt
@@ -0,0 +1,3 @@
+====== Nastavení nového hesla ======
+
+Zadejte prosím nové heslo pro váš účet.
\ No newline at end of file
diff --git a/wiki/inc/lang/cs/revisions.txt b/wiki/inc/lang/cs/revisions.txt
new file mode 100644
index 0000000..e3744b7
--- /dev/null
+++ b/wiki/inc/lang/cs/revisions.txt
@@ -0,0 +1,3 @@
+====== Starší verze ======
+
+Zde jsou starší verze daného dokumentu. Pro návrat ke starší verzi si ji zvolte ze seznamu níže, stiskněte tlačítko ''Upravit stránku'' a uložte ji.
diff --git a/wiki/inc/lang/cs/searchpage.txt b/wiki/inc/lang/cs/searchpage.txt
new file mode 100644
index 0000000..800d61c
--- /dev/null
+++ b/wiki/inc/lang/cs/searchpage.txt
@@ -0,0 +1,4 @@
+====== Vyhledávání ======
+
+Výsledky hledání můžete vidět níže. @CREATEPAGEINFO@
+
diff --git a/wiki/inc/lang/cs/showrev.txt b/wiki/inc/lang/cs/showrev.txt
new file mode 100644
index 0000000..971f836
--- /dev/null
+++ b/wiki/inc/lang/cs/showrev.txt
@@ -0,0 +1,2 @@
+**Toto je starší verze dokumentu!**
+----
diff --git a/wiki/inc/lang/cs/stopwords.txt b/wiki/inc/lang/cs/stopwords.txt
new file mode 100644
index 0000000..26d8741
--- /dev/null
+++ b/wiki/inc/lang/cs/stopwords.txt
@@ -0,0 +1,944 @@
+# Stopwords for Czech - generated from ispell-cs (license: GNU GPL)
+aby
+ako
+akorát
+ale
+and
+ani
+ano
+apod
+asi
+atd
+během
+bez
+beze
+blízko
+bohudík
+bohužel
+bokem
+buď
+bude
+budem
+budeme
+budeš
+budete
+budiž
+budou
+budu
+bůhvíco
+bůhvíčí
+bůhvíjak
+bůhvíjaký
+bůhvíkam
+bůhvíkde
+bůhvíkdo
+bůhvíkdy
+bůhvíkolik
+bůhvíkterý
+bůhvínač
+bůhvíproč
+bych
+bychom
+byl
+byla
+byli
+bylo
+byly
+bysme
+být
+cca
+cokoli
+cokoliv
+copak
+cosi
+což
+cože
+častěji
+často
+čeho
+čehokoli
+čehokoliv
+čehosi
+čehož
+čem
+čemkoli
+čemkoliv
+čemsi
+čemu
+čemukoli
+čemukoliv
+čemusi
+čemuž
+čemž
+čertvíco
+čertvíčí
+čertvíjak
+čertvíjaký
+čertvíkam
+čertvíkde
+čertvíkdo
+čertvíkdy
+čertvíkolik
+čertvíkterý
+čertvínač
+čertvíproč
+číhokoli
+číhosi
+číchkoli
+číchsi
+číkoli
+čím
+čímakoli
+čímasi
+čímikoli
+čímisi
+čímkoli
+čímkoliv
+čímpak
+čímsi
+čímukoli
+čímusi
+čímž
+čísi
+dál
+dále
+daleko
+další
+dám
+dle
+dnem
+dnes
+dneska
+dobrá
+dobré
+dobrý
+dobře
+docela
+dokonce
+doposavad
+doposud
+doprostřed
+dosavad
+dospod
+dospodu
+dost
+dosti
+dosud
+dovnitř
+eště
+formou
+ho
+hodinou
+hodně
+horší
+hůř
+hůře
+chceš
+chci
+chtěl
+jacíkoli
+jacíkoliv
+jacípak
+jacísi
+jak
+jakákoli
+jakákoliv
+jakápak
+jakási
+jaké
+jakéhokoli
+jakéhokoliv
+jakéhopak
+jakéhosi
+jakékoli
+jakékoliv
+jakémkoli
+jakémkoliv
+jakémpak
+jakémsi
+jakémukoli
+jakémukoliv
+jakémupak
+jakémusi
+jaképak
+jakési
+jakmile
+jako
+jakou
+jakoukoli
+jakoukoliv
+jakoupak
+jakousi
+jakož
+jakpak
+jaký
+jakýchkoli
+jakýchkoliv
+jakýchpak
+jakýchsi
+jakýkoli
+jakýkoliv
+jakýmakoli
+jakýmakoliv
+jakýmapak
+jakýmasi
+jakýmikoli
+jakýmikoliv
+jakýmipak
+jakýmisi
+jakýmkoli
+jakýmkoliv
+jakýmpak
+jakýmsi
+jakýpak
+jakýsi
+jakže
+jasné
+jasně
+jde
+je
+jediná
+jediné
+jediný
+jeho
+jehož
+jej
+její
+jejíhož
+jejich
+jejichž
+jejíchž
+jejímaž
+jejímiž
+jejímuž
+jejímž
+jejíž
+jejž
+jelikož
+jemu
+jemuž
+jen
+jenom
+jenž
+jenže
+jestli
+ještě
+jež
+ježto
+ji
+jí
+jich
+jichž
+jim
+jím
+jimi
+jimiž
+jimž
+jímž
+jiná
+jinak
+jiné
+jinou
+jiný
+jiných
+jiným
+jisté
+jistě
+již
+jíž
+jménem
+jsem
+jseš
+jsi
+jsme
+jsou
+jste
+kam
+každý
+kde
+kdeco
+kdečí
+kdejaký
+kdekdo
+kdekterý
+kdepak
+kdesi
+kdo
+kdokoli
+kdokoliv
+kdopak
+kdosi
+kdovíjak
+kdovíkde
+kdovíkdo
+kdož
+kdy
+kdysi
+když
+kohokoli
+kohokoliv
+kohopak
+kohosi
+kohož
+kol
+kolem
+kolik
+kolikže
+kolkolem
+komkoli
+komkoliv
+kompak
+komsi
+komu
+komukoli
+komukoliv
+komupak
+komusi
+komuž
+komž
+koncem
+konče
+končí
+končíc
+konec
+kontra
+kromě
+která
+kterákoli
+kterákoliv
+kterási
+kterážto
+které
+kteréhokoli
+kteréhokoliv
+kteréhosi
+kteréhož
+kterékoli
+kterékoliv
+kterém
+kterémkoli
+kterémkoliv
+kterémsi
+kterémukoli
+kterémukoliv
+kterémusi
+kterémuž
+kterémžto
+kterési
+kteréžto
+kterou
+kteroukoli
+kteroukoliv
+kterousi
+kteroužto
+který
+kterýchkoli
+kterýchkoliv
+kterýchsi
+kterýchžto
+kterýkoli
+kterýkoliv
+kterým
+kterýmakoli
+kterýmakoliv
+kterýmasi
+kterýmikoli
+kterýmikoliv
+kterýmisi
+kterýmiž
+kterýmkoli
+kterýmkoliv
+kterýmsi
+kterýmžto
+kterýsi
+kterýžto
+kteří
+kteřísi
+kteřížto
+ktříkoli
+ktříkoliv
+kupodivu
+kupříkladu
+kvůli
+kýmkoli
+kýmkoliv
+kýmpak
+kýmsi
+kýmž
+lecco
+leccos
+lecčems
+lecjak
+lecjaký
+leckam
+leckams
+leckde
+leckdo
+leckdy
+leckterý
+ledaco
+ledacos
+ledačí
+ledajak
+ledajaký
+ledakdo
+ledakterý
+ledaskam
+ledaskde
+ledaskdo
+ledaskdy
+lépe
+lepší
+líp
+má
+mají
+málo
+máloco
+málokdo
+málokterý
+mám
+máme
+máš
+máte
+max
+mé
+mě
+mého
+měl
+měla
+mělo
+mém
+mému
+mezi
+mi
+mí
+mimo
+min
+míň
+místo
+mít
+mne
+mně
+mnoho
+mnou
+moc
+mohl
+mohla
+mohou
+mohu
+moje
+moji
+mojí
+mou
+možná
+mu
+můj
+musel
+muset
+musí
+musím
+musíš
+musíte
+může
+můžeš
+můžete
+můžu
+my
+mých
+mým
+mými
+nač
+načež
+načpak
+nad
+nade
+nám
+námi
+namísto
+naň
+naprosto
+naproti
+např
+napříč
+nás
+náš
+naši
+navíc
+navrch
+navrchu
+navzdory
+ně
+nebo
+nebude
+nebyl
+nebyli
+nebyly
+něco
+něčí
+nedaleko
+nehledíc
+něho
+něhož
+nechceš
+nechci
+nechť
+nechtěl
+něj
+nějak
+nějaká
+nějaké
+nějakého
+nějakou
+nějaký
+nejasné
+nejasný
+nejčastěji
+nejde
+nejen
+nejhůř
+nejhůře
+nejlépe
+nejnižší
+nejsem
+nejsou
+nejvyšší
+nějž
+někam
+někde
+někdo
+někdy
+několik
+nekončí
+některý
+nelze
+něm
+nemá
+nemají
+nemálo
+nemám
+nemáme
+nemáš
+nemáte
+nemít
+nemohl
+nemohla
+nemohou
+nemohu
+němu
+nemusel
+nemuset
+nemusí
+nemusím
+nemusíš
+němuž
+nemůže
+nemůžeš
+nemůžete
+nemůžu
+němž
+není
+nepřesná
+nepřesné
+nepřesně
+nepřesný
+nepřímo
+netřeba
+netuším
+netýká
+neví
+nevím
+nevíš
+nevlastní
+nevyjímaje
+nevyjímajíc
+než
+něž
+ni
+ní
+nic
+ničeho
+ničem
+ničemu
+ničí
+ničím
+nie
+nieje
+nich
+nichž
+nijaký
+nikdo
+nikto
+nim
+ním
+nimi
+nimiž
+nimž
+nímž
+nízká
+niž
+níž
+nižádný
+níže
+nižší
+nový
+nutně
+oba
+obě
+oběma
+obou
+oč
+očpak
+ode
+odspoda
+odspodu
+ohledně
+okamžikem
+okolo
+on
+oň
+ona
+onen
+oni
+ono
+ony
+opravdu
+oproti
+ostatní
+osum
+pak
+poblíž
+počátkem
+počínaje
+počínajíc
+pod
+pode
+podél
+podle
+podobně
+pokud
+poměrně
+pomocí
+ponad
+pořád
+poslední
+posléze
+posud
+potom
+pražádný
+pro
+proč
+pročpak
+proň
+prostě
+proti
+proto
+protože
+před
+přede
+předem
+přes
+přese
+přesná
+přesné
+přesně
+přesný
+při
+přičemž
+přímo
+případná
+případné
+případně
+případný
+přitom
+půlí
+raději
+rokem
+sám
+sama
+samá
+samé
+samého
+samém
+samému
+sami
+samo
+samou
+samozřejmě
+samozřejmý
+samu
+samy
+samý
+samých
+samým
+samými
+se
+sebe
+sebou
+sem
+ses
+si
+sice
+sis
+skoro
+skrz
+skrze
+snad
+sobě
+som
+sotva
+sotvaco
+sotvakdo
+spíš
+spíše
+spodem
+spolu
+stačí
+stejně
+stranou
+středem
+svá
+své
+svého
+svém
+svému
+sví
+svoje
+svoji
+svojí
+svou
+svrchu
+svůj
+svých
+svým
+svými
+špatná
+špatné
+špatně
+špatný
+tací
+tady
+tahle
+tak
+taká
+také
+takhle
+takováto
+takové
+takovéhoto
+takovémto
+takovémuto
+takovéto
+takovíto
+takovouto
+takový
+takovýchto
+takovýma
+takovýmato
+takovýmito
+takovýmto
+takovýto
+takto
+taky
+taký
+takže
+tam
+tamten
+tatáž
+tato
+táž
+tě
+tebe
+tebou
+teď
+teda
+tedy
+téhle
+téhož
+těchhle
+těchto
+těchže
+těm
+téma
+těmahle
+těmhle
+těmihle
+těmito
+těmto
+těmu
+témuž
+témž
+témže
+ten
+tenhle
+tenhleten
+tento
+tentýž
+této
+téže
+ti
+tihle
+tím
+tímhle
+tímtéž
+tímto
+titíž
+tito
+tíž
+tobě
+tohle
+toho
+tohohle
+tohoto
+tom
+tomhle
+tomtéž
+tomto
+tomu
+tomuhle
+tomuto
+totéž
+toto
+touhle
+toutéž
+touto
+touž
+touže
+trochu
+trošku
+třeba
+tuhle
+tutéž
+tuto
+tvá
+tvé
+tvého
+tvém
+tvému
+tví
+tvoje
+tvoji
+tvojí
+tvou
+tvůj
+tvých
+tvým
+tvými
+ty
+tyhle
+týchž
+týká
+týmiž
+týmž
+tys
+tytéž
+tyto
+týž
+úderem
+uplná
+uplné
+úplně
+úplný
+uprostřed
+určitě
+uvnitř
+úvodem
+vám
+vámi
+vás
+váš
+vaše
+vaši
+včetně
+vedle
+velmi
+veprostřed
+versus
+vespod
+vespodu
+veškerý
+vevnitř
+víc
+více
+vím
+vinou
+víš
+viz
+vlastně
+vlivem
+vně
+vnitřka
+vnitřkem
+vnitřku
+von
+vrchem
+však
+vše
+všecek
+všecka
+všecko
+všecky
+všeho
+všech
+všechen
+všechna
+všechno
+všechnu
+všechny
+všelico
+všelicos
+všeličehos
+všeličems
+všeličemus
+všeličí
+všeličíms
+všelijaký
+všelikdo
+všeliký
+všeliskdo
+všem
+všemi
+všemu
+vši
+vší
+všicci
+všichni
+vším
+vůbec
+vůči
+vy
+vyjma
+vysoká
+výše
+vyšší
+vzdor
+vzhledem
+vždy
+za
+zač
+začátkem
+začpak
+zaň
+zásluhou
+zatím
+závěrem
+zboku
+zcela
+zčásti
+zda
+zdaleka
+zde
+zespoda
+zespodu
+zevnitř
+zeza
+znovu
+zpět
+zpod
+zponad
+zpoza
+zprostřed
+zřídkaco
+zřídkakdo
+zvnitřka
+zvnitřku
+žádný
diff --git a/wiki/inc/lang/cs/subscr_digest.txt b/wiki/inc/lang/cs/subscr_digest.txt
new file mode 100644
index 0000000..2ed7bf7
--- /dev/null
+++ b/wiki/inc/lang/cs/subscr_digest.txt
@@ -0,0 +1,18 @@
+Dobrý den!
+
+Byla změněna stránka @PAGE@ ve wiki @TITLE@.
+Zde jsou změny:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Stará revize: @OLDPAGE@
+Nová revize: @NEWPAGE@
+
+Pro odhlášení z odebírání změn na této webové stránce
+se prosím přihlaste do wiki na adrese
+@DOKUWIKIURL@, pak navštivte
+@SUBSCRIBE@
+a odhlaste se z odebírání změn na stránce či
+ve jmenném prostoru.
diff --git a/wiki/inc/lang/cs/subscr_form.txt b/wiki/inc/lang/cs/subscr_form.txt
new file mode 100644
index 0000000..d051b64
--- /dev/null
+++ b/wiki/inc/lang/cs/subscr_form.txt
@@ -0,0 +1,3 @@
+====== Správa odběratelů změn ======
+
+Tato stránka Vám umožňuje spravovat uživatele přihlášené k odběru změn aktuální stránky nebo jmenného prostoru.
\ No newline at end of file
diff --git a/wiki/inc/lang/cs/subscr_list.txt b/wiki/inc/lang/cs/subscr_list.txt
new file mode 100644
index 0000000..d769988
--- /dev/null
+++ b/wiki/inc/lang/cs/subscr_list.txt
@@ -0,0 +1,15 @@
+Dobrý den!
+
+Byly změněny stránky ve jmenném prostoru @PAGE@ wiki @TITLE@.
+Zde jsou:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Pro odhlášení z odebírání změn
+se prosím příhlašte do wiki na adrese
+@DOKUWIKIURL@, pak navštivte
+@SUBSCRIBE@
+a odhlaste se z odebírání změn na stránce či
+ve jmenném prostoru.
diff --git a/wiki/inc/lang/cs/subscr_single.txt b/wiki/inc/lang/cs/subscr_single.txt
new file mode 100644
index 0000000..83d45b6
--- /dev/null
+++ b/wiki/inc/lang/cs/subscr_single.txt
@@ -0,0 +1,21 @@
+Dobrý den!
+
+Byla změněna stránka @PAGE@ ve wiki @TITLE@.
+Zde jsou změny:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Datum: @DATE@
+Uživatel: @USER@
+Souhrn editace: @SUMMARY@
+Stará revize: @OLDPAGE@
+Nová revize: @NEWPAGE@
+
+Pro odhlášení z odebírání změn na této webové stránce
+se prosím přihlaste do wiki na adrese
+@DOKUWIKIURL@, pak navštivte
+@SUBSCRIBE@
+a odhlaste se z odebírání změn na stránce či
+ve jmenném prostoru.
diff --git a/wiki/inc/lang/cs/updateprofile.txt b/wiki/inc/lang/cs/updateprofile.txt
new file mode 100644
index 0000000..bf6281d
--- /dev/null
+++ b/wiki/inc/lang/cs/updateprofile.txt
@@ -0,0 +1,5 @@
+====== Upravit profil vašeho účtu ======
+
+Vyplňte pouze pole, která chcete změnit. Nemůžete ale změnit své uživatelské jméno.
+
+
diff --git a/wiki/inc/lang/cs/uploadmail.txt b/wiki/inc/lang/cs/uploadmail.txt
new file mode 100644
index 0000000..090167d
--- /dev/null
+++ b/wiki/inc/lang/cs/uploadmail.txt
@@ -0,0 +1,10 @@
+Do DokuWiki byl nahrán nový dokument. Zde jsou podrobnosti:
+
+Soubor : @MEDIA@
+Datum : @DATE@
+Prohlížeč : @BROWSER@
+IP adresa : @IPADDRESS@
+Hostitel : @HOSTNAME@
+Velikost : @SIZE@
+MIME typ : @MIME@
+Uživatel : @USER@
diff --git a/wiki/inc/lang/cy/admin.txt b/wiki/inc/lang/cy/admin.txt
new file mode 100644
index 0000000..75485fc
--- /dev/null
+++ b/wiki/inc/lang/cy/admin.txt
@@ -0,0 +1,4 @@
+====== Gweinyddu ======
+
+Gallwch chi ddarganfod rhestr o dasgau gweinyddol ar gael mewn DokuWiki, isod.
+
diff --git a/wiki/inc/lang/cy/adminplugins.txt b/wiki/inc/lang/cy/adminplugins.txt
new file mode 100644
index 0000000..ff21264
--- /dev/null
+++ b/wiki/inc/lang/cy/adminplugins.txt
@@ -0,0 +1,2 @@
+===== Ategion Ychwanegol =====
+
diff --git a/wiki/inc/lang/cy/backlinks.txt b/wiki/inc/lang/cy/backlinks.txt
new file mode 100644
index 0000000..2180e55
--- /dev/null
+++ b/wiki/inc/lang/cy/backlinks.txt
@@ -0,0 +1,4 @@
+====== Olgysylltiadau ======
+
+Dyma restr o dudalennau sy'n ymddangos eu bod nhw'n cysylltu'n ôl i'r dudalen gyfredol.
+
diff --git a/wiki/inc/lang/cy/conflict.txt b/wiki/inc/lang/cy/conflict.txt
new file mode 100644
index 0000000..133e863
--- /dev/null
+++ b/wiki/inc/lang/cy/conflict.txt
@@ -0,0 +1,6 @@
+====== Mae fersiwn mwy diweddar yn bodoli ======
+
+Mae fersiwn mwy diweddar o'r ddogfen a wnaethoch chi olygu yn bodoli. Bydd hwn yn digwydd pan fydd defnyddiwr arall yn newid y ddogfen wrth i chi'n ei golygu hi.
+
+Archwiliwch y gwahaniaethau isod yn drylwyr, yna penderfynnwch pa fersiwn i'w gadw. Os ydych chi'n dewis ''cadw'', caiff eich fersiwn chi ei gadw. Pwyswch ''canslo'' i gadw'r fersiwn cyfredol.
+
diff --git a/wiki/inc/lang/cy/denied.txt b/wiki/inc/lang/cy/denied.txt
new file mode 100644
index 0000000..2c0eb00
--- /dev/null
+++ b/wiki/inc/lang/cy/denied.txt
@@ -0,0 +1,4 @@
+====== Gwrthodwyd Hawl ======
+
+Sori, 'sdim hawliau digonol 'da chi i barhau.
+
diff --git a/wiki/inc/lang/cy/diff.txt b/wiki/inc/lang/cy/diff.txt
new file mode 100644
index 0000000..69a9ff6
--- /dev/null
+++ b/wiki/inc/lang/cy/diff.txt
@@ -0,0 +1,4 @@
+====== Gwahaniaethau ======
+
+Mae hwn yn dangos y gwahaniaethau rhwng dau fersiwn y dudalen.
+
diff --git a/wiki/inc/lang/cy/draft.txt b/wiki/inc/lang/cy/draft.txt
new file mode 100644
index 0000000..3b10c51
--- /dev/null
+++ b/wiki/inc/lang/cy/draft.txt
@@ -0,0 +1,8 @@
+====== Ffeil ddrafft wedi'i darganfod ======
+
+Doedd eich sesiwn golygu ddiwethaf heb gwblhau'n gywir. Gwnaeth DokuWiki gadw copi ddrafft yn awtomatig wrth i chi weithio, sydd nawr ar gael i chi er mwyn parhau gyda'ch golygu. Gallwch chi weld y data a gafodd ei gadw o'ch sesiwn diwethaf isod.
+
+Penderfynwch os ydych chi am //adennill// eich sesiwn golygu goll, //dileu//'r drafft awtogadw neu //canslo//'r broses olygu.
+
+
+
diff --git a/wiki/inc/lang/cy/edit.txt b/wiki/inc/lang/cy/edit.txt
new file mode 100644
index 0000000..7e2d899
--- /dev/null
+++ b/wiki/inc/lang/cy/edit.txt
@@ -0,0 +1,2 @@
+Golygwch y dudalen a phwyso ''Cadw''. Gweler [[wiki:syntax]] ar gyfer cystrawen Wici. Golygwch y dudalen hon dim ond os ydych chi'n gallu ei **gwella** hi. Os ydych chi am brofi pethau, cymerwch eich camau cyntaf ar y [[playground:playground|maes chwarae]].
+
diff --git a/wiki/inc/lang/cy/editrev.txt b/wiki/inc/lang/cy/editrev.txt
new file mode 100644
index 0000000..5d32e9a
--- /dev/null
+++ b/wiki/inc/lang/cy/editrev.txt
@@ -0,0 +1,2 @@
+**Rydych chi wedi llwytho hen adolygiad y ddogfen!** Os ydych chi'n ei chadw hi, byddwch chi'n creu fersiwn newydd gyda'r data hwn.
+----
diff --git a/wiki/inc/lang/cy/index.txt b/wiki/inc/lang/cy/index.txt
new file mode 100644
index 0000000..607a2f6
--- /dev/null
+++ b/wiki/inc/lang/cy/index.txt
@@ -0,0 +1,4 @@
+====== Map safle ======
+
+Dyma fap safle o bob tudalen sydd ar gael, wedi'u trefnu gan [[doku>namespaces|namespaces]].
+
diff --git a/wiki/inc/lang/cy/install.html b/wiki/inc/lang/cy/install.html
new file mode 100644
index 0000000..406c7b4
--- /dev/null
+++ b/wiki/inc/lang/cy/install.html
@@ -0,0 +1,24 @@
+<p>Mae'r dudalen hon yn eich helpu chi i arsefydlu am y tro cyntaf a gyda ffurfweddu
+<a href="http://dokuwiki.org">Dokuwiki</a>. Mae mwy o wybodaeth ar yr arsefydlwr hwn
+ar <a href="http://dokuwiki.org/installer">dudalen ddogfennaeth</a> ei hun.</p>
+
+<p>Mae DokuWiki yn defnyddio ffeiliau arferol ar gyfer storio tudalennau wici a
+gwybodaeth gysylltiol gyda'r tudalennau hynny (e.e. delweddau, indecsau chwilio,
+hen adolygiadau, ac ati).  Er mwyn gweithredu'n llwyddiannus mae'n
+<strong>rhaid</strong> i DokuWiki gael yr hawl i ysgrifennu i'r ffolderi sydd yn
+dal y ffeiliau hynny. 'Dyw'r arsefydlwr hwn ddim yn gallu gosod hawliau ffolderi.
+Bydd hwn, fel rheol, yn gorfod cael ei wneud yn uniongyrchol gydag anogwr gorchymyn,
+neu os ydych chi'n defnyddio gwesteiwr, drwy FTP neu eich panel gwesteio (e.e.
+cPanel).</p>
+
+<p>Bydd yr arsefydlwr hwn yn gosod eich ffurfwedd DokuWiki ar gyfer
+<abbr title="access control list">ACL</abbr>, sydd yn ei dro yn caniat&aacute;u
+mewngofnodi gweinyddwr a mynediad i ddewislen gweinyddu DokuWiki ar gyfer arsefydlu
+ategion, rheoli defnyddwyr, rheoli mynediad i dudalennau wici a newid gosodiadau
+ffurfwedd. 'Sdim angen hwn ar DokuWiki er mwyn gweithio, ond bydd yn gwneud
+Dokuwiki yn haws i'w weinyddu.</p>
+
+<p>Dylai defnyddwyr profiadol neu'r rheiny gydag anghenion gosodiad rrbennig special
+ddefnyddio'r dolenni hyn am wybodaeth parthed
+<a href="http://dokuwiki.org/install">canllawiau arsefydlu</a>
+and <a href="http://dokuwiki.org/config">gosodiadau ffurfwedd</a>.</p>
diff --git a/wiki/inc/lang/cy/jquery.ui.datepicker.js b/wiki/inc/lang/cy/jquery.ui.datepicker.js
new file mode 100644
index 0000000..14fce91
--- /dev/null
+++ b/wiki/inc/lang/cy/jquery.ui.datepicker.js
@@ -0,0 +1,45 @@
+/* Welsh/UK initialisation for the jQuery UI date picker plugin. */
+/* Written by William Griffiths. */
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "../widgets/datepicker" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery.datepicker );
+	}
+}( function( datepicker ) {
+
+datepicker.regional[ "cy-GB" ] = {
+	closeText: "Done",
+	prevText: "Prev",
+	nextText: "Next",
+	currentText: "Today",
+	monthNames: [ "Ionawr","Chwefror","Mawrth","Ebrill","Mai","Mehefin",
+	"Gorffennaf","Awst","Medi","Hydref","Tachwedd","Rhagfyr" ],
+	monthNamesShort: [ "Ion", "Chw", "Maw", "Ebr", "Mai", "Meh",
+	"Gor", "Aws", "Med", "Hyd", "Tac", "Rha" ],
+	dayNames: [
+		"Dydd Sul",
+		"Dydd Llun",
+		"Dydd Mawrth",
+		"Dydd Mercher",
+		"Dydd Iau",
+		"Dydd Gwener",
+		"Dydd Sadwrn"
+	],
+	dayNamesShort: [ "Sul", "Llu", "Maw", "Mer", "Iau", "Gwe", "Sad" ],
+	dayNamesMin: [ "Su","Ll","Ma","Me","Ia","Gw","Sa" ],
+	weekHeader: "Wy",
+	dateFormat: "dd/mm/yy",
+	firstDay: 1,
+	isRTL: false,
+	showMonthAfterYear: false,
+	yearSuffix: "" };
+datepicker.setDefaults( datepicker.regional[ "cy-GB" ] );
+
+return datepicker.regional[ "cy-GB" ];
+
+} ) );
diff --git a/wiki/inc/lang/cy/lang.php b/wiki/inc/lang/cy/lang.php
new file mode 100644
index 0000000..de407f8
--- /dev/null
+++ b/wiki/inc/lang/cy/lang.php
@@ -0,0 +1,372 @@
+<?php
+/**
+ * welsh language file
+ *
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author     Andreas Gohr <andi@splitbrain.org>
+ * @author     Anika Henke <anika@selfthinker.org>
+ * @author     Matthias Grimm <matthiasgrimm@users.sourceforge.net>
+ * @author     Matthias Schulte <mailinglist@lupo49.de>
+ * @author     Alan Davies <ben.brynsadler@gmail.com>
+ */
+$lang['encoding']              = 'utf-8';
+$lang['direction']             = 'ltr';
+$lang['doublequoteopening']    = '“'; //&ldquo;
+$lang['doublequoteclosing']    = '”'; //&rdquo;
+$lang['singlequoteopening']    = '‘'; //&lsquo;
+$lang['singlequoteclosing']    = '’'; //&rsquo;
+$lang['apostrophe']            = '’'; //&rsquo;
+
+$lang['btn_edit']              = 'Golygu\'r dudaen hon';
+$lang['btn_source']            = 'Dangos y ffynhonnell';
+$lang['btn_show']              = 'Dangos y dudalen';
+$lang['btn_create']            = 'Creu\'r dudalen';
+$lang['btn_search']            = 'Chwilio';
+$lang['btn_save']              = 'Cadw';
+$lang['btn_preview']           = 'Rhagolwg';
+$lang['btn_top']               = 'Nôl i\'r brig';
+$lang['btn_newer']             = '<< mwy diweddar';
+$lang['btn_older']             = 'llai diweddar >>';
+$lang['btn_revs']              = 'Hen adolygiadau';
+$lang['btn_recent']            = 'Newidiadau Diweddar';
+$lang['btn_upload']            = 'Lanlwytho';
+$lang['btn_cancel']            = 'Canslo';
+$lang['btn_index']             = 'Safle map';
+$lang['btn_secedit']           = 'Golygu';
+$lang['btn_login']             = 'Mewngofnodi';
+$lang['btn_logout']            = 'Allgofnodi';
+$lang['btn_admin']             = 'Gweinyddu';
+$lang['btn_update']            = 'Diweddaru';
+$lang['btn_delete']            = 'Dileu';
+$lang['btn_back']              = 'Nôl';
+$lang['btn_backlink']          = 'Olgysylltiadau';
+$lang['btn_subscribe']         = 'Rheoli Tanysgrifiadau';
+$lang['btn_profile']           = 'Diweddaru Proffil';
+$lang['btn_reset']             = 'Ailosod';
+$lang['btn_resendpwd']         = 'Gosod cyfrinair newydd';
+$lang['btn_draft']             = 'Golygu drafft';
+$lang['btn_recover']           = 'Adennill drafft';
+$lang['btn_draftdel']          = 'Dileu drafft';
+$lang['btn_revert']            = 'Adfer';
+$lang['btn_register']          = 'Cofrestru';
+$lang['btn_apply']             = 'Gosod';
+$lang['btn_media']             = 'Rheolwr Cyfrwng';
+$lang['btn_deleteuser']        = 'Tynnu Fy Nghyfrif';
+$lang['btn_img_backto']        = 'Nôl i %s';
+$lang['btn_mediaManager']      = 'Dangos mewn rheolwr cyfrwng';
+
+$lang['loggedinas']            = 'Mewngofnodwyd fel:';
+$lang['user']                  = 'Defnyddair';
+$lang['pass']                  = 'Cyfrinair';
+$lang['newpass']               = 'Cyfrinair newydd';
+$lang['oldpass']               = 'Cadarnhau cyfrinair cyfredol';
+$lang['passchk']               = 'unwaith eto';
+$lang['remember']              = 'Cofio fi';
+$lang['fullname']              = 'Enw go iawn';
+$lang['email']                 = 'E-Bost';
+$lang['profile']               = 'Proffil Defnyddiwr';
+$lang['badlogin']              = 'Sori, roedd y defnyddair neu\'r gyfriair yn anghywir.';
+$lang['badpassconfirm']        = 'Sori, roedd y cyfrinair yn anghywir';
+$lang['minoredit']             = 'Newidiadau Bach';
+$lang['draftdate']             = 'Awtogadwyd drafft ar'; // full dformat date will be added
+$lang['nosecedit']             = 'Newidiwyd y dudaen yn y cyfamser, roedd gwybodaeth yr adran wedi dyddio, felly llwythwyd y dudalen gyfan.';
+
+$lang['regmissing']            = 'Sori, llenwch bob maes.';
+$lang['reguexists']            = 'Sori, mae defnyddiwr â\'r enw hwn yn bodoli eisoes.';
+$lang['regsuccess']            = 'Cafodd y defnyddiwr ei greu a chafodd y cyfrinair ei anfon gan ebost.';
+$lang['regsuccess2']           = 'Cafodd y defnyddiwr ei greu.';
+$lang['regfail']               = 'Doedd dim modd creu\'r defnyddiwr.';
+$lang['regmailfail']           = 'Mae\'n debyg roedd gwall wrth anfon y post cyfrinair. Cysylltwch â\'r gweinyddwr!';
+$lang['regbadmail']            = 'Mae\'r cyfeiriad ebost a gyflwynoch chi\'n edrych yn annilys - os ydych chi\'n credu ei fod yn gywir, cysylltwch â\'r gweinyddwr';
+$lang['regbadpass']            = '\'Dyw\'r ddau gyfrinair ddim yn unfath, ceisiwch eto.';
+$lang['regpwmail']             = 'Eich cyfrinair DokuWiki';
+$lang['reghere']               = '\'Sdim cyfrif \'da chi eto? Cewch afael yn un nawr';
+
+$lang['profna']                = '\'Dyw\'r wici hwn ddim yn caniatáu newid eich proffil';
+$lang['profnochange']          = 'Dim newidiadau, dim i\'w wneud.';
+$lang['profnoempty']           = '\'Sdim modd gadael eich enw neu\'ch cyfeiriad ebost chi\'n wag.';
+$lang['profchanged']           = 'Diweddarwyd eich proffil defnyddiwr yn llwyddiannus.';
+$lang['profnodelete']          = '\'Dyw\'r wici hwn ddim yn caniatáu dileu defnyddwyr';
+$lang['profdeleteuser']        = 'Dileu Cyfrif';
+$lang['profdeleted']           = 'Cafodd eich cyfrif defnyddiwr chi ei ddileu o\'r wiki hwn';
+$lang['profconfdelete']        = '\'Dwi eisiau tynnu fy nghyfrif oddi ar y wici hwn. <br/> \'Sdim modd dadwneud hyn.';
+$lang['profconfdeletemissing'] = 'Blwch gwirio heb ei dicio';
+$lang['proffail']              = 'Proffil defnyddiwr heb ei ddiweddaru.';
+
+$lang['pwdforget']             = 'Anghofio\'ch cyfrinair? Cael gafael ar un newydd';
+$lang['resendna']              = '\'Dyw\'r wici hwn ddim yn caniatáu ailanfon cyfrineiriau.';
+$lang['resendpwd']             = 'Gosod cyfrinair newydd ar gyfer';
+$lang['resendpwdmissing']      = 'Sori, mae\'n rhaid llenwi pob maes.';
+$lang['resendpwdnouser']       = 'Sori, \'dyn ni ddim yn gallu darganfod y defnyddiwr hwn yn ein databas ni.';
+$lang['resendpwdbadauth']      = 'Sori, \'dyw\'r cod dilysu hwn ddim yn ddilys. Sicrhewch eich bod chi wedi defnyddio\'r ddolen gadarnhau gyfan.';
+$lang['resendpwdconfirm']      = 'Cafodd ddolen gadarnhau ei hanfon gan ebost.';
+$lang['resendpwdsuccess']      = 'Cafodd eich cyfrinair newydd chi ei anfon gan ebost.';
+
+$lang['license']               = 'Heb law bod datganiad i\'r gwrthwyneb, mae cynnwys y wici hwn o dan y drwydded ganlynol:';
+$lang['licenseok']             = 'Sylwir: Gan olygu\'r dudalen hon rydych chi\'n cytuno i drwyddedu\'ch cynnwys chi o dan y drwydded ganlynol:';
+
+$lang['searchmedia']           = 'Chwilio enw ffeil:';
+$lang['searchmedia_in']        = 'Chwilio mewn %s';
+$lang['txt_upload']            = 'Dewis ffeil i\'w lanlwytho:';
+$lang['txt_filename']          = 'Upload as (optional):';
+$lang['txt_overwrt']           = 'Trosysgrifo ffeil sy\'n bodoli';
+$lang['maxuploadsize']         = 'Lanlwytho uchanfswm %s y ffeil.';
+$lang['lockedby']              = 'Clowyd yn bresennol gan:';
+$lang['lockexpire']            = 'Clo\'n dod i ben ar:';
+
+$lang['js']['willexpire']      = 'Mae\'ch clo ar gyfer golygu\'r dudalen hon yn mynd i ddod i ben mewn munud.\nEr mwyn osgoi gwrthdrawiadau defnyddiwch y botwm rhagolwg i ailosod amserydd y clo.';
+$lang['js']['notsavedyet']     = 'Caiff newidiadau heb gadw eu colli.';
+$lang['js']['searchmedia']     = 'Chwilio am ffeiliau';
+$lang['js']['keepopen']        = 'Cadw ffesnestr y dewisiad ar agor';
+$lang['js']['hidedetails']     = 'Cuddio Manylion';
+$lang['js']['mediatitle']      = 'Gosodiadau dolenni';
+$lang['js']['mediadisplay']    = 'Math y ddolen';
+$lang['js']['mediaalign']      = 'Aliniad';
+$lang['js']['mediasize']       = 'Maint y ddelwedd';
+$lang['js']['mediatarget']     = 'Targed y ddolen';
+$lang['js']['mediaclose']      = 'Cau';
+$lang['js']['mediainsert']     = 'Mewnosod';
+$lang['js']['mediadisplayimg'] = 'Dangos y ddelwedd.';
+$lang['js']['mediadisplaylnk'] = 'Dangos y ddolen yn unig.';
+$lang['js']['mediasmall']      = 'Fersiwn bach';
+$lang['js']['mediamedium']     = 'Fersiwn canolig';
+$lang['js']['medialarge']      = 'Fersiwn mawr';
+$lang['js']['mediaoriginal']   = 'Fersiwn gwreiddiol';
+$lang['js']['medialnk']        = 'Cysylltu i dudalen fanylion';
+$lang['js']['mediadirect']     = 'Cysylltiad uniongyrchol i\'r gwreiddiol';
+$lang['js']['medianolnk']      = 'Dim dolen';
+$lang['js']['medianolink']     = 'Peidio cysylltu i\'r dudalen';
+$lang['js']['medialeft']       = 'Alinio\'r ddelwedd i\'r chwith.';
+$lang['js']['mediaright']      = 'Alinio\'r ddelwedd i\'r dde.';
+$lang['js']['mediacenter']     = 'Alinio\'r ddelwedd i\'r canol.';
+$lang['js']['medianoalign']    = 'Peidio alinio.';
+$lang['js']['nosmblinks']      = 'Mae cysylltu gyda Windows shares dim ond yn gweithio gyda Microsoft Internet Explorer.\nGallwch chi gopïo a gludo\'r ddolen hefyd.';
+$lang['js']['linkwiz']         = 'Dewin Dolenni';
+$lang['js']['linkto']          = 'Cysylltu i:';
+$lang['js']['del_confirm']     = 'Gwir ddileu\'r eitem(au) a ddewiswyd?';
+$lang['js']['restore_confirm'] = 'Gwir adfer y fersiwn hwn?';
+$lang['js']['media_diff']          = 'Gweld gwahaniaethau:';
+$lang['js']['media_diff_both']     = 'Ochr wrth Ochr';
+$lang['js']['media_diff_opacity']  = 'Tywynnu-drwodd';
+$lang['js']['media_diff_portions'] = 'Taro'; //Swipe - rhaid bod gwell ateb i hwn
+$lang['js']['media_select']        = 'Dewis ffeiliau…';
+$lang['js']['media_upload_btn']    = 'Lanlwytho';
+$lang['js']['media_done_btn']      = 'Gorffen';
+$lang['js']['media_drop']          = 'Gollwng ffeiliau yma i\'w lanlwytho';
+$lang['js']['media_cancel']        = 'tynnu';
+$lang['js']['media_overwrt']       = 'Trosysgrifo ffeiliau sy\'n bodoli';
+
+$lang['rssfailed']             = 'Roedd gwall wrth hôl y ffrwd hwn: ';
+$lang['nothingfound']          = 'Dim wedi\'i ddarganfod.';
+
+$lang['mediaselect']           = 'Ffeiliau Cyfrwng';
+$lang['uploadsucc']            = 'Lanlwythiad llwyddiannus';
+$lang['uploadfail']            = 'Methodd y lanlwythiad. Hawliau anghywir efallai?';
+$lang['uploadwrong']           = 'Gwrthodwyd y lanlwythiad. Gwaherddir yr estyniad ffeil hwn!';
+$lang['uploadexist']           = 'Mae\'r ffeil eisoes yn bodoli. Dim wedi\'i wneud.';
+$lang['uploadbadcontent']      = 'Doedd y cynnwys a lanlwythwyd ddim yn cydweddu ag estyniad ffeil %s.';
+$lang['uploadspam']            = 'Cafodd y lanlwythiad ei flocio gan rhestr wahardd sbam.';
+$lang['uploadxss']             = 'Cafodd y lanlwythiad ei flocio efallai oherwydd cynnwys maleisus.';
+$lang['uploadsize']            = 'Roedd y ffeil a lanlwythwyd yn rhy fawr. (uchaf. %s)';
+$lang['deletesucc']            = 'Cafodd ffeil "%s" ei dileu.';
+$lang['deletefail']            = 'Doedd dim modd dileu "%s" - gwiriwch hawliau.';
+$lang['mediainuse']            = 'Doedd "%s" heb ei dileu - mae\'n cael ei defnyddio ar hyn o bryd.';
+$lang['namespaces']            = 'Namespaces'; //namespace
+$lang['mediafiles']            = 'Ffeiliau ar gael mewn';
+$lang['accessdenied']          = '\'Sdim hawl \'da chi weld y dudalen hon.';
+$lang['mediausage']            = 'Defnyddiwch y gystrawen ganlynol i gyfeirio at y ffeil hon:';
+$lang['mediaview']             = 'Dangos y ffeil wreiddiol';
+$lang['mediaroot']             = 'gwraidd';
+$lang['mediaupload']           = 'lanlwythwch ffeil i\'r namespace cyfredol yma. Er mwy creu is-namespace, ychwanegwch nhw o flaen enw\'r ffeil gan eu gwahanu nhw gyda cholonau, ar ôl i chi ddewis y ffeiliau. Gall ffeiliau hefyd eu dewis gan lusgo a gollwng.'; //namespace
+$lang['mediaextchange']        = 'Newidiwyd yr estyniad o .%s i .%s!';
+$lang['reference']             = 'Cyfeirnodau ar gyfer';
+$lang['ref_inuse']             = '\'Sdim modd dileu\'r ffeil hon, oherwydd ei bod hi\'n dal yn cael ei defnyddio gan y tudalennau canlynol:';
+$lang['ref_hidden']            = 'Mae rhai cyfeirnodau ar dudalennau \'sdim hawl \'da chi weld';
+
+$lang['hits']                  = 'Trawiadau';
+$lang['quickhits']             = 'Enw tudalennau\'n cydweddu';
+$lang['toc']                   = 'Tabl Cynnwys';
+$lang['current']               = 'cyfredol';
+$lang['yours']                 = 'Eich Fersiwn';
+$lang['diff']                  = 'Dangos gwahaniaethau i\'r adolygiadau cyfredol';
+$lang['diff2']                 = 'Dangos gwahaniaethau rhwng adolygiadau a ddewiswyd';
+$lang['difflink']              = 'Cysylltu i\'r olwg gymharu hon';
+$lang['diff_type']             = 'Dangos gwahaniaethau:';
+$lang['diff_inline']           = 'Mewnlin';
+$lang['diff_side']             = 'Ochr wrth Ochr';
+$lang['diffprevrev']           = 'Adolygiad blaenorol';
+$lang['diffnextrev']           = 'Adolygiad nesaf';
+$lang['difflastrev']           = 'Adolygiad diwethaf';
+$lang['diffbothprevrev']       = 'Dwy ochr yr adolygiad blaenorol';
+$lang['diffbothnextrev']       = 'Dwy ochr yr adolygiad nesaf';
+$lang['line']                  = 'Llinell';
+$lang['breadcrumb']            = 'Olrhain:';
+$lang['youarehere']            = 'Rydych chi yma:';
+$lang['lastmod']               = 'Newidiwyd ddiwethaf:';
+$lang['by']                    = 'gan';
+$lang['deleted']               = 'tynnwyd';
+$lang['created']               = 'crewyd';
+$lang['restored']              = 'adferwyd hen adolygiad (%s)';
+$lang['external_edit']         = 'golygiad allanol';
+$lang['summary']               = 'Crynodeb golygiad';
+$lang['noflash']               = 'Mae angen <a href="http://www.adobe.com/products/flashplayer/">Ategyn Adobe Flash</a> i ddangos y cynnwys hwn.';
+$lang['download']              = 'Lawrlwytho Darn';
+$lang['tools']                 = 'Teclynnau';
+$lang['user_tools']            = 'Teclynnau Defnyddiwr';
+$lang['site_tools']            = 'Teclynnau Safle';
+$lang['page_tools']            = 'Teclynnau Tudalennau';
+$lang['skip_to_content']       = 'nedio i\'r cynnwys';
+$lang['sidebar']               = 'Bar ochr';
+
+$lang['mail_newpage']          = 'ychwanegwyd tudalen:';
+$lang['mail_changed']          = 'newidiwyd tudalen:';
+$lang['mail_subscribe_list']   = 'newidiwyd tudalennau mewn namespace:'; //namespace
+$lang['mail_new_user']         = 'defnyddiwr newydd:';
+$lang['mail_upload']           = 'lanlwythwyd ffeil:';
+
+$lang['changes_type']          = 'Dangos newidiadau mewn';
+$lang['pages_changes']         = 'Tudalennau';
+$lang['media_changes']         = 'Ffeiliau cyfrwng';
+$lang['both_changes']          = 'Tudalennau a ffeiliau cyfrwng';
+
+$lang['qb_bold']               = 'Testun Bras';
+$lang['qb_italic']             = 'Testun Italig';
+$lang['qb_underl']             = 'Testun wedi\'i Danlinellu';
+$lang['qb_code']               = 'Testun Unbylchog';
+$lang['qb_strike']             = 'Testun Llinell Drwodd';
+$lang['qb_h1']                 = 'Pennawd Lefel 1';
+$lang['qb_h2']                 = 'Pennawd Lefel 2';
+$lang['qb_h3']                 = 'Pennawd Lefel 3';
+$lang['qb_h4']                 = 'Pennawd Lefel 4';
+$lang['qb_h5']                 = 'Pennawd Lefel 5';
+$lang['qb_h']                  = 'Pennawd';
+$lang['qb_hs']                 = 'Dewis Pennawd';
+$lang['qb_hplus']              = 'Pennawd Uwch';
+$lang['qb_hminus']             = 'Pennawd Is';
+$lang['qb_hequal']             = 'Pennawd yr un Lefel';
+$lang['qb_link']               = 'Dolen fewnol';
+$lang['qb_extlink']            = 'Dolen allanol';
+$lang['qb_hr']                 = 'Llinell Lorweddol';
+$lang['qb_ol']                 = 'Eitem Rhestr Drefnedig';
+$lang['qb_ul']                 = 'Eitem Rhestr Rifol';
+$lang['qb_media']              = 'Ychwanegu Delweddau a ffeiliau eraill (agor mewn ffenestr newydd)';
+$lang['qb_sig']                = 'Mewnosod Llofnod';
+$lang['qb_smileys']            = 'Gwenogluniau';
+$lang['qb_chars']              = 'Nodau Arbennig';
+
+$lang['upperns']               = 'neidio i namespace uwch'; //namespace
+
+$lang['metaedit']              = 'Golygu Metadata';
+$lang['metasaveerr']           = 'Methwyd ysgrifennu metadata';
+$lang['metasaveok']            = 'Cadwyd y metadata';
+$lang['img_title']             = 'Teitl:';
+$lang['img_caption']           = 'Egluryn:';
+$lang['img_date']              = 'Dyddiad:';
+$lang['img_fname']             = 'Enw ffeil:';
+$lang['img_fsize']             = 'Maint:';
+$lang['img_artist']            = 'Ffotograffydd:';
+$lang['img_copyr']             = 'Hawlfraint:';
+$lang['img_format']            = 'Fformat:';
+$lang['img_camera']            = 'Camera:';
+$lang['img_keywords']          = 'Allweddeiriau:';
+$lang['img_width']             = 'Lled:';
+$lang['img_height']            = 'Uchder:';
+
+$lang['subscr_subscribe_success']   = 'Ychwanegwyd %s i\'r rhestr danysgrifio ar gyfer %s';
+$lang['subscr_subscribe_error']     = 'Gwall wrth ychwanegu %s i\'r rhestr danysgrifio ar gyfer %s';
+$lang['subscr_subscribe_noaddress'] = '\'Sdim cyfeiriad wedi\'i gysylltu gyda\'ch defnyddair, felly \'sdim modd eich ychwanegu chi i\'r rhestr danysgrifio';
+$lang['subscr_unsubscribe_success'] = 'Tynnwyd %s o\'r rhestr danysgrifio ar gyfer %s';
+$lang['subscr_unsubscribe_error']   = 'Roedd gwall wrth dynnu %s o\'r rhestr danysgrfio ar gyfer %s';
+$lang['subscr_already_subscribed']  = 'Mae %s eisoes wedi tanysgrifio i %s';
+$lang['subscr_not_subscribed']      = '\'Dyw %s heb danysgrifio i %s';
+// Manage page for subscriptions
+$lang['subscr_m_not_subscribed']    = '\'Dych chi heb danysgrifio i\'r dudalen gyfredol neu\'r namespace, yn bresennol.'; //namespace
+$lang['subscr_m_new_header']        = 'Ychwanegu tanysgrifiad';
+$lang['subscr_m_current_header']    = 'Tanysgrifiadau cyfredol';
+$lang['subscr_m_unsubscribe']       = 'Tynnu tanysgrifiad';
+$lang['subscr_m_subscribe']         = 'Tanysgrifio';
+$lang['subscr_m_receive']           = 'Derbyn';
+$lang['subscr_style_every']         = 'ebost ar bob newid';
+$lang['subscr_style_digest']        = 'ebost cryno o\'r newidiadau ar bob tudalen (pob %.2f diwrnod)';
+$lang['subscr_style_list']          = 'rhestr o dudalennau a newidiwyd ers yr ebost diwethaf (pob %.2f diwrnod)';
+
+/* auth.class language support */
+$lang['authtempfail']          = '\'Dyw dilysiad defnyddiwr ddim ar gael yn bresennol (dros dro). Os ydy\'r sefyllfa\'n parhau, cysylltwch â gweinyddwr y wici.';
+
+/* installer strings */
+$lang['i_chooselang']          = 'Dewiswch eich iaith';
+$lang['i_installer']           = 'Arsefydlwr DokuWiki';
+$lang['i_wikiname']            = 'Enw Wici';
+$lang['i_enableacl']           = 'Galluogi ACL (awgrymwyd)';
+$lang['i_superuser']           = 'Uwchddefnyddiwr';
+$lang['i_problems']            = 'Gwnaeth yr arsefydlwr ddod o hyd i broblemau, isod. \'Sdim modd parhau nes i chi eu datrys nhw.';
+$lang['i_modified']            = 'Oherwydd rhesymau diogelwch, bydd y sgript hwn dim ond yn gweithio gydag arsefydliad DokuWiki newydd sydd heb ei newid.
+                                  Dylech chi naill ai ail-echdynnu\'r ffeiliau o\'r pecyn a lawrlwythwyd neu porwch dros y
+                                  <a href="http://dokuwiki.org/install">canllawiau arsefydylu Dokuwiki</a> cyfan';
+$lang['i_funcna']              = 'Swyddogaeth PHP <code>%s</code> ddim ar gael. Posib bod eich gwesteiwr wedi\'i hanalluogi am ryw reswm?';
+$lang['i_phpver']              = 'Mae\'ch fersiwn PHP <code>%s</code> yn is na\'r hyn sydd ei angen <code>%s</code>. Mae angen i chi ddiweddaru eich arsefydliad PHP.';
+$lang['i_mbfuncoverload']      = 'Mae\'n rhaid analluogi mbstring.func_overload mewn php.ini er mwyn rhedeg DokuWiki.';
+$lang['i_permfail']            = '\'Dyw DokuWiki ddim yn gallu ysgrifennu i <code>%s</code>. Mae angen newid gosodiadau hawliau ar gyfer y ffolder hwn!';
+$lang['i_confexists']          = 'Mae <code>%s</code> eisoes yn bodoli';
+$lang['i_writeerr']            = 'Methu creu <code>%s</code>. Bydd angen i chi wirio hawliau ffolder/ffeil a chreu\'r ffeil gan law.';
+$lang['i_badhash']             = 'dokuwiki.php heb ei adnabod neu wedi\'i newid (hash=<code>%s</code>)';
+$lang['i_badval']              = '<code>%s</code> - gwerth anghyfreithlon neu wag';
+$lang['i_success']             = 'Gorffennodd y ffurfwedd yn llwyddiannus. Gallwch chi ddileu\'r ffeil install.php nawr. Ewch
+                                 <a href="doku.php?id=wiki:welcome">i\'ch DokuWiki newydd</a>.';
+$lang['i_failure']             = 'Ymddangosodd gwallau wrth ysgrifennu\'r ffeiliau ffurfwedd. Bydd angen i chi eu cywiro
+                                  nhw gan law cyn gallwch chi ddefnyddio\'ch <a href="doku.php?id=wiki:welcome">DokuWiki newydd</a>.';
+$lang['i_policy']              = 'Polisi ACL cychwynnol';
+$lang['i_pol0']                = 'Wici Agored (darllen, ysgrifennu, lanlwytho i bawb)';
+$lang['i_pol1']                = 'Wici Cyhoeddus (darllen i bawb, ysgrifennu a lanlwytho i ddefnyddwyr cofrestredig)';
+$lang['i_pol2']                = 'Wici Caeedig (darllen, ysgrifennu, lanlwytho i ddefnyddwyr cofrestredig yn unig)';
+$lang['i_allowreg']            = 'Caniatáu defnyddwyr i gofrestru eu hunain';
+$lang['i_retry']               = 'Ailgeisio';
+$lang['i_license']             = 'Dewiswch y drwydded rydych chi am osod ar eich cynnwys:';
+$lang['i_license_none']        = 'Peidio â dangos unrhyw wybodaeth drwyddedu';
+$lang['i_pop_field']           = 'Plis, helpwch ni i wella\'r profiad o ddefnyddio DokuWiki:';
+$lang['i_pop_label']           = 'Anfon data defnydd anhysbys i ddatblygwyr DokuWiki unwaith y mis';
+
+$lang['recent_global']         = 'Yn bresennol, rydych chi\'n gwylio newidiadau tu fewn namespace <b>%s</b>. Gallwch chi hefyd <a href="%s">weld y newidiadau diweddar ar gyfer y wici cyfan</a>.'; //namespace
+
+$lang['years']                 = '%d blynedd yn ôl';
+$lang['months']                = '%d mis yn ôl';
+$lang['weeks']                 = '%d wythnos yn ôl';
+$lang['days']                  = '%d diwrnod yn ôl';
+$lang['hours']                 = '%d awr yn ôl';
+$lang['minutes']               = '%d munud yn ôl';
+$lang['seconds']               = '%d eiliad yn ôl';
+
+$lang['wordblock']             = 'Doedd eich newid heb gadw gan ei fod yn cynnwys testun wedi\'i flocio (sbam).';
+
+$lang['media_uploadtab']       = 'Lanlwytho';
+$lang['media_searchtab']       = 'Chwilio';
+$lang['media_file']            = 'Ffeil';
+$lang['media_viewtab']         = 'Golwg';
+$lang['media_edittab']         = 'Golygu';
+$lang['media_historytab']      = 'Hanes';
+$lang['media_list_thumbs']     = 'Bawdlun';
+$lang['media_list_rows']       = 'Rhesi';
+$lang['media_sort_name']       = 'Enw';
+$lang['media_sort_date']       = 'Dyddiad';
+$lang['media_namespaces']      = 'Dewis namespace'; //namespace
+$lang['media_files']           = 'Ffeiliau mewn %s';
+$lang['media_upload']          = 'Lanlwytho i %s';
+$lang['media_search']          = 'Chwilio mewn %s';
+$lang['media_view']            = '%s';
+$lang['media_viewold']         = '%s ar %s';
+$lang['media_edit']            = 'Golygu %s';
+$lang['media_history']         = 'Hanes %s';
+$lang['media_meta_edited']     = 'golygwyd metadata';
+$lang['media_perm_read']       = 'Sori, ond \'sdim digon o hawliau \'da chi i ddarllen ffeiliau.';
+$lang['media_perm_upload']     = 'Sori, ond \'sdim digon o hawliau \'da chi i lanlwytho ffeiliau.';
+$lang['media_update']          = 'Lanlwytho fersiwn newydd';
+$lang['media_restore']         = 'Adfer y fersiwn hwn';
+$lang['media_acl_warning']     = 'Gall y rhestr hon fod yn anghyflawn oherwydd cyfyngiadau ACL a thudalennau coll.';
+
+$lang['currentns']             = 'Namespace cyfredol'; //namespace
+$lang['searchresult']          = 'Canlyniad Chwilio';
+$lang['plainhtml']             = 'HTML Plaen';
+$lang['wikimarkup']            = 'Iaith Wici';
+$lang['page_nonexist_rev']     = 'Doedd y dudalen ddim yn bodoli ar %s. Cafodd ei chreu wedyn ar <a href="%s">%s</a>.';
+$lang['unable_to_parse_date']  = 'Methu dosbarthu ar baramedr "%s".';
+//Setup VIM: ex: et ts=2 :
diff --git a/wiki/inc/lang/cy/locked.txt b/wiki/inc/lang/cy/locked.txt
new file mode 100644
index 0000000..4c7865d
--- /dev/null
+++ b/wiki/inc/lang/cy/locked.txt
@@ -0,0 +1,3 @@
+====== Tudalen ar glo ======
+
+Mae'r dudalen hon wedi'i chloi ar gyfer golygu gan ddefnyddiwr arall. Bydd yn rhaid i chi aros tan i'r defnyddiwr orffen golygu neu tan fod y cyfnod cloi yn dod i ben.
diff --git a/wiki/inc/lang/cy/login.txt b/wiki/inc/lang/cy/login.txt
new file mode 100644
index 0000000..dbdde0e
--- /dev/null
+++ b/wiki/inc/lang/cy/login.txt
@@ -0,0 +1,4 @@
+====== Mewngofnodi ======
+
+'Dych chi heb fewngofnodi! Rhowch eich manylion mewngofnodi isod. Mae angen galluogi cwcis er mwyn mewngofnodi.
+
diff --git a/wiki/inc/lang/cy/mailtext.txt b/wiki/inc/lang/cy/mailtext.txt
new file mode 100644
index 0000000..2746233
--- /dev/null
+++ b/wiki/inc/lang/cy/mailtext.txt
@@ -0,0 +1,17 @@
+Cafodd tudalen yn eich DokuWiki ei hychwanegu neu newid. Dyma'r manylion:
+
+Dyddiad         : @DATE@
+Porwr           : @BROWSER@
+Cyfeiriad-IP    : @IPADDRESS@
+Gwesteiwr       : @HOSTNAME@
+Hen Adolygiad   : @OLDPAGE@
+Adolygiad Newydd: @NEWPAGE@
+Crynodeb Golygu : @SUMMARY@
+Defnyddiwr      : @USER@
+
+@DIFF@
+
+
+-- 
+Cafodd y neges hon ei generadyu gan DokuWiki ar
+@DOKUWIKIURL@
diff --git a/wiki/inc/lang/cy/mailwrap.html b/wiki/inc/lang/cy/mailwrap.html
new file mode 100644
index 0000000..254fcca
--- /dev/null
+++ b/wiki/inc/lang/cy/mailwrap.html
@@ -0,0 +1,13 @@
+<html>
+<head>
+    <title>@TITLE@</title>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+</head>
+<body>
+
+@HTMLBODY@
+
+<br /><hr />
+<small>Cafodd y neges hon ei generadu gan DokuWiki ar @DOKUWIKIURL@.</small>
+</body>
+</html>
diff --git a/wiki/inc/lang/cy/newpage.txt b/wiki/inc/lang/cy/newpage.txt
new file mode 100644
index 0000000..dfe8a79
--- /dev/null
+++ b/wiki/inc/lang/cy/newpage.txt
@@ -0,0 +1,4 @@
+====== 'Dyw'r testun hwn ddim yn bodoli eto ======
+
+Rydych chi wedi dilyn dolen i destun sy ddim yn bodoli eto. Os oes hawliau 'da chi, gallwch chi ei greu gan bwyso ar "Creu y dudalen hon".
+
diff --git a/wiki/inc/lang/cy/norev.txt b/wiki/inc/lang/cy/norev.txt
new file mode 100644
index 0000000..7d978c5
--- /dev/null
+++ b/wiki/inc/lang/cy/norev.txt
@@ -0,0 +1,4 @@
+====== Adolygiad ddim y bodoli ======
+
+'Dyw'r adolygiad hwn ddim yn bodoli. Pwyswch ar "Hen adolygiadau" am restr o hen adolygiadau'r ddogfen hon.
+
diff --git a/wiki/inc/lang/cy/password.txt b/wiki/inc/lang/cy/password.txt
new file mode 100644
index 0000000..da0678e
--- /dev/null
+++ b/wiki/inc/lang/cy/password.txt
@@ -0,0 +1,10 @@
+Shw mae @FULLNAME@!
+
+Dyma'ch manylion ar gyfer @TITLE@ ar @DOKUWIKIURL@
+
+Defnyddair  : @LOGIN@
+Cyfrinair   : @PASSWORD@
+
+-- 
+Cafodd y neges hon ei generadu gan DokuWiki ar
+@DOKUWIKIURL@
diff --git a/wiki/inc/lang/cy/preview.txt b/wiki/inc/lang/cy/preview.txt
new file mode 100644
index 0000000..477879d
--- /dev/null
+++ b/wiki/inc/lang/cy/preview.txt
@@ -0,0 +1,4 @@
+====== Rhagolwg ======
+
+Dyma ragolwg o sut fydd eich testun yn edrych. Cofiwch: 'Dyw e **heb ei gadw** 'to!
+
diff --git a/wiki/inc/lang/cy/pwconfirm.txt b/wiki/inc/lang/cy/pwconfirm.txt
new file mode 100644
index 0000000..529571e
--- /dev/null
+++ b/wiki/inc/lang/cy/pwconfirm.txt
@@ -0,0 +1,15 @@
+Shw mae @FULLNAME@!
+
+Mae rhywun wedi gofyn am gyfrinair newydd ar gyfer eich manylion
+@TITLE@ ar @DOKUWIKIURL@
+
+Os na wnaethoch chi ofyn am gyfrinair newydd, anwybyddwch yr e-bost hwn.
+
+I gadarnhau daeth y cais oddi wrthoch chi, pwyswch y ddolen isod.
+
+@CONFIRM@
+
+--
+Cafodd y neges hon ei generadu gan DokuWiki ar
+@DOKUWIKIURL@
+
diff --git a/wiki/inc/lang/cy/read.txt b/wiki/inc/lang/cy/read.txt
new file mode 100644
index 0000000..8703ef9
--- /dev/null
+++ b/wiki/inc/lang/cy/read.txt
@@ -0,0 +1,2 @@
+Mae'r dudalen hon i'w darllen yn unig. Gallwch chi edrych ar y ffynhonnell, ond nid ei newid hi. Cysylltwch â'ch gweinyddwr chi os ydych chi'n meddwl bod hwn yn anghywir.
+
diff --git a/wiki/inc/lang/cy/recent.txt b/wiki/inc/lang/cy/recent.txt
new file mode 100644
index 0000000..2affbf9
--- /dev/null
+++ b/wiki/inc/lang/cy/recent.txt
@@ -0,0 +1,5 @@
+====== Newidiadau Diweddar ======
+
+Cafodd y tudalennau canlynol eu newid yn ddiweddar.
+
+
diff --git a/wiki/inc/lang/cy/register.txt b/wiki/inc/lang/cy/register.txt
new file mode 100644
index 0000000..6fbc850
--- /dev/null
+++ b/wiki/inc/lang/cy/register.txt
@@ -0,0 +1,4 @@
+====== Cofrestru fel defnyddiwr newydd ======
+
+Llenwch yr holl wybodaeth isod i greu cyfrif newydd ar y wici hwn. Sicrhewch eich bod chi'n cynnwys **cyfeiriad e-bost dilys** - os na chewch chi'ch annog am gyfrinair, caiff un ei anfon i'ch cyfeiriad. Dylai'r enw mewngofnodi fod yn [[doku>pagename|enw tudalen]] dilys.
+
diff --git a/wiki/inc/lang/cy/registermail.txt b/wiki/inc/lang/cy/registermail.txt
new file mode 100644
index 0000000..0cb2b4f
--- /dev/null
+++ b/wiki/inc/lang/cy/registermail.txt
@@ -0,0 +1,14 @@
+Cofrestrodd defnyddiwr newydd. Dyma'r manylion:
+
+Defnyddair   : @NEWUSER@
+Enw llawn    : @NEWNAME@
+E-bost       : @NEWEMAIL@
+
+Dyddiad      : @DATE@
+Porwr        : @BROWSER@
+Cyfeiriad-IP : @IPADDRESS@
+Gwesteiwr    : @HOSTNAME@
+
+-- 
+Cafodd y neges hon ei generadu gan DokuWiki ar
+@DOKUWIKIURL@
diff --git a/wiki/inc/lang/cy/resendpwd.txt b/wiki/inc/lang/cy/resendpwd.txt
new file mode 100644
index 0000000..ddad8a9
--- /dev/null
+++ b/wiki/inc/lang/cy/resendpwd.txt
@@ -0,0 +1,4 @@
+====== Anfon cyfrinair newydd ======
+
+Ailgyflwynwch eich defnyddair yn y ffurflen isod i wneud cais am gyfrinair newydd i'ch cyfrif ar y wici hwn. Caiff ddolen gadarnhau ei hanfon i chi drwy eich e-bost cofrestredig.
+
diff --git a/wiki/inc/lang/cy/resetpwd.txt b/wiki/inc/lang/cy/resetpwd.txt
new file mode 100644
index 0000000..57f1992
--- /dev/null
+++ b/wiki/inc/lang/cy/resetpwd.txt
@@ -0,0 +1,4 @@
+====== Gosod cyfrinair newydd ======
+
+Rhowch gyfrinair newydd i'ch cyfrif ar y wici hwn.
+
diff --git a/wiki/inc/lang/cy/revisions.txt b/wiki/inc/lang/cy/revisions.txt
new file mode 100644
index 0000000..afbc9fe
--- /dev/null
+++ b/wiki/inc/lang/cy/revisions.txt
@@ -0,0 +1,4 @@
+====== Hen Adolygiadau ======
+
+Dyma adolygiadau hŷn y ddogfen gyfredol. I droi'n ôl i hen adolygiad, dewiswch e isod a phwyso ''Golygu'r dudalen hon'' a'i gadw.
+
diff --git a/wiki/inc/lang/cy/searchpage.txt b/wiki/inc/lang/cy/searchpage.txt
new file mode 100644
index 0000000..6a645cb
--- /dev/null
+++ b/wiki/inc/lang/cy/searchpage.txt
@@ -0,0 +1,4 @@
+====== Chwilio ======
+
+Gallwch chi ddarganfod canlyniadau eich chwiliad isod. @CREATEPAGEINFO@
+
diff --git a/wiki/inc/lang/cy/showrev.txt b/wiki/inc/lang/cy/showrev.txt
new file mode 100644
index 0000000..6cc9d6c
--- /dev/null
+++ b/wiki/inc/lang/cy/showrev.txt
@@ -0,0 +1,2 @@
+**Dyma hen adolygiad y ddogfen!**
+----
diff --git a/wiki/inc/lang/cy/stopwords.txt b/wiki/inc/lang/cy/stopwords.txt
new file mode 100644
index 0000000..2ac4c31
--- /dev/null
+++ b/wiki/inc/lang/cy/stopwords.txt
@@ -0,0 +1,31 @@
+# This is a list of words the indexer ignores, one word per line
+# When you edit this file be sure to use UNIX line endings (single newline)
+# No need to include words shorter than 3 chars - these are ignored anyway
+# This list is based upon the ones found at http://www.ranks.nl/stopwords/
+allan
+beth
+ble
+bydd
+chi
+dyma
+dyna
+eich
+gyda
+hefyd
+hon
+honna
+hwn
+hwnnw
+hwy
+hyn
+hynny
+mewn
+nhw
+oddi
+oedd
+pan
+pwy
+roedd
+sut
+wrth
+www
\ No newline at end of file
diff --git a/wiki/inc/lang/cy/subscr_digest.txt b/wiki/inc/lang/cy/subscr_digest.txt
new file mode 100644
index 0000000..611e057
--- /dev/null
+++ b/wiki/inc/lang/cy/subscr_digest.txt
@@ -0,0 +1,20 @@
+Shw mae!
+
+Gwnaeth y dudalen @PAGE@ mewn wici @TITLE@ newid.
+Dyma'r newidiadau:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Hen Adolygiad: @OLDPAGE@
+Adolygiad Newydd: @NEWPAGE@
+
+I ganslo hysbysiadau tudalen, mewngofnodwch i'r wici ar
+@DOKUWIKIURL@ ac yna ewch i
+@SUBSCRIBE@
+a thanysgrifio o newidiadau tudalen a/neu namespace.
+
+-- 
+Cafodd y neges hon ei generadu gan DokuWiki ar
+@DOKUWIKIURL@
diff --git a/wiki/inc/lang/cy/subscr_form.txt b/wiki/inc/lang/cy/subscr_form.txt
new file mode 100644
index 0000000..47d1a17
--- /dev/null
+++ b/wiki/inc/lang/cy/subscr_form.txt
@@ -0,0 +1,3 @@
+====== Rheoli Tanysgrifiad ======
+
+Mae'r dudalen hon yn eich galluogi i reoli'ch tanysgrifiadau ar gyfer y dudalen gyfredol a'r namespace.
diff --git a/wiki/inc/lang/cy/subscr_list.txt b/wiki/inc/lang/cy/subscr_list.txt
new file mode 100644
index 0000000..592f290
--- /dev/null
+++ b/wiki/inc/lang/cy/subscr_list.txt
@@ -0,0 +1,17 @@
+Shw mae!
+
+Gwnaeth tudalennau yn y namespace @PAGE@ o'r wici @TITLE@ newid.
+Dyma'r tudaalennau sydd wedi newid:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+I ganslo hysbysiadau'r dudalen, mewngofnodwch i'r wici ar
+@DOKUWIKIURL@ yna ewch i
+@SUBSCRIBE@
+a thanysgrifio o newidiadau tudalen a/neu namespace.
+
+-- 
+Cafodd y neges hon ei generadu gan DokuWiki ar
+@DOKUWIKIURL@
diff --git a/wiki/inc/lang/cy/subscr_single.txt b/wiki/inc/lang/cy/subscr_single.txt
new file mode 100644
index 0000000..2a774eb
--- /dev/null
+++ b/wiki/inc/lang/cy/subscr_single.txt
@@ -0,0 +1,23 @@
+Shw mae!
+
+Gwnaeth y dudalen @PAGE@ yn y wici @TITLE@ newid.
+Dyma'r newidiadau:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Dyddiad          : @DATE@
+Defnyddiwr       : @USER@
+Crynodeb Golygu  : @SUMMARY@
+Hen Adolygiad    : @OLDPAGE@
+Adolygiad Newwydd: @NEWPAGE@
+
+I ganslo hysbysiadau'r dudalen, mewngofnodwch i'r wici ar
+@DOKUWIKIURL@ yna ewch i
+@SUBSCRIBE@
+a thanysgrifio o newidiadau tudalen a namespace.
+
+-- 
+Cafodd y neges hon ei generadu gan DokuWiki ar
+@DOKUWIKIURL@
diff --git a/wiki/inc/lang/cy/updateprofile.txt b/wiki/inc/lang/cy/updateprofile.txt
new file mode 100644
index 0000000..ce9ca50
--- /dev/null
+++ b/wiki/inc/lang/cy/updateprofile.txt
@@ -0,0 +1,5 @@
+====== Diweddaru proffil eich cyfrif ======
+
+Newidiwch y meysydd rydych chi amm newid yn unig.  'Sdim modd i chi newid eich defnyddair.
+
+
diff --git a/wiki/inc/lang/cy/uploadmail.txt b/wiki/inc/lang/cy/uploadmail.txt
new file mode 100644
index 0000000..8102232
--- /dev/null
+++ b/wiki/inc/lang/cy/uploadmail.txt
@@ -0,0 +1,15 @@
+Cafodd ffeil ei lanlwytho i'ch DokuWiki. Dyma'r manylion:
+
+Ffeil         : @MEDIA@
+Hen adolygiad : @OLD@
+Dyddiad       : @DATE@
+Porwr         : @BROWSER@
+Cyfeiriad-IP  : @IPADDRESS@
+Gwesteiwr     : @HOSTNAME@
+Maint         : @SIZE@
+Teip MIME     : @MIME@
+Defnyddiwr    : @USER@
+
+-- 
+Cafodd y neges hon ei generadu gan DokuWiki ar
+@DOKUWIKIURL@
diff --git a/wiki/inc/lang/da/admin.txt b/wiki/inc/lang/da/admin.txt
new file mode 100644
index 0000000..3ac4a70
--- /dev/null
+++ b/wiki/inc/lang/da/admin.txt
@@ -0,0 +1,4 @@
+====== Administration ======
+
+Nedenfor kan du finde en række administrative værktøjer.
+
diff --git a/wiki/inc/lang/da/adminplugins.txt b/wiki/inc/lang/da/adminplugins.txt
new file mode 100644
index 0000000..2a3d687
--- /dev/null
+++ b/wiki/inc/lang/da/adminplugins.txt
@@ -0,0 +1 @@
+===== Yderligere udvidelser =====
\ No newline at end of file
diff --git a/wiki/inc/lang/da/backlinks.txt b/wiki/inc/lang/da/backlinks.txt
new file mode 100644
index 0000000..6dfa3cc
--- /dev/null
+++ b/wiki/inc/lang/da/backlinks.txt
@@ -0,0 +1,4 @@
+====== Henvisninger bagud ======
+
+Dette er en liste over alle de dokumenter der henviser tilbage til det nuværende dokument.
+
diff --git a/wiki/inc/lang/da/conflict.txt b/wiki/inc/lang/da/conflict.txt
new file mode 100644
index 0000000..fc38cee
--- /dev/null
+++ b/wiki/inc/lang/da/conflict.txt
@@ -0,0 +1,5 @@
+====== Der eksisterer en nyere udgave af dokumentet ======
+
+Der eksisterer en nyere udgave af dette dokument. Det sker når flere brugere ændrer i dokumentet på samme tid.
+
+Gennemgå de viste forskelle grundigt, og beslut hvilken udgave der skal bevares. Hvis du vælger ''Gem'', bliver din udgave af dokumentet gemt. Vælger du ''Fortryd'' beholder du den nuværende udgave.
diff --git a/wiki/inc/lang/da/denied.txt b/wiki/inc/lang/da/denied.txt
new file mode 100644
index 0000000..217d893
--- /dev/null
+++ b/wiki/inc/lang/da/denied.txt
@@ -0,0 +1,3 @@
+====== Adgang nægtet ======
+
+Du har ikke rettigheder til at fortsætte.
diff --git a/wiki/inc/lang/da/diff.txt b/wiki/inc/lang/da/diff.txt
new file mode 100644
index 0000000..f77224f
--- /dev/null
+++ b/wiki/inc/lang/da/diff.txt
@@ -0,0 +1,4 @@
+====== Forskelle ======
+
+Dette viser forskellene mellem den valgte og den nuværende udgave af dokumentet. Gul er linjer der findes i den gamle udgave, og grøn er linjer der findes i den nuværende.
+
diff --git a/wiki/inc/lang/da/draft.txt b/wiki/inc/lang/da/draft.txt
new file mode 100644
index 0000000..69c7801
--- /dev/null
+++ b/wiki/inc/lang/da/draft.txt
@@ -0,0 +1,6 @@
+====== Kladdefil fundet ======
+
+Din sidste redigeringssession på denne side blev ikke afsluttet korrekt. DokuWiki har automatisk gemt en kladde mens du arbejdede, som du kan benytte til at fortsætte redigeringen. Forneden kan du se de data der blev gemt fra din sidste session.
+
+Vælg venligst, om du vil //gendanne// din tabte redigering, //slette// den gemte kladde eller //afbryde// redigeringen.
+
diff --git a/wiki/inc/lang/da/edit.txt b/wiki/inc/lang/da/edit.txt
new file mode 100644
index 0000000..0a9ea39
--- /dev/null
+++ b/wiki/inc/lang/da/edit.txt
@@ -0,0 +1,2 @@
+Rediger dette dokument og tryk på knappen **''[Gem]''**. Se [[wiki:syntax|Formaterings tips]] for Wiki syntaks. Ret venligst kun dette dokument hvis du kan **forbedre** det. Brug venligst [[playground:playground|sandkassen]] til at teste før du retter i et rigtigt dokument. Husk også at bruge **''[Forhåndsvisning]''** før du gemmer dokumentet.
+
diff --git a/wiki/inc/lang/da/editrev.txt b/wiki/inc/lang/da/editrev.txt
new file mode 100644
index 0000000..438363e
--- /dev/null
+++ b/wiki/inc/lang/da/editrev.txt
@@ -0,0 +1,2 @@
+**Du har hentet en gammel udgave af dette dokument!** Hvis du gemmer dokumentet vil du overskrive den nuværende med den gamle udgave.
+----
diff --git a/wiki/inc/lang/da/index.txt b/wiki/inc/lang/da/index.txt
new file mode 100644
index 0000000..74afb98
--- /dev/null
+++ b/wiki/inc/lang/da/index.txt
@@ -0,0 +1,3 @@
+====== Indeks ======
+
+Dette er en oversigt over alle tilgængelige dokumenter, sorteret efter [[doku>namespaces|navnerum]].
diff --git a/wiki/inc/lang/da/install.html b/wiki/inc/lang/da/install.html
new file mode 100644
index 0000000..3cc13f8
--- /dev/null
+++ b/wiki/inc/lang/da/install.html
@@ -0,0 +1,24 @@
+<p>Denne side hjælper til første-gangs installation og konfiguration af
+<a href="http://dokuwiki.org">Dokuwiki</a>. Mere information om denne
+installer er tilgængelig på dens egen
+<a href="http://dokuwiki.org/installer">dokumentations side</a>.</p>
+
+<p>DokuWiki bruger almindelige filer til at gemme wiki sider og anden
+information relaterende til disse sider (f.eks. billeder, søge indeks, gamle
+udgaver, osv).  For at fungerer optimalt <strong>skal</strong> DokuWiki have
+skrive adgang til mapperne der holder disse filer. Denne installer er ikke
+istand til at opsætte mappe tilladelser. Det skal normalt udføres direkte i en
+kommando shell eller hvis du bruger hosting, gennem FTP eller dit hostings
+kontrol panel (f.eks. cPanel).</p>
+
+<p>Denne installer vil opsætte din DokuWiki konfiguration for
+<abbr title="access control list">ACL</abbr>, hvilket tillader
+administrator login og adgang til DokuWiki's adminstrative menu til
+installation af udvidelser, håndtering af brugere, håndtering af adgang til wiki
+sider og ændring af konfigurations indstillinger. Det er ikke et krav for at
+DokuWiki kan fungere, men det vil gøre DokuWiki lettere at administre.</p>
+
+<p>Erfarne brugere og brugere med specielle opsætningskrav burde bruge disse
+henvisninger for detaljer vedrørende
+<a href="http://dokuwiki.org/install">installations instruktioner</a>
+og <a href="http://dokuwiki.org/config">konfigurations indstillinger</a>.</p>
diff --git a/wiki/inc/lang/da/jquery.ui.datepicker.js b/wiki/inc/lang/da/jquery.ui.datepicker.js
new file mode 100644
index 0000000..273f0e3
--- /dev/null
+++ b/wiki/inc/lang/da/jquery.ui.datepicker.js
@@ -0,0 +1,37 @@
+/* Danish initialisation for the jQuery UI date picker plugin. */
+/* Written by Jan Christensen ( deletestuff@gmail.com). */
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "../widgets/datepicker" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery.datepicker );
+	}
+}( function( datepicker ) {
+
+datepicker.regional.da = {
+	closeText: "Luk",
+	prevText: "&#x3C;Forrige",
+	nextText: "Næste&#x3E;",
+	currentText: "Idag",
+	monthNames: [ "Januar","Februar","Marts","April","Maj","Juni",
+	"Juli","August","September","Oktober","November","December" ],
+	monthNamesShort: [ "Jan","Feb","Mar","Apr","Maj","Jun",
+	"Jul","Aug","Sep","Okt","Nov","Dec" ],
+	dayNames: [ "Søndag","Mandag","Tirsdag","Onsdag","Torsdag","Fredag","Lørdag" ],
+	dayNamesShort: [ "Søn","Man","Tir","Ons","Tor","Fre","Lør" ],
+	dayNamesMin: [ "Sø","Ma","Ti","On","To","Fr","Lø" ],
+	weekHeader: "Uge",
+	dateFormat: "dd-mm-yy",
+	firstDay: 1,
+	isRTL: false,
+	showMonthAfterYear: false,
+	yearSuffix: "" };
+datepicker.setDefaults( datepicker.regional.da );
+
+return datepicker.regional.da;
+
+} ) );
diff --git a/wiki/inc/lang/da/lang.php b/wiki/inc/lang/da/lang.php
new file mode 100644
index 0000000..c9374f2
--- /dev/null
+++ b/wiki/inc/lang/da/lang.php
@@ -0,0 +1,356 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Kenneth Schack Banner <kescba@gmail.com>
+ * @author Jon Theil Nielsen <jontheil@gmail.com>
+ * @author koeppe <koeppe@kazur.dk>
+ * @author Jon Bendtsen <bendtsen@diku.dk>
+ * @author Lars Næsbye Christensen <larsnaesbye@stud.ku.dk>
+ * @author Kalle Sommer Nielsen <kalle@php.net>
+ * @author Esben Laursen <hyber@hyber.dk>
+ * @author Harith <haj@berlingske.dk>
+ * @author Daniel Ejsing-Duun <dokuwiki@zilvador.dk>
+ * @author Erik Bjørn Pedersen <erik.pedersen@shaw.ca>
+ * @author rasmus <rasmus@kinnerup.com>
+ * @author Mikael Lyngvig <mikael@lyngvig.org>
+ * @author Soren Birk <soer9648@hotmail.com>
+ * @author Jens Hyllegaard <jens.hyllegaard@gmail.com>
+ * @author soer9648 <soer9648@eucl.dk>
+ * @author Søren Birk <sbi@eucl.dk>
+ * @author Jacob Palm <mail@jacobpalm.dk>
+ */
+$lang['encoding']              = 'utf-8';
+$lang['direction']             = 'ltr';
+$lang['doublequoteopening']    = '„';
+$lang['doublequoteclosing']    = '“';
+$lang['singlequoteopening']    = '‚';
+$lang['singlequoteclosing']    = '‘';
+$lang['apostrophe']            = '’';
+$lang['btn_edit']              = 'Rediger denne side';
+$lang['btn_source']            = 'Vis kildekode';
+$lang['btn_show']              = 'Vis side';
+$lang['btn_create']            = 'Opret denne side';
+$lang['btn_search']            = 'Søg';
+$lang['btn_save']              = 'Gem';
+$lang['btn_preview']           = 'Forhåndsvisning';
+$lang['btn_top']               = 'Tilbage til toppen';
+$lang['btn_newer']             = '<< forrige side';
+$lang['btn_older']             = 'næste side >>';
+$lang['btn_revs']              = 'Gamle udgaver';
+$lang['btn_recent']            = 'Nye ændringer';
+$lang['btn_upload']            = 'Overfør';
+$lang['btn_cancel']            = 'Fortryd';
+$lang['btn_index']             = 'Indeks';
+$lang['btn_secedit']           = 'Redigér';
+$lang['btn_login']             = 'Log ind';
+$lang['btn_logout']            = 'Log ud';
+$lang['btn_admin']             = 'Admin';
+$lang['btn_update']            = 'Opdatér';
+$lang['btn_delete']            = 'Slet';
+$lang['btn_back']              = 'Tilbage';
+$lang['btn_backlink']          = 'Henvisninger bagud';
+$lang['btn_subscribe']         = 'Abonnér på ændringer';
+$lang['btn_profile']           = 'Opdatér profil';
+$lang['btn_reset']             = 'Nulstil';
+$lang['btn_resendpwd']         = 'Vælg ny adgangskode';
+$lang['btn_draft']             = 'Redigér kladde';
+$lang['btn_recover']           = 'Gendan kladde';
+$lang['btn_draftdel']          = 'Slet kladde';
+$lang['btn_revert']            = 'Gendan';
+$lang['btn_register']          = 'Registrér';
+$lang['btn_apply']             = 'Anvend';
+$lang['btn_media']             = 'Media Manager';
+$lang['btn_deleteuser']        = 'Fjern Min Konto';
+$lang['btn_img_backto']        = 'Tilbage til %s';
+$lang['btn_mediaManager']      = 'Vis i Media Manager';
+$lang['loggedinas']            = 'Logget ind som:';
+$lang['user']                  = 'Brugernavn';
+$lang['pass']                  = 'Adgangskode';
+$lang['newpass']               = 'Ny adgangskode';
+$lang['oldpass']               = 'Bekræft gammel adgangskode';
+$lang['passchk']               = 'Gentag ny adgangskode';
+$lang['remember']              = 'Automatisk log ind';
+$lang['fullname']              = 'Fulde navn';
+$lang['email']                 = 'E-mail';
+$lang['profile']               = 'Brugerprofil';
+$lang['badlogin']              = 'Brugernavn eller adgangskode var forkert.';
+$lang['badpassconfirm']        = 'Adgangkode var desværre forkert';
+$lang['minoredit']             = 'Mindre ændringer';
+$lang['draftdate']             = 'Kladde automatisk gemt d.';
+$lang['nosecedit']             = 'Siden blev ændret i mellemtiden, sektions information var for gammel, hentede hele siden i stedet.';
+$lang['regmissing']            = 'Du skal udfylde alle felter.';
+$lang['reguexists']            = 'Dette brugernavn er allerede i brug.';
+$lang['regsuccess']            = 'Du er nu oprettet som bruger. Dit adgangskode bliver sendt til dig i en e-mail.';
+$lang['regsuccess2']           = 'Du er nu oprettet som bruger.';
+$lang['regfail']               = 'Brugeren kunne ikke oprettes.';
+$lang['regmailfail']           = 'Dit adgangskode blev ikke sendt. Kontakt venligst administratoren.';
+$lang['regbadmail']            = 'E-mail-adressen er ugyldig. Kontakt venligst administratoren, hvis du mener dette er en fejl.';
+$lang['regbadpass']            = 'De to adgangskoder er ikke ens, vær venlig at prøve igen.';
+$lang['regpwmail']             = 'Dit adgangskode til DokuWiki';
+$lang['reghere']               = 'Opret en DokuWiki-konto her';
+$lang['profna']                = 'Denne wiki understøtter ikke ændring af profiler';
+$lang['profnochange']          = 'Ingen ændringer, intet modificeret.';
+$lang['profnoempty']           = 'Tomt navn eller e-mail adresse er ikke tilladt.';
+$lang['profchanged']           = 'Brugerprofil opdateret korrekt.';
+$lang['profnodelete']          = 'Denne wiki understøtter ikke sletning af brugere';
+$lang['profdeleteuser']        = 'Slet konto';
+$lang['profdeleted']           = 'Din brugerkonto er blevet slettet fra denne wiki';
+$lang['profconfdelete']        = 'Jeg ønsker at slette min konto fra denne wiki. <br/> Denne handling kan ikke fortrydes.';
+$lang['proffail']              = 'Brugerprofilen blev ikke opdateret.';
+$lang['pwdforget']             = 'Har du glemt dit adgangskode? Få en ny';
+$lang['resendna']              = 'Denne wiki understøtter ikke udsendelse af ny adgangskode.';
+$lang['resendpwd']             = 'Vælg en ny adgangskode for';
+$lang['resendpwdmissing']      = 'Du skal udfylde alle felter.';
+$lang['resendpwdnouser']       = 'Vi kan ikke finde denne bruger i vores database.';
+$lang['resendpwdbadauth']      = 'Beklager, denne autoriseringskode er ikke gyldig. Kontroller venligst at du benyttede det fulde link til bekræftelse.';
+$lang['resendpwdconfirm']      = 'En e-mail med et link til bekræftelse er blevet sendt.';
+$lang['resendpwdsuccess']      = 'Din nye adgangskode er blevet sendt med e-mail.';
+$lang['license']               = 'Med mindre andet angivet, vil indhold på denne wiki blive udgivet under følgende licens:';
+$lang['licenseok']             = 'Bemærk - ved at redigere denne side, accepterer du at dit indhold bliver frigivet under følgende licens:';
+$lang['searchmedia']           = 'Søg filnavn';
+$lang['searchmedia_in']        = 'Søg i %s';
+$lang['txt_upload']            = 'Vælg den fil der skal overføres:';
+$lang['txt_filename']          = 'Indtast wikinavn (valgfrit):';
+$lang['txt_overwrt']           = 'Overskriv eksisterende fil';
+$lang['maxuploadsize']         = 'Upload max. %s pr. fil.';
+$lang['lockedby']              = 'Midlertidig låst af:';
+$lang['lockexpire']            = 'Lås udløber kl:.';
+$lang['js']['willexpire']      = 'Din lås på dette dokument udløber om et minut.\nTryk på Forhåndsvisning-knappen for at undgå konflikter.';
+$lang['js']['notsavedyet']     = 'Ugemte ændringer vil blive mistet.
+Fortsæt alligevel?';
+$lang['js']['searchmedia']     = 'Søg efter filer';
+$lang['js']['keepopen']        = 'Hold vindue åbent ved valg';
+$lang['js']['hidedetails']     = 'Skjul detaljer';
+$lang['js']['mediatitle']      = 'Link indstillinger';
+$lang['js']['mediadisplay']    = 'Link type';
+$lang['js']['mediaalign']      = 'Justering';
+$lang['js']['mediasize']       = 'Billede størrelse';
+$lang['js']['mediatarget']     = 'Link destination';
+$lang['js']['mediaclose']      = 'Luk';
+$lang['js']['mediainsert']     = 'Indsæt';
+$lang['js']['mediadisplayimg'] = 'Vis billedet';
+$lang['js']['mediadisplaylnk'] = 'Vis kun linket';
+$lang['js']['mediasmall']      = 'Lille version';
+$lang['js']['mediamedium']     = 'Mellem version';
+$lang['js']['medialarge']      = 'Stor version';
+$lang['js']['mediaoriginal']   = 'Original version';
+$lang['js']['medialnk']        = 'Link til detajle side';
+$lang['js']['mediadirect']     = 'Direkte link til originalen';
+$lang['js']['medianolnk']      = 'Intet link';
+$lang['js']['medianolink']     = 'Link ikke til billedet';
+$lang['js']['medialeft']       = 'Juster billedet til venstre';
+$lang['js']['mediaright']      = 'Juster billedet til højre';
+$lang['js']['mediacenter']     = 'Centreret';
+$lang['js']['medianoalign']    = 'Brug ingen justering';
+$lang['js']['nosmblinks']      = 'Henvisninger til Windows shares virker kun i Microsoft Internet Explorer.
+Du kan stadig kopiere og indsætte linket.';
+$lang['js']['linkwiz']         = 'Guiden til henvisninger';
+$lang['js']['linkto']          = 'Henvis til:';
+$lang['js']['del_confirm']     = 'Slet valgte post(er)?';
+$lang['js']['restore_confirm'] = 'Er du sikker på at du vil genskabe denne version?';
+$lang['js']['media_diff']      = 'Vis forskelle:';
+$lang['js']['media_diff_both'] = 'Side ved Side';
+$lang['js']['media_diff_opacity'] = 'Skin igennem';
+$lang['js']['media_diff_portions'] = 'Skub';
+$lang['js']['media_select']    = 'Vælg filer...';
+$lang['js']['media_upload_btn'] = 'Overfør';
+$lang['js']['media_done_btn']  = 'Færdig';
+$lang['js']['media_drop']      = 'Træk filer hertil for at overføre';
+$lang['js']['media_cancel']    = 'fjern';
+$lang['js']['media_overwrt']   = 'Overskriv eksisterende filer';
+$lang['rssfailed']             = 'Der opstod en fejl ved hentning af dette feed: ';
+$lang['nothingfound']          = 'Søgningen gav intet resultat.';
+$lang['mediaselect']           = 'Vælg mediefil';
+$lang['uploadsucc']            = 'Overførels blev fuldført';
+$lang['uploadfail']            = 'Overførslen fejlede. Der er muligvis problemer med rettighederne.';
+$lang['uploadwrong']           = 'Overførslen blev afvist. Filtypen er ikke tilladt.';
+$lang['uploadexist']           = 'Filen eksisterer allerede.';
+$lang['uploadbadcontent']      = 'Det overført indhold svarer ikke til %s fil-endelsen.';
+$lang['uploadspam']            = 'Overførelsen blev blokeret af spam sortlisten.';
+$lang['uploadxss']             = 'Overførelsen blev blokeret på grund af mulig skadeligt indhold.';
+$lang['uploadsize']            = 'Den overførte fil var for stor (maksimal størrelse %s)';
+$lang['deletesucc']            = 'Filen "%s" er blevet slettet.';
+$lang['deletefail']            = '"%s" kunne ikke slettes - kontroller rettighederne.';
+$lang['mediainuse']            = 'Filen "%s" kan ikke slettes - den er stadig i brug.';
+$lang['namespaces']            = 'Navnerum';
+$lang['mediafiles']            = 'Tilgængelige filer i';
+$lang['accessdenied']          = 'Du har ikke tilladelse til at se denne side.';
+$lang['mediausage']            = 'Brug den følgende syntaks til at henvise til denne fil:';
+$lang['mediaview']             = 'Vis oprindelig fil';
+$lang['mediaroot']             = 'rod';
+$lang['mediaupload']           = 'Overføre en fil til det nuværende navnerum her. For at oprette under-navnerum, tilføj dem til "Overføre som" filnavnet, adskilt af kolontegn.';
+$lang['mediaextchange']        = 'Filtype ændret fra .%s til .%s!';
+$lang['reference']             = 'Henvisning til';
+$lang['ref_inuse']             = 'Filen kan ikke slettes, da den stadig er i brug på følgende sider:';
+$lang['ref_hidden']            = 'Nogle henvisninger er på sider du ikke har læserettigheder til';
+$lang['hits']                  = 'Besøg';
+$lang['quickhits']             = 'Tilsvarende sidenavne';
+$lang['toc']                   = 'Indholdsfortegnelse';
+$lang['current']               = 'nuværende';
+$lang['yours']                 = 'Din version';
+$lang['diff']                  = 'Vis forskelle i forhold til den nuværende udgave';
+$lang['diff2']                 = 'Vis forskelle i forhold til de valgte revisioner';
+$lang['difflink']              = 'Link til denne sammenlinings vising';
+$lang['diff_type']             = 'Vis forskelle:';
+$lang['diff_inline']           = 'Indeni';
+$lang['diff_side']             = 'Side ved side';
+$lang['diffprevrev']           = 'Forrige revision';
+$lang['diffnextrev']           = 'Næste revision';
+$lang['difflastrev']           = 'Sidste revision';
+$lang['diffbothprevrev']       = 'Begge sider forrige revision';
+$lang['diffbothnextrev']       = 'Begge sider næste revision';
+$lang['line']                  = 'Linje';
+$lang['breadcrumb']            = 'Sti:';
+$lang['youarehere']            = 'Du er her:';
+$lang['lastmod']               = 'Sidst ændret:';
+$lang['by']                    = 'af';
+$lang['deleted']               = 'slettet';
+$lang['created']               = 'oprettet';
+$lang['restored']              = 'gammel udgave gendannet (%s)';
+$lang['external_edit']         = 'ekstern redigering';
+$lang['summary']               = 'Resumé af ændrigner';
+$lang['noflash']               = 'Du skal installere <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Player</a> for at kunne se dette indhold.';
+$lang['download']              = 'Hent kodestykke';
+$lang['tools']                 = 'Værktøjer';
+$lang['user_tools']            = 'Brugerværktøjer';
+$lang['site_tools']            = 'Webstedsværktøjer';
+$lang['page_tools']            = 'Sideværktøjer';
+$lang['skip_to_content']       = 'hop til indhold';
+$lang['sidebar']               = 'Sidebjælke';
+$lang['mail_newpage']          = 'side tilføjet:';
+$lang['mail_changed']          = 'side ændret:';
+$lang['mail_subscribe_list']   = 'sider ændret i navnerum:';
+$lang['mail_new_user']         = 'Ny bruger';
+$lang['mail_upload']           = 'fil overført:';
+$lang['changes_type']          = 'Vis ændringer af';
+$lang['pages_changes']         = 'Sider';
+$lang['media_changes']         = 'Mediefiler';
+$lang['both_changes']          = 'Både sider og medie filer';
+$lang['qb_bold']               = 'Fed';
+$lang['qb_italic']             = 'Kursiv';
+$lang['qb_underl']             = 'Understregning';
+$lang['qb_code']               = 'Skrivemaskine tekst';
+$lang['qb_strike']             = 'Gennemstregning';
+$lang['qb_h1']                 = 'Niveau 1 overskrift';
+$lang['qb_h2']                 = 'Niveau 2 overskrift';
+$lang['qb_h3']                 = 'Niveau 3 overskrift';
+$lang['qb_h4']                 = 'Niveau 4 overskrift';
+$lang['qb_h5']                 = 'Niveau 5 overskrift';
+$lang['qb_h']                  = 'Overskrift';
+$lang['qb_hs']                 = 'Vælg overskrift';
+$lang['qb_hplus']              = 'Højere overskriftsniveau';
+$lang['qb_hminus']             = 'Lavere overskriftsniveau';
+$lang['qb_hequal']             = 'Samme overskriftsniveau';
+$lang['qb_link']               = 'Intern henvisning';
+$lang['qb_extlink']            = 'Ekstern henvisning';
+$lang['qb_hr']                 = 'Vandret linje';
+$lang['qb_ol']                 = 'Nummereret liste';
+$lang['qb_ul']                 = 'Punktopstilling';
+$lang['qb_media']              = 'Tilføj billeder og andre filer';
+$lang['qb_sig']                = 'Indsæt signatur';
+$lang['qb_smileys']            = 'Smileys';
+$lang['qb_chars']              = 'Specialtegn';
+$lang['upperns']               = 'Gå til overordnet navnerum';
+$lang['metaedit']              = 'Rediger metadata';
+$lang['metasaveerr']           = 'Fejl under skrivning af metadata';
+$lang['metasaveok']            = 'Metadata gemt';
+$lang['img_title']             = 'Titel:';
+$lang['img_caption']           = 'Billedtekst:';
+$lang['img_date']              = 'Dato:';
+$lang['img_fname']             = 'Filnavn:';
+$lang['img_fsize']             = 'Størrelse:';
+$lang['img_artist']            = 'Fotograf:';
+$lang['img_copyr']             = 'Ophavsret:';
+$lang['img_format']            = 'Format:';
+$lang['img_camera']            = 'Kamera:';
+$lang['img_keywords']          = 'Emneord:';
+$lang['img_width']             = 'Bredde:';
+$lang['img_height']            = 'Højde:';
+$lang['subscr_subscribe_success'] = 'Tilføjede %s til abonnement listen for %s';
+$lang['subscr_subscribe_error'] = 'Fejl ved tilføjelse af %s til abonnement listen for %s';
+$lang['subscr_subscribe_noaddress'] = 'Der er ikke nogen addresse forbundet til din bruger, så du kan ikke blive tilføjet til abonnement listen';
+$lang['subscr_unsubscribe_success'] = 'Fjernede %s fra abonnement listen for %s';
+$lang['subscr_unsubscribe_error'] = 'Fejl ved fjernelse af %s fra abonnement listen for %s';
+$lang['subscr_already_subscribed'] = '%s har allerede et abonnement for listen %s';
+$lang['subscr_not_subscribed'] = '%s har ikke et abonnement for listen %s';
+$lang['subscr_m_not_subscribed'] = 'Du har ikke et abonnement til denne side eller navnerum';
+$lang['subscr_m_new_header']   = 'Tilføj abonnement';
+$lang['subscr_m_current_header'] = 'Nuværende abonnementer';
+$lang['subscr_m_unsubscribe']  = 'Fjern abonnement';
+$lang['subscr_m_subscribe']    = 'Abonér';
+$lang['subscr_m_receive']      = 'Modtag';
+$lang['subscr_style_every']    = 'email på hver ændring';
+$lang['subscr_style_digest']   = 'opsummeringsmail med ændringer for hver side (hver %.2f dage)';
+$lang['subscr_style_list']     = 'list af ændrede sider siden sidste email (hver %.2f dage)';
+$lang['authtempfail']          = 'Brugervalidering er midlertidigt ude af drift. Hvis dette er vedvarende, kontakt venligst wikiens administrator.';
+$lang['i_chooselang']          = 'Vælg dit sprog';
+$lang['i_installer']           = 'DokuWiki Installer';
+$lang['i_wikiname']            = 'Wiki Navn';
+$lang['i_enableacl']           = 'Brug ACL (foreslået)';
+$lang['i_superuser']           = 'Superbruger';
+$lang['i_problems']            = 'Installeren fandt nogle problemer, vist nedenunder. Du kan ikke fortsætte før du har rettet dem.';
+$lang['i_modified']            = 'Af sikkerheds hensyn vil dette script kun virke på en ny og umodificeret Dokuwiki installation.
+Du burde enten gen-udpakke filerne fra den hentede pakke eller tjekke den fuldstændige
+<a href="http://dokuwiki.org/install">DokuWiki installations instruktioner</a>';
+$lang['i_funcna']              = 'PHP funtionen <code>%s</code> er ikke tilgængelig. Måske har din udbyder slået det fra af en eller anden grund?';
+$lang['i_phpver']              = 'Din PHP version <code>%s</code> er mindre en den nødvendige <code>%s</code>. Du er nød til at opgradere din PHP installation.';
+$lang['i_mbfuncoverload']      = 'mbstring.func_overload skal være deaktiveret i php.ini for at køre DokuWiki.';
+$lang['i_permfail']            = 'DokuWiki kan ikke skrive til <code>%s</code>. Du er nød til at rette tilladelses indstillingerne for denne mappe!';
+$lang['i_confexists']          = '<code>%s</code> eksisterer allerede';
+$lang['i_writeerr']            = 'Kunne ikke oprette <code>%s</code>. Du bliver nød til at tjekke mappe/fil- tilladelserne og oprette filen manuelt.';
+$lang['i_badhash']             = 'uigenkendelig eller modificeret dokuwiki.php (hash=<code>%s</code>)';
+$lang['i_badval']              = '<code>%s</code> - ulovlig eller tom værdi';
+$lang['i_success']             = 'Konfigurationen fulførtedes med success.  Du kan nu slette install.php filen. Fortsætte til <a href="doku.php?id=wiki:welcome">din nye DokuWiki</a>.';
+$lang['i_failure']             = 'Nogle fejl forekom mens konfigurations filerne skulle skrives. Du er mulighvis nød til at fixe dem manuelt før du kan bruge <a href="doku.php?id=wiki:welcome">din nye DokuWiki</a>.';
+$lang['i_policy']              = 'Begyndende ACL politik';
+$lang['i_pol0']                = 'Åben Wiki (alle kan læse, skrive og uploade)';
+$lang['i_pol1']                = 'Offentlig Wiki (alle kan læse, kun registrerede brugere kan skrive og overføre)';
+$lang['i_pol2']                = 'Lukket Wiki (kun for registerede brugere kan læse, skrive og overføre)';
+$lang['i_allowreg']            = 'Tillad at brugere kan registrere sig selv';
+$lang['i_retry']               = 'Forsøg igen';
+$lang['i_license']             = 'Vælg venligst licensen du vil tilføje dit indhold under:';
+$lang['i_license_none']        = 'Vis ikke licensinformationer';
+$lang['i_pop_field']           = 'Hjælp os venligst med at forbedre oplevelsen af DokuWiki:';
+$lang['i_pop_label']           = 'Send anonymt brugsdata til DokuWikis udviklere, én gang om måneden';
+$lang['recent_global']         = 'Du ser lige nu ændringerne i <b>%s</b> navnerummet. Du kan også <a href="%s">se de sidste ændringer for hele wiki siden </a>';
+$lang['years']                 = '%d år siden';
+$lang['months']                = '%d måned siden';
+$lang['weeks']                 = '%d uge siden';
+$lang['days']                  = '%d dage siden';
+$lang['hours']                 = '%d timer siden';
+$lang['minutes']               = '%d minutter siden';
+$lang['seconds']               = '%d sekunder siden';
+$lang['wordblock']             = 'Din ændring blev ikke gemt da den indeholder blokeret tekst (spam).';
+$lang['media_uploadtab']       = 'Upload';
+$lang['media_searchtab']       = 'Søg';
+$lang['media_file']            = 'Fil';
+$lang['media_viewtab']         = 'Vis';
+$lang['media_edittab']         = 'Rediger';
+$lang['media_historytab']      = 'Historie';
+$lang['media_list_thumbs']     = 'Thumbnails';
+$lang['media_list_rows']       = 'Rækker';
+$lang['media_sort_name']       = 'Navn';
+$lang['media_sort_date']       = 'Dato';
+$lang['media_namespaces']      = 'Vælg navneområde';
+$lang['media_files']           = 'Filer i %s';
+$lang['media_upload']          = 'Upload til %s';
+$lang['media_search']          = 'Søg i %s';
+$lang['media_view']            = '%s';
+$lang['media_viewold']         = '%s ved %s';
+$lang['media_edit']            = 'Rediger %s';
+$lang['media_history']         = 'Historie for %s';
+$lang['media_meta_edited']     = 'metadata redigered';
+$lang['media_perm_read']       = 'Du har ikke nok rettigheder til at læse filer.';
+$lang['media_perm_upload']     = 'Du har ikke nok rettigheder til at uploade filer.';
+$lang['media_update']          = 'Upload ny version';
+$lang['media_restore']         = 'Genskab denne version';
+$lang['media_acl_warning']     = 'Listen er måske ikke komplet pga. ACL restriktioner og skjulte sider.';
+$lang['currentns']             = 'Nuværende navnerum';
+$lang['searchresult']          = 'Søgsresultat';
+$lang['plainhtml']             = 'Ren HTML';
+$lang['wikimarkup']            = 'Wiki Opmærkning';
+$lang['page_nonexist_rev']     = 'Siden blev ikke fundet ved %s. Den blev efterfølgende oprettet ved <a href="%s">%s</a>.';
+$lang['email_signature_text']  = 'Denne e-mail blev genereret af DokuWiki på
+@DOKUWIKIURL@';
diff --git a/wiki/inc/lang/da/locked.txt b/wiki/inc/lang/da/locked.txt
new file mode 100644
index 0000000..74b677d
--- /dev/null
+++ b/wiki/inc/lang/da/locked.txt
@@ -0,0 +1,3 @@
+====== Låst Dokument ======
+
+Dette dokument er midlertidigt låst af en anden bruger. Vent venligst til brugeren er færdig med at redigere dokumentet, eller låsen udløber.
diff --git a/wiki/inc/lang/da/login.txt b/wiki/inc/lang/da/login.txt
new file mode 100644
index 0000000..039bb0a
--- /dev/null
+++ b/wiki/inc/lang/da/login.txt
@@ -0,0 +1,3 @@
+====== Login ======
+
+Du er ikke logget ind! Indtast brugernavn og adgangskode. Din browser skal have tilladt cookies for at du kan logge ind.
diff --git a/wiki/inc/lang/da/mailtext.txt b/wiki/inc/lang/da/mailtext.txt
new file mode 100644
index 0000000..bea9cd3
--- /dev/null
+++ b/wiki/inc/lang/da/mailtext.txt
@@ -0,0 +1,12 @@
+Et dokument i din DokuWiki blev ændret eller tilføjet. Her er detajlerne:
+
+Dato               : @DATE@
+Browser            : @BROWSER@
+IP-adresse         : @IPADDRESS@
+Hostnavn           : @HOSTNAME@
+Gammel udgave      : @OLDPAGE@
+Ny udgave          : @NEWPAGE@
+Redigerings resumé : @SUMMARY@
+Bruger             : @USER@
+
+@DIFF@
diff --git a/wiki/inc/lang/da/mailwrap.html b/wiki/inc/lang/da/mailwrap.html
new file mode 100644
index 0000000..d257190
--- /dev/null
+++ b/wiki/inc/lang/da/mailwrap.html
@@ -0,0 +1,13 @@
+<html>
+<head>
+<title>@TITLE@</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+</head>
+<body>
+
+@HTMLBODY@
+
+<br /><hr />
+<small>@EMAILSIGNATURE@</small>
+</body>
+</html>
\ No newline at end of file
diff --git a/wiki/inc/lang/da/newpage.txt b/wiki/inc/lang/da/newpage.txt
new file mode 100644
index 0000000..1d602c0
--- /dev/null
+++ b/wiki/inc/lang/da/newpage.txt
@@ -0,0 +1,3 @@
+====== Dette dokument eksisterer ikke (endnu) ======
+
+Du har fulgt en henvisning til et dokument der ikke eksisterer (endnu). Du kan oprette dokumentet ved at trykke på knappen **''[Opret dette dokument]''**.
diff --git a/wiki/inc/lang/da/norev.txt b/wiki/inc/lang/da/norev.txt
new file mode 100644
index 0000000..aa68962
--- /dev/null
+++ b/wiki/inc/lang/da/norev.txt
@@ -0,0 +1,4 @@
+====== Den valgte udgave findes ikke ======
+
+Den valgte udgave af dokumentet findes ikke! Tryk på knappen **''[Gamle udgaver]''** for at se en liste af gamle udgaver af dette dokument.
+
diff --git a/wiki/inc/lang/da/password.txt b/wiki/inc/lang/da/password.txt
new file mode 100644
index 0000000..b129bb9
--- /dev/null
+++ b/wiki/inc/lang/da/password.txt
@@ -0,0 +1,6 @@
+Hej @FULLNAME@!
+
+Her er dine brugeroplysninger @TITLE@ at @DOKUWIKIURL@
+
+Brugernavn  : @LOGIN@
+Adgangskode : @PASSWORD@
diff --git a/wiki/inc/lang/da/preview.txt b/wiki/inc/lang/da/preview.txt
new file mode 100644
index 0000000..23e65e8
--- /dev/null
+++ b/wiki/inc/lang/da/preview.txt
@@ -0,0 +1,4 @@
+====== Forhåndsvisning ======
+
+Dette er en forhåndsvisning af hvordan dokumentet vil se ud. Husk: Det er //**IKKE**// gemt endnu! Hvis det ser godt ud, så tryk på knappen **''[Gem]''**
+
diff --git a/wiki/inc/lang/da/pwconfirm.txt b/wiki/inc/lang/da/pwconfirm.txt
new file mode 100644
index 0000000..25c20a4
--- /dev/null
+++ b/wiki/inc/lang/da/pwconfirm.txt
@@ -0,0 +1,10 @@
+Hej @FULLNAME@!
+
+Nogen har bedt om et nyt password til dit @TITLE@
+login på @DOKUWIKIURL@
+
+Hvis du ikke bad om dette, så ignorer venligst denne email.
+
+For at bekræfte at det var dig der bad om dette, benyt venligst det følgende henvisning.
+
+@CONFIRM@
diff --git a/wiki/inc/lang/da/read.txt b/wiki/inc/lang/da/read.txt
new file mode 100644
index 0000000..49f6583
--- /dev/null
+++ b/wiki/inc/lang/da/read.txt
@@ -0,0 +1,2 @@
+Dette dokument kan kun læses. Du kan se kildekoden, men ikke gemme ændringer i det. Hvis du mener at dette er en fejl, så skriv det venligst på [[wiki:fejl-oversigt]].
+
diff --git a/wiki/inc/lang/da/recent.txt b/wiki/inc/lang/da/recent.txt
new file mode 100644
index 0000000..c44fa36
--- /dev/null
+++ b/wiki/inc/lang/da/recent.txt
@@ -0,0 +1,5 @@
+====== Nye ændringer ======
+
+Følgende dokumenter er blevet ændret for nylig.
+
+
diff --git a/wiki/inc/lang/da/register.txt b/wiki/inc/lang/da/register.txt
new file mode 100644
index 0000000..4ff2ed1
--- /dev/null
+++ b/wiki/inc/lang/da/register.txt
@@ -0,0 +1,4 @@
+====== Opret en wiki-konto ======
+
+Udfyld nedenstånde skema for at oprette en konto i denne wiki. Sørg for at bruge en **gyldig e-mail-adresse** - dit adgangskode bliver sendt til dig. Dit brugernavn skal være et gyldigt [[doku>pagename|dokumentnavn]].
+
diff --git a/wiki/inc/lang/da/registermail.txt b/wiki/inc/lang/da/registermail.txt
new file mode 100644
index 0000000..8ce3b54
--- /dev/null
+++ b/wiki/inc/lang/da/registermail.txt
@@ -0,0 +1,10 @@
+En ny bruger har registreret. Her er detaljerne:
+
+Brugernavn : @NEWUSER@
+Navn       : @NEWNAME@
+E-mail     : @NEWEMAIL@
+
+Dato       : @DATE@
+Browser    : @BROWSER@
+IP-adresse : @IPADDRESS@
+Værtsnavn  : @HOSTNAME@
diff --git a/wiki/inc/lang/da/resendpwd.txt b/wiki/inc/lang/da/resendpwd.txt
new file mode 100644
index 0000000..e96861e
--- /dev/null
+++ b/wiki/inc/lang/da/resendpwd.txt
@@ -0,0 +1,3 @@
+====== Send nyt password ======
+
+Udfyld alle nedenstående felter for at få tilsendt et nyt password til denne wiki. Dit nye password vil blive sendt til den opgivne e-mail-adresse. Brugernavnet bør være dit wiki brugernavn.
diff --git a/wiki/inc/lang/da/resetpwd.txt b/wiki/inc/lang/da/resetpwd.txt
new file mode 100644
index 0000000..e0823db
--- /dev/null
+++ b/wiki/inc/lang/da/resetpwd.txt
@@ -0,0 +1,3 @@
+====== Vælg ny adgangskode ======
+
+Indtast venligst en ny adgangskode for din konto på denne wiki.
\ No newline at end of file
diff --git a/wiki/inc/lang/da/revisions.txt b/wiki/inc/lang/da/revisions.txt
new file mode 100644
index 0000000..08f6f20
--- /dev/null
+++ b/wiki/inc/lang/da/revisions.txt
@@ -0,0 +1,3 @@
+====== Gamle udgaver ======
+
+Her er de gamle udgaver af dette dokument. Du kan vende tilbage til en tidligere udgave af dokumentet ved at vælge det nedenfor, trykke på knappen **''[Rediger dette dokument]''**, og til sidst gemme dokumentet.
diff --git a/wiki/inc/lang/da/searchpage.txt b/wiki/inc/lang/da/searchpage.txt
new file mode 100644
index 0000000..c444785
--- /dev/null
+++ b/wiki/inc/lang/da/searchpage.txt
@@ -0,0 +1,4 @@
+====== Søgning ======
+
+Du kan se resultaterne af din søgning nedenunder. @CREATEPAGEINFO@
+
diff --git a/wiki/inc/lang/da/showrev.txt b/wiki/inc/lang/da/showrev.txt
new file mode 100644
index 0000000..3d48903
--- /dev/null
+++ b/wiki/inc/lang/da/showrev.txt
@@ -0,0 +1,2 @@
+**Dette er en gammel udgave af dokumentet!**
+----
diff --git a/wiki/inc/lang/da/stopwords.txt b/wiki/inc/lang/da/stopwords.txt
new file mode 100644
index 0000000..0fb9267
--- /dev/null
+++ b/wiki/inc/lang/da/stopwords.txt
@@ -0,0 +1,87 @@
+# This is a list of words the indexer ignores, one word per line
+# When you edit this file be sure to use UNIX line endings (single newline)
+# No need to include words shorter than 3 chars - these are ignored anyway
+# This list is based upon the ones found at http://www.ranks.nl/stopwords/
+alle
+andet
+andre
+begge
+den
+denne
+der
+deres
+det
+dette
+dig
+din
+dog
+eller
+end
+ene
+eneste
+enhver
+fem
+fire
+flere
+fleste
+for
+fordi
+forrige
+fra
+før
+god
+han
+hans
+har
+hendes
+her
+hun
+hvad
+hvem
+hver
+hvilken
+hvis
+hvor
+hvordan
+hvorfor
+hvornår
+ikke
+ind
+ingen
+intet
+jeg
+jeres
+kan
+kom
+kommer
+lav
+lidt
+lille
+man
+mand
+mange
+med
+meget
+men
+mens
+mere
+mig
+ned
+nogen
+noget
+nyt
+nær
+næste
+næsten
+otte
+over
+seks
+ses
+som
+stor
+store
+syv
+til
+tre
+var
+www
\ No newline at end of file
diff --git a/wiki/inc/lang/da/subscr_digest.txt b/wiki/inc/lang/da/subscr_digest.txt
new file mode 100644
index 0000000..06a28d6
--- /dev/null
+++ b/wiki/inc/lang/da/subscr_digest.txt
@@ -0,0 +1,16 @@
+Hej,
+
+Siden @PAGE@ i @TITLE@ wikien er blevet ændret.
+Her er ændringerne:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Gammel Revision: @OLDPAGE@
+Ny Revision: @NEWPAGE@
+
+For at stoppe notifikationer om sideændringer, login på wikien på
+@DOKUWIKIURL@ og besøg så
+@SUBSCRIBE@
+for at afmelde side og/eller navneområde ændringer.
diff --git a/wiki/inc/lang/da/subscr_form.txt b/wiki/inc/lang/da/subscr_form.txt
new file mode 100644
index 0000000..9de6565
--- /dev/null
+++ b/wiki/inc/lang/da/subscr_form.txt
@@ -0,0 +1,3 @@
+====== Abonnementadministration ======
+
+Denne side gør det muligt for dig at administrere dine abonnementer for den nuværende side eller navnerum.
\ No newline at end of file
diff --git a/wiki/inc/lang/da/subscr_list.txt b/wiki/inc/lang/da/subscr_list.txt
new file mode 100644
index 0000000..62f8f66
--- /dev/null
+++ b/wiki/inc/lang/da/subscr_list.txt
@@ -0,0 +1,13 @@
+Hej,
+
+Sider i navneområdet @PAGE@ i @TITLE@ wikien er blevet ændret.
+Her er de ændrede sider:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+For at stoppe notifikationer om sideændringer, login på wikien på
+@DOKUWIKIURL@ og besøg så
+@SUBSCRIBE@
+for at afmelde side og/eller navneområde ændringer.
diff --git a/wiki/inc/lang/da/subscr_single.txt b/wiki/inc/lang/da/subscr_single.txt
new file mode 100644
index 0000000..fb50523
--- /dev/null
+++ b/wiki/inc/lang/da/subscr_single.txt
@@ -0,0 +1,19 @@
+Hej!
+
+Siden @PAGE@ i wikien @TITLE@ er blevet ændret.
+Her er ændringerne:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Dato : @DATE@
+Bruger : @USER@
+Summering: @SUMMARY@
+Gammel Revision: @OLDPAGE@
+Ny Revision: @NEWPAGE@
+
+For at slå side notifikationer fra, skal du logge ind på
+@DOKUWIKIURL@ og besøge
+@SUBSCRIBE@
+og slå abonnoment for side / navnerum ændringer fra.
diff --git a/wiki/inc/lang/da/updateprofile.txt b/wiki/inc/lang/da/updateprofile.txt
new file mode 100644
index 0000000..2c6ce3f
--- /dev/null
+++ b/wiki/inc/lang/da/updateprofile.txt
@@ -0,0 +1,3 @@
+====== Opdater din kontos profil ======
+
+Du behøver kun at udfylde de felter du ønsker at ændre. Du kan ikke ændre dit brugernavn.
diff --git a/wiki/inc/lang/da/uploadmail.txt b/wiki/inc/lang/da/uploadmail.txt
new file mode 100644
index 0000000..87a0875
--- /dev/null
+++ b/wiki/inc/lang/da/uploadmail.txt
@@ -0,0 +1,10 @@
+En fil blev overføret til din DokuWiki. Her er detaljerne:
+
+Fil         : @MEDIA@
+Dato        : @DATE@
+Browser     : @BROWSER@
+IP-adresse  : @IPADDRESS@
+Værtsnavn   : @HOSTNAME@
+Størrelse   : @SIZE@
+MIME Type   : @MIME@
+Bruger      : @USER@
diff --git a/wiki/inc/lang/de-informal/admin.txt b/wiki/inc/lang/de-informal/admin.txt
new file mode 100644
index 0000000..c52f343
--- /dev/null
+++ b/wiki/inc/lang/de-informal/admin.txt
@@ -0,0 +1,4 @@
+====== Administration ======
+
+Folgende administrative Aufgaben stehen in DokuWiki zur Verfügung.
+
diff --git a/wiki/inc/lang/de-informal/adminplugins.txt b/wiki/inc/lang/de-informal/adminplugins.txt
new file mode 100644
index 0000000..a0ae21f
--- /dev/null
+++ b/wiki/inc/lang/de-informal/adminplugins.txt
@@ -0,0 +1 @@
+===== Zusätzliche Plugins =====
\ No newline at end of file
diff --git a/wiki/inc/lang/de-informal/backlinks.txt b/wiki/inc/lang/de-informal/backlinks.txt
new file mode 100644
index 0000000..aae4c55
--- /dev/null
+++ b/wiki/inc/lang/de-informal/backlinks.txt
@@ -0,0 +1,5 @@
+====== Backlinks ======
+
+Dies ist eine Liste der Seiten, die zurück zur momentanen Seite linken.
+
+
diff --git a/wiki/inc/lang/de-informal/conflict.txt b/wiki/inc/lang/de-informal/conflict.txt
new file mode 100644
index 0000000..eec3450
--- /dev/null
+++ b/wiki/inc/lang/de-informal/conflict.txt
@@ -0,0 +1,6 @@
+====== Eine neuere Version existiert ======
+
+Eine neuere Version des aktuell in Bearbeitung befindlichen Dokuments existiert. Das heißt, jemand hat gleichzeitig an der selben Seite gearbeitet und zuerst gespeichert.
+
+Die unten aufgeführten Unterschiede können bei der Entscheidung helfen, welchem Dokument Vorrang gewährt wird. Wähle **''[Speichern]''** zum Sichern deiner Version oder **''[Abbrechen]''**,  um deine Version zu verwerfen und die zuerst gespeicherte Seite zu behalten.
+
diff --git a/wiki/inc/lang/de-informal/denied.txt b/wiki/inc/lang/de-informal/denied.txt
new file mode 100644
index 0000000..99004f6
--- /dev/null
+++ b/wiki/inc/lang/de-informal/denied.txt
@@ -0,0 +1,4 @@
+====== Zugang verweigert ======
+
+Du hast nicht die erforderliche Berechtigung, um diese Aktion durchzuführen.
+
diff --git a/wiki/inc/lang/de-informal/diff.txt b/wiki/inc/lang/de-informal/diff.txt
new file mode 100644
index 0000000..82fbbc2
--- /dev/null
+++ b/wiki/inc/lang/de-informal/diff.txt
@@ -0,0 +1,5 @@
+====== Unterschiede ======
+
+Hier werden die Unterschiede zwischen zwei Versionen gezeigt.
+
+
diff --git a/wiki/inc/lang/de-informal/draft.txt b/wiki/inc/lang/de-informal/draft.txt
new file mode 100644
index 0000000..e56dbe0
--- /dev/null
+++ b/wiki/inc/lang/de-informal/draft.txt
@@ -0,0 +1,6 @@
+====== Entwurf gefunden ======
+
+Deine letzte Bearbeitungssitzung wurde nicht ordnungsgemäß abgeschlossen. DokuWiki hat während deiner Arbeit automatisch einen Zwischenentwurf gespeichert, den du jetzt nutzen kannst, um deine Arbeit fortzusetzen. Unten siehst du die Daten, die bei deiner letzten Sitzung gespeichert wurden.
+
+Bitte entscheide dich, ob du den Entwurf //wiederherstellen// oder //löschen// willst oder ob du die Bearbeitung abbrechen möchtest.
+
diff --git a/wiki/inc/lang/de-informal/edit.txt b/wiki/inc/lang/de-informal/edit.txt
new file mode 100644
index 0000000..28a7641
--- /dev/null
+++ b/wiki/inc/lang/de-informal/edit.txt
@@ -0,0 +1,4 @@
+Bitte bearbeite dieses Dokument nur, wenn du es **verbessern** kannst.
+
+Nach dem Bearbeiten den **''[Speichern]''**-Knopf drücken. Siehe [[wiki:syntax]] zur Wiki-Syntax. Zum Testen bitte erst im [[playground:playground|Spielplatz]] üben.
+
diff --git a/wiki/inc/lang/de-informal/editrev.txt b/wiki/inc/lang/de-informal/editrev.txt
new file mode 100644
index 0000000..6c1f642
--- /dev/null
+++ b/wiki/inc/lang/de-informal/editrev.txt
@@ -0,0 +1,2 @@
+**Eine ältere Version des Dokuments wurde geladen!** Beim Speichern wird eine neue Version des Dokuments mit diesem Inhalt erstellt.
+----
\ No newline at end of file
diff --git a/wiki/inc/lang/de-informal/index.txt b/wiki/inc/lang/de-informal/index.txt
new file mode 100644
index 0000000..fa8dc46
--- /dev/null
+++ b/wiki/inc/lang/de-informal/index.txt
@@ -0,0 +1,4 @@
+====== Übersicht ======
+
+Dies ist eine Übersicht über alle vorhandenen Seiten und [[doku>namespaces|Namensräume]].
+
diff --git a/wiki/inc/lang/de-informal/install.html b/wiki/inc/lang/de-informal/install.html
new file mode 100644
index 0000000..19fae80
--- /dev/null
+++ b/wiki/inc/lang/de-informal/install.html
@@ -0,0 +1,27 @@
+<p>Diese Seite hilft dir bei der Erstinstallation und Konfiguration von
+<a href="http://dokuwiki.org">DokuWiki</a>. Zusätzliche Informationen zu
+diesem Installationsskript findest du auf der entsprechenden
+<a href="http://dokuwiki.org/installer">Hilfe-Seite</a> (en).</p>
+
+<p>DokuWiki verwendet normale Dateien für das Speichern von Wikiseiten und
+anderen Informationen (Bilder, Suchindizes, alte Versionen usw.).
+Um DokuWiki betreiben zu können, <strong>muss</strong> Schreibzugriff auf die
+Verzeichnisse bestehen, in denen DokuWiki diese Dateien ablegt. Dieses
+Installationsprogramm kann diese Rechte nicht für dich setzen. Du musst dies
+manuell auf einer Kommando-Shell oder, falls du DokuWiki bei einem Fremdanbieter
+hostest, über FTP oder ein entsprechendes Werkzeug (z.B. cPanel) durchführen.</p>
+
+<p>Dieses Skript hilft dir beim ersten Einrichten des Zugangsschutzes
+(<abbr title="access control list">ACL</abbr>) von DokuWiki, welcher eine
+Administratoranmeldung und damit Zugang zum Administrationsmenü ermöglicht.
+Dort kannst du dann weitere Tätigkeiten wie das Installieren von Plugins, dass
+Verwalten von Benutzern und das Ändern von Konfigurationseinstellungen durchführen.
+Das Benutzen der Zugangskontrolle ist nicht zwingend erforderlich, es erleichtert aber
+die Administration von DokuWiki.</p>
+
+<p>Erfahrene Anwender oder Benutzer mit speziellen Konfigurationsbedürfnissen sollten
+die folgenden Links nutzen, um sich über
+<a href="http://dokuwiki.org/install">Installation</a>
+und <a href="http://dokuwiki.org/config">Konfiguration</a> zu
+informieren.</p>
+
diff --git a/wiki/inc/lang/de-informal/jquery.ui.datepicker.js b/wiki/inc/lang/de-informal/jquery.ui.datepicker.js
new file mode 100644
index 0000000..a677908
--- /dev/null
+++ b/wiki/inc/lang/de-informal/jquery.ui.datepicker.js
@@ -0,0 +1,37 @@
+/* German initialisation for the jQuery UI date picker plugin. */
+/* Written by Milian Wolff (mail@milianw.de). */
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "../widgets/datepicker" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery.datepicker );
+	}
+}( function( datepicker ) {
+
+datepicker.regional.de = {
+	closeText: "Schließen",
+	prevText: "&#x3C;Zurück",
+	nextText: "Vor&#x3E;",
+	currentText: "Heute",
+	monthNames: [ "Januar","Februar","März","April","Mai","Juni",
+	"Juli","August","September","Oktober","November","Dezember" ],
+	monthNamesShort: [ "Jan","Feb","Mär","Apr","Mai","Jun",
+	"Jul","Aug","Sep","Okt","Nov","Dez" ],
+	dayNames: [ "Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag" ],
+	dayNamesShort: [ "So","Mo","Di","Mi","Do","Fr","Sa" ],
+	dayNamesMin: [ "So","Mo","Di","Mi","Do","Fr","Sa" ],
+	weekHeader: "KW",
+	dateFormat: "dd.mm.yy",
+	firstDay: 1,
+	isRTL: false,
+	showMonthAfterYear: false,
+	yearSuffix: "" };
+datepicker.setDefaults( datepicker.regional.de );
+
+return datepicker.regional.de;
+
+} ) );
diff --git a/wiki/inc/lang/de-informal/lang.php b/wiki/inc/lang/de-informal/lang.php
new file mode 100644
index 0000000..e4e5b4f
--- /dev/null
+++ b/wiki/inc/lang/de-informal/lang.php
@@ -0,0 +1,358 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author F. Mueller-Donath <j.felix@mueller-donath.de>
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @author Christof <gagi@fin.de>
+ * @author Anika Henke <anika@selfthinker.org>
+ * @author Esther Brunner <esther@kaffeehaus.ch>
+ * @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
+ * @author Michael Klier <chi@chimeric.de>
+ * @author Leo Moll <leo@yeasoft.com>
+ * @author Florian Anderiasch <fa@art-core.org>
+ * @author Robin Kluth <commi1993@gmail.com>
+ * @author Arne Pelka <mail@arnepelka.de>
+ * @author Alexander Fischer <tbanus@os-forge.net>
+ * @author Juergen Schwarzer <jschwarzer@freenet.de>
+ * @author Marcel Metz <marcel_metz@gmx.de>
+ * @author Matthias Schulte <dokuwiki@lupo49.de>
+ * @author Christian Wichmann <nospam@zone0.de>
+ * @author Pierre Corell <info@joomla-praxis.de>
+ * @author Frank Loizzi <contact@software.bacal.de>
+ * @author Volker Bödker <volker@boedker.de>
+ * @author Janosch <janosch@moinzen.de>
+ * @author rnck <dokuwiki@rnck.de>
+ */
+$lang['encoding']              = 'utf-8';
+$lang['direction']             = 'ltr';
+$lang['doublequoteopening']    = '„';
+$lang['doublequoteclosing']    = '“';
+$lang['singlequoteopening']    = '‚';
+$lang['singlequoteclosing']    = '‘';
+$lang['apostrophe']            = '’';
+$lang['btn_edit']              = 'Diese Seite bearbeiten';
+$lang['btn_source']            = 'Zeige Quelltext';
+$lang['btn_show']              = 'Seite anzeigen';
+$lang['btn_create']            = 'Seite anlegen';
+$lang['btn_search']            = 'Suche';
+$lang['btn_save']              = 'Speichern';
+$lang['btn_preview']           = 'Vorschau';
+$lang['btn_top']               = 'Nach oben';
+$lang['btn_newer']             = '<< jüngere Änderungen';
+$lang['btn_older']             = 'ältere Änderungen >>';
+$lang['btn_revs']              = 'Ältere Versionen';
+$lang['btn_recent']            = 'Letzte Änderungen';
+$lang['btn_upload']            = 'Hochladen';
+$lang['btn_cancel']            = 'Abbrechen';
+$lang['btn_index']             = 'Übersicht';
+$lang['btn_secedit']           = 'Bearbeiten';
+$lang['btn_login']             = 'Anmelden';
+$lang['btn_logout']            = 'Abmelden';
+$lang['btn_admin']             = 'Admin';
+$lang['btn_update']            = 'Updaten';
+$lang['btn_delete']            = 'Löschen';
+$lang['btn_back']              = 'Zurück';
+$lang['btn_backlink']          = 'Links hierher';
+$lang['btn_subscribe']         = 'Aboverwaltung';
+$lang['btn_profile']           = 'Benutzerprofil';
+$lang['btn_reset']             = 'Zurücksetzen';
+$lang['btn_resendpwd']         = 'Setze neues Passwort';
+$lang['btn_draft']             = 'Entwurf bearbeiten';
+$lang['btn_recover']           = 'Entwurf wiederherstellen';
+$lang['btn_draftdel']          = 'Entwurf löschen';
+$lang['btn_revert']            = 'Wiederherstellen';
+$lang['btn_register']          = 'Registrieren';
+$lang['btn_apply']             = 'Übernehmen';
+$lang['btn_media']             = 'Medien-Manager';
+$lang['btn_deleteuser']        = 'Benutzerprofil löschen';
+$lang['btn_img_backto']        = 'Zurück zu %s';
+$lang['btn_mediaManager']      = 'Im Medien-Manager anzeigen';
+$lang['loggedinas']            = 'Angemeldet als:';
+$lang['user']                  = 'Benutzername';
+$lang['pass']                  = 'Passwort';
+$lang['newpass']               = 'Neues Passwort';
+$lang['oldpass']               = 'Bestätigen (Altes Passwort)';
+$lang['passchk']               = 'Passwort erneut eingeben';
+$lang['remember']              = 'Angemeldet bleiben';
+$lang['fullname']              = 'Voller Name';
+$lang['email']                 = 'E-Mail';
+$lang['profile']               = 'Benutzerprofil';
+$lang['badlogin']              = 'Benutzername oder Passwort sind falsch.';
+$lang['badpassconfirm']        = 'Das Passwort war falsch.';
+$lang['minoredit']             = 'Kleine Änderung';
+$lang['draftdate']             = 'Entwurf gespeichert am';
+$lang['nosecedit']             = 'Diese Seite wurde in der Zwischenzeit geändert, da das Sektionsinfo veraltet ist. Die ganze Seite wird stattdessen geladen.';
+$lang['regmissing']            = 'Alle Felder müssen ausgefüllt werden';
+$lang['reguexists']            = 'Der Benutzername existiert leider schon.';
+$lang['regsuccess']            = 'Der neue Benutzer wurde angelegt und das Passwort per E-Mail versandt.';
+$lang['regsuccess2']           = 'Der neue Benutzer wurde angelegt.';
+$lang['regfail']               = 'Der Benutzer konnte nicht erstellt werden.';
+$lang['regmailfail']           = 'Offenbar ist ein Fehler beim Versenden der Passwortmail aufgetreten. Bitte wende dich an den Wiki-Admin.';
+$lang['regbadmail']            = 'Die angegebene Mail-Adresse scheint ungültig zu sein. Falls dies ein Fehler ist, wende dich bitte an den Wiki-Admin.';
+$lang['regbadpass']            = 'Die beiden eingegeben Passwörter stimmen nicht überein. Bitte versuche es noch einmal.';
+$lang['regpwmail']             = 'Ihr DokuWiki-Passwort';
+$lang['reghere']               = 'Du hast noch keinen Zugang? Hier registrieren';
+$lang['profna']                = 'Änderung des Benutzerprofils in diesem Wiki nicht möglich.';
+$lang['profnochange']          = 'Keine Änderungen, nichts zu tun.';
+$lang['profnoempty']           = 'Es muss ein Name oder eine E-Mail Adresse angegeben werden.';
+$lang['profchanged']           = 'Benutzerprofil erfolgreich geändert.';
+$lang['profnodelete']          = 'Dieses Wiki unterstützt nicht das Löschen von Benutzern.';
+$lang['profdeleteuser']        = 'Benutzerprofil löschen';
+$lang['profdeleted']           = 'Dein Benutzerprofil wurde im Wiki gelöscht.';
+$lang['profconfdelete']        = 'Ich möchte mein Benutzerprofil löschen.<br/> Diese Aktion ist nicht umkehrbar.';
+$lang['profconfdeletemissing'] = 'Bestätigungs-Checkbox wurde nicht angehakt.';
+$lang['proffail']              = 'Das Benutzerprofil wurde nicht aktualisiert.';
+$lang['pwdforget']             = 'Passwort vergessen? Fordere ein neues an';
+$lang['resendna']              = 'Passwörter versenden ist in diesem Wiki nicht möglich.';
+$lang['resendpwd']             = 'Neues Passwort setzen für';
+$lang['resendpwdmissing']      = 'Es tut mir leid, aber du musst alle Felder ausfüllen.';
+$lang['resendpwdnouser']       = 'Es tut mir leid, aber der Benutzer existiert nicht in unserer Datenbank.';
+$lang['resendpwdbadauth']      = 'Es tut mir leid, aber dieser Authentifizierungscode ist ungültig. Stelle sicher, dass du den kompletten Bestätigungslink verwendet haben.';
+$lang['resendpwdconfirm']      = 'Ein Bestätigungslink wurde per E-Mail versandt.';
+$lang['resendpwdsuccess']      = 'Dein neues Passwort wurde per E-Mail versandt.';
+$lang['license']               = 'Falls nicht anders bezeichnet, ist der Inhalt dieses Wikis unter der folgenden Lizenz veröffentlicht:';
+$lang['licenseok']             = 'Hinweis: Durch das Bearbeiten dieser Seite gibst du dein Einverständnis, dass dein Inhalt unter der folgenden Lizenz veröffentlicht wird:';
+$lang['searchmedia']           = 'Suche nach Datei:';
+$lang['searchmedia_in']        = 'Suche in %s';
+$lang['txt_upload']            = 'Datei zum Hochladen auswählen:';
+$lang['txt_filename']          = 'Hochladen als (optional):';
+$lang['txt_overwrt']           = 'Bestehende Datei überschreiben';
+$lang['maxuploadsize']         = 'Max. %s pro Datei-Upload.';
+$lang['lockedby']              = 'Momentan gesperrt von:';
+$lang['lockexpire']            = 'Sperre läuft ab am:';
+$lang['js']['willexpire']      = 'Die Sperre zur Bearbeitung dieser Seite läuft in einer Minute ab.\nUm Bearbeitungskonflikte zu vermeiden, solltest du sie durch einen Klick auf den Vorschau-Knopf verlängern.';
+$lang['js']['notsavedyet']     = 'Nicht gespeicherte Änderungen gehen verloren!';
+$lang['js']['searchmedia']     = 'Suche nach Dateien';
+$lang['js']['keepopen']        = 'Fenster nach Auswahl nicht schließen';
+$lang['js']['hidedetails']     = 'Details ausblenden';
+$lang['js']['mediatitle']      = 'Link-Eigenschaften';
+$lang['js']['mediadisplay']    = 'Linktyp';
+$lang['js']['mediaalign']      = 'Ausrichtung';
+$lang['js']['mediasize']       = 'Bildgröße';
+$lang['js']['mediatarget']     = 'Linkziel';
+$lang['js']['mediaclose']      = 'Schließen';
+$lang['js']['mediainsert']     = 'Einfügen';
+$lang['js']['mediadisplayimg'] = 'Bild anzeigen.';
+$lang['js']['mediadisplaylnk'] = 'Nur den Link anzeigen.';
+$lang['js']['mediasmall']      = 'Kleine Version';
+$lang['js']['mediamedium']     = 'Mittelgroße Version';
+$lang['js']['medialarge']      = 'Große Version';
+$lang['js']['mediaoriginal']   = 'Original Version';
+$lang['js']['medialnk']        = 'Link zu der Detailseite';
+$lang['js']['mediadirect']     = 'Direkter Link zum Original';
+$lang['js']['medianolnk']      = 'Kein link';
+$lang['js']['medianolink']     = 'Keine Verlinkung des Bildes';
+$lang['js']['medialeft']       = 'Bild nach links ausrichten.';
+$lang['js']['mediaright']      = 'Bild nach rechts ausrichten.';
+$lang['js']['mediacenter']     = 'Bild in der Mitte ausrichten';
+$lang['js']['medianoalign']    = 'Keine Ausrichtung des Bildes.';
+$lang['js']['nosmblinks']      = 'Das Verlinken von Windows-Freigaben funktioniert nur im Microsoft Internet-Explorer.\nDer Link kann jedoch durch Kopieren und Einfügen verwendet werden.';
+$lang['js']['linkwiz']         = 'Link-Assistent';
+$lang['js']['linkto']          = 'Link zu:';
+$lang['js']['del_confirm']     = 'Die ausgewählten Dateien wirklich löschen?';
+$lang['js']['restore_confirm'] = 'Wirklich diese Version wiederherstellen?';
+$lang['js']['media_diff']      = 'Unterschiede anzeigen:';
+$lang['js']['media_diff_both'] = 'Nebeneinander';
+$lang['js']['media_diff_opacity'] = 'Überblenden';
+$lang['js']['media_diff_portions'] = 'Übergang';
+$lang['js']['media_select']    = 'Dateien auswählen…';
+$lang['js']['media_upload_btn'] = 'Hochladen';
+$lang['js']['media_done_btn']  = 'Fertig';
+$lang['js']['media_drop']      = 'Dateien hier hinziehen um sie hochzuladen';
+$lang['js']['media_cancel']    = 'Entfernen';
+$lang['js']['media_overwrt']   = 'Existierende Dateien überschreiben';
+$lang['rssfailed']             = 'Es ist ein Fehler beim Laden des Feeds aufgetreten: ';
+$lang['nothingfound']          = 'Nichts gefunden.';
+$lang['mediaselect']           = 'Dateiauswahl';
+$lang['uploadsucc']            = 'Datei wurde erfolgreich hochgeladen';
+$lang['uploadfail']            = 'Hochladen fehlgeschlagen. Keine Berechtigung?';
+$lang['uploadwrong']           = 'Hochladen verweigert. Diese Dateiendung ist nicht erlaubt.';
+$lang['uploadexist']           = 'Datei existiert bereits. Keine Änderungen vorgenommen.';
+$lang['uploadbadcontent']      = 'Die hochgeladenen Daten stimmen nicht mit der Dateiendung %s überein.';
+$lang['uploadspam']            = 'Hochladen verweigert: Treffer auf der Spamliste.';
+$lang['uploadxss']             = 'Hochladen verweigert: Daten scheinen Schadcode zu enthalten.';
+$lang['uploadsize']            = 'Die hochgeladene Datei war zu groß. (max. %s)';
+$lang['deletesucc']            = 'Die Datei "%s" wurde gelöscht.';
+$lang['deletefail']            = '"%s" konnte nicht gelöscht werden. Keine Berechtigung?.';
+$lang['mediainuse']            = 'Die Datei "%s" wurde nicht gelöscht. Sie wird noch verwendet.';
+$lang['namespaces']            = 'Namensräume';
+$lang['mediafiles']            = 'Vorhandene Dateien in';
+$lang['accessdenied']          = 'Du hast keinen Zugriff auf diese Seite';
+$lang['mediausage']            = 'Syntax zum Verwenden dieser Datei:';
+$lang['mediaview']             = 'Originaldatei öffnen';
+$lang['mediaroot']             = 'Wurzel';
+$lang['mediaupload']           = 'Lade hier eine Datei in den momentanen Namensraum hoch. Um Unterordner zu erstellen, stelle diese dem Dateinamen durch Doppelpunkt getrennt voran, nachdem Du die Datei ausgewählt hast.';
+$lang['mediaextchange']        = 'Dateiendung vom .%s nach .%s geändert!';
+$lang['reference']             = 'Verwendung von';
+$lang['ref_inuse']             = 'Diese Datei kann nicht gelöscht werden, da sie noch von folgenden Seiten benutzt wird:';
+$lang['ref_hidden']            = 'Einige Verweise sind auf Seiten, für die du keine Leseberechtigung hast.';
+$lang['hits']                  = 'Treffer';
+$lang['quickhits']             = 'Passende Seitennamen';
+$lang['toc']                   = 'Inhaltsverzeichnis';
+$lang['current']               = 'aktuell';
+$lang['yours']                 = 'Deine Version';
+$lang['diff']                  = 'Zeige Unterschiede zu aktueller Version';
+$lang['diff2']                 = 'Zeige Unterschiede der ausgewählten Versionen';
+$lang['difflink']              = 'Link zu der Vergleichsansicht';
+$lang['diff_type']             = 'Unterschiede anzeigen:';
+$lang['diff_inline']           = 'Inline';
+$lang['diff_side']             = 'Nebeneinander';
+$lang['diffprevrev']           = 'Vorherige Überarbeitung';
+$lang['diffnextrev']           = 'Nächste Überarbeitung';
+$lang['difflastrev']           = 'Letzte Überarbeitung';
+$lang['diffbothprevrev']       = 'Beide Seiten, vorherige Überarbeitung';
+$lang['diffbothnextrev']       = 'Beide Seiten, nächste Überarbeitung';
+$lang['line']                  = 'Zeile';
+$lang['breadcrumb']            = 'Zuletzt angesehen:';
+$lang['youarehere']            = 'Du befindest dich hier:';
+$lang['lastmod']               = 'Zuletzt geändert:';
+$lang['by']                    = 'von';
+$lang['deleted']               = 'gelöscht';
+$lang['created']               = 'angelegt';
+$lang['restored']              = 'alte Version wiederhergestellt (%s)';
+$lang['external_edit']         = 'Externe Bearbeitung';
+$lang['summary']               = 'Zusammenfassung';
+$lang['noflash']               = 'Das <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> wird benötigt, um diesen Inhalt anzuzeigen.';
+$lang['download']              = 'Schnipsel herunterladen';
+$lang['tools']                 = 'Werkzeuge';
+$lang['user_tools']            = 'Benutzer-Werkzeuge';
+$lang['site_tools']            = 'Webseiten-Werkzeuge';
+$lang['page_tools']            = 'Seiten-Werkzeuge';
+$lang['skip_to_content']       = 'zum Inhalt springen';
+$lang['sidebar']               = 'Seitenleiste';
+$lang['mail_newpage']          = 'Neue Seite:';
+$lang['mail_changed']          = 'Seite geändert:';
+$lang['mail_subscribe_list']   = 'Geänderte Seiten im Namensraum:';
+$lang['mail_new_user']         = 'Neuer Benutzer:';
+$lang['mail_upload']           = 'Datei hochgeladen:';
+$lang['changes_type']          = 'Änderungen anzeigen von';
+$lang['pages_changes']         = 'Seiten';
+$lang['media_changes']         = 'Mediendateien';
+$lang['both_changes']          = 'Beides, Seiten- und Mediendateien';
+$lang['qb_bold']               = 'Fetter Text';
+$lang['qb_italic']             = 'Kursiver Text';
+$lang['qb_underl']             = 'Unterstrichener Text';
+$lang['qb_code']               = 'Code Text';
+$lang['qb_strike']             = 'Durchgestrichener Text';
+$lang['qb_h1']                 = 'Level 1 Überschrift';
+$lang['qb_h2']                 = 'Level 2 Überschrift';
+$lang['qb_h3']                 = 'Level 3 Überschrift';
+$lang['qb_h4']                 = 'Level 4 Überschrift';
+$lang['qb_h5']                 = 'Level 5 Überschrift';
+$lang['qb_h']                  = 'Überschrift';
+$lang['qb_hs']                 = 'Wähle eine Überschrift';
+$lang['qb_hplus']              = 'Überschrift eine Ebene höher';
+$lang['qb_hminus']             = 'Überschrift eine Ebene runter';
+$lang['qb_hequal']             = 'Überschrift auf selber Ebene';
+$lang['qb_link']               = 'Interner Link';
+$lang['qb_extlink']            = 'Externer Link';
+$lang['qb_hr']                 = 'Horizontale Linie';
+$lang['qb_ol']                 = 'Nummerierter Listenpunkt';
+$lang['qb_ul']                 = 'Listenpunkt';
+$lang['qb_media']              = 'Bilder und andere Dateien hinzufügen';
+$lang['qb_sig']                = 'Unterschrift einfügen';
+$lang['qb_smileys']            = 'Smileys';
+$lang['qb_chars']              = 'Sonderzeichen';
+$lang['upperns']               = 'Gehe zum übergeordneten Namensraum';
+$lang['metaedit']              = 'Metadaten bearbeiten';
+$lang['metasaveerr']           = 'Die Metadaten konnten nicht gesichert werden';
+$lang['metasaveok']            = 'Metadaten gesichert';
+$lang['img_title']             = 'Titel:';
+$lang['img_caption']           = 'Bildunterschrift:';
+$lang['img_date']              = 'Datum:';
+$lang['img_fname']             = 'Dateiname:';
+$lang['img_fsize']             = 'Größe:';
+$lang['img_artist']            = 'Fotograf:';
+$lang['img_copyr']             = 'Copyright:';
+$lang['img_format']            = 'Format:';
+$lang['img_camera']            = 'Kamera:';
+$lang['img_keywords']          = 'Schlagwörter:';
+$lang['img_width']             = 'Breite:';
+$lang['img_height']            = 'Höhe:';
+$lang['subscr_subscribe_success'] = 'Die Seite %s wurde zur Abonnementliste von %s hinzugefügt';
+$lang['subscr_subscribe_error'] = 'Fehler beim Hinzufügen von %s zur Abonnementliste von %s';
+$lang['subscr_subscribe_noaddress'] = 'In deinem Account ist keine E-Mail-Adresse hinterlegt. Dadurch kann die Seite nicht abonniert werden';
+$lang['subscr_unsubscribe_success'] = 'Die Seite %s wurde von der Abonnementliste von %s entfernt';
+$lang['subscr_unsubscribe_error'] = 'Fehler beim Entfernen von %s von der Abonnementliste von %s';
+$lang['subscr_already_subscribed'] = '%s ist bereits auf der Abonnementliste von %s';
+$lang['subscr_not_subscribed'] = '%s ist nicht auf der Abonnementliste von %s';
+$lang['subscr_m_not_subscribed'] = 'Du hast kein Abonnement von dieser Seite oder dem Namensraum.';
+$lang['subscr_m_new_header']   = 'Abonnementen hinzufügen';
+$lang['subscr_m_current_header'] = 'Aktive Abonnements';
+$lang['subscr_m_unsubscribe']  = 'Abbestellen';
+$lang['subscr_m_subscribe']    = 'Abonnieren';
+$lang['subscr_m_receive']      = 'Erhalten';
+$lang['subscr_style_every']    = 'E-Mail bei jeder Änderung';
+$lang['subscr_style_digest']   = 'E-Mail mit zusammengefasster Übersicht der Seitenänderungen (alle %.2f Tage)';
+$lang['subscr_style_list']     = 'Auflistung aller geänderten Seiten seit der letzten E-Mail (alle %.2f Tage)';
+$lang['authtempfail']          = 'Benutzerüberprüfung momentan nicht möglich. Falls das Problem andauert, wende dich an den Admin.';
+$lang['i_chooselang']          = 'Wähle deine Sprache';
+$lang['i_installer']           = 'DokuWiki-Installation';
+$lang['i_wikiname']            = 'Wiki-Name';
+$lang['i_enableacl']           = 'Zugangskontrolle (ACL) aktivieren (empfohlen)';
+$lang['i_superuser']           = 'Benutzername des Administrators';
+$lang['i_problems']            = 'Das Installationsprogramm hat unten aufgeführte Probleme festgestellt, die zunächst behoben werden müssen, bevor du mit der Installation fortfahren kannst.';
+$lang['i_modified']            = 'Aus Sicherheitsgründen arbeitet dieses Skript nur mit einer neuen bzw. nicht modifizierten DokuWiki-Installation. Du solltest entweder alle Dateien noch einmal frisch installieren oder die <a href="http://dokuwiki.org/install">Dokuwiki-Installationsanleitung</a> konsultieren.';
+$lang['i_funcna']              = 'Die PHP-Funktion <code>%s</code> ist nicht verfügbar. Unter Umständen wurde sie von deinem Hoster deaktiviert?';
+$lang['i_phpver']              = 'Deine PHP-Version <code>%s</code> ist niedriger als die benötigte Version <code>%s</code>. Bitte aktualisiere deine PHP-Installation.';
+$lang['i_mbfuncoverload']      = 'mbstring.func_overload muss in php.in deaktiviert werden um DokuWiki auszuführen.';
+$lang['i_permfail']            = '<code>%s</code> ist nicht durch DokuWiki beschreibbar. Du musst die Berechtigungen dieses Ordners ändern!';
+$lang['i_confexists']          = '<code>%s</code> existiert bereits';
+$lang['i_writeerr']            = '<code>%s</code> konnte nicht erzeugt werden. Du solltest die Verzeichnis-/Datei-Rechte überprüfen und die Datei manuell anlegen.';
+$lang['i_badhash']             = 'Unbekannte oder modifizierte dokuwiki.php (Hash=<code>%s</code>)';
+$lang['i_badval']              = '<code>%s</code> - unerlaubter oder leerer Wert';
+$lang['i_success']             = 'Die Konfiguration wurde erfolgreich abgeschlossen. Du kannst jetzt die install.php löschen. Dein <a href="doku.php?id=wiki:welcome">neues DokuWiki</a> ist jetzt für dich bereit.';
+$lang['i_failure']             = 'Es sind Fehler beim Schreiben der Konfigurationsdateien aufgetreten. Du musst diese von Hand beheben, bevor du dein <a href="doku.php?id=wiki:welcome">neues DokuWiki</a> nutzen kannst.';
+$lang['i_policy']              = 'Anfangseinstellungen der Zugangskontrolle (ACL)';
+$lang['i_pol0']                = 'Offenes Wiki (lesen, schreiben und hochladen für alle Benutzer)';
+$lang['i_pol1']                = 'Öffentliches Wiki (Lesen für alle, Schreiben und Hochladen nur für registrierte Benutzer)';
+$lang['i_pol2']                = 'Geschlossenes Wiki (Lesen, Schreiben und Hochladen nur für registrierte Benutzer)';
+$lang['i_allowreg']            = 'Benutzer können sich selbst registrieren';
+$lang['i_retry']               = 'Wiederholen';
+$lang['i_license']             = 'Bitte wähle die Lizenz aus unter der die Wiki-Inhalte veröffentlicht werden sollen:';
+$lang['i_license_none']        = 'Keine Lizenzinformationen anzeigen';
+$lang['i_pop_field']           = 'Bitte helfe uns, die DokuWiki-Erfahrung zu verbessern';
+$lang['i_pop_label']           = 'Sende einmal im Monat anonyme Nutzungsdaten an die DokuWiki Entwickler';
+$lang['recent_global']         = 'Im Moment siehst du die Änderungen im Namensraum <b>%s</b>. Du kannst auch <a href="%s">die Änderungen im gesamten Wiki sehen</a>.';
+$lang['years']                 = 'vor %d Jahren';
+$lang['months']                = 'vor %d Monaten';
+$lang['weeks']                 = 'vor %d Wochen';
+$lang['days']                  = 'vor %d Tagen';
+$lang['hours']                 = 'vor %d Stunden';
+$lang['minutes']               = 'vor %d Minuten';
+$lang['seconds']               = 'vor %d Sekunden';
+$lang['wordblock']             = 'Deine Bearbeitung wurde nicht gespeichert, da sie gesperrten Text enthielt (Spam).';
+$lang['media_uploadtab']       = 'Hochladen';
+$lang['media_searchtab']       = 'Suchen';
+$lang['media_file']            = 'Datei';
+$lang['media_viewtab']         = 'Anzeigen';
+$lang['media_edittab']         = 'Bearbeiten';
+$lang['media_historytab']      = 'Verlauf';
+$lang['media_list_thumbs']     = 'Medien anzeigen als Miniaturansicht';
+$lang['media_list_rows']       = 'Medien anzeigen als Listenansicht';
+$lang['media_sort_name']       = 'Sortieren nach Name';
+$lang['media_sort_date']       = 'Sortieren nach Datum';
+$lang['media_namespaces']      = 'Namensraum wählen';
+$lang['media_files']           = 'Medien im Namensraum <strong>%s</strong>.';
+$lang['media_upload']          = 'In den <strong>%s</strong> Namensraum hochladen.';
+$lang['media_search']          = 'Im Namensraum <strong>%s</strong> suchen.';
+$lang['media_view']            = '%s';
+$lang['media_viewold']         = '%s in %s';
+$lang['media_edit']            = '%s bearbeiten';
+$lang['media_history']         = 'Versionen von %s';
+$lang['media_meta_edited']     = 'Meta-Informationen bearbeitet';
+$lang['media_perm_read']       = 'Du besitzt nicht die notwendigen Berechtigungen um die Datei anzuzeigen.';
+$lang['media_perm_upload']     = 'Du besitzt nicht die notwendigen Berechtigungen um Dateien hochzuladen.';
+$lang['media_update']          = 'Neue Version hochladen';
+$lang['media_restore']         = 'Diese Version wiederherstellen';
+$lang['media_acl_warning']     = 'Diese Liste ist möglicherweise nicht vollständig. Versteckte und durch ACL gesperrte Seiten werden nicht angezeigt.';
+$lang['currentns']             = 'Aktueller Namensraum';
+$lang['searchresult']          = 'Suchergebnis';
+$lang['plainhtml']             = 'Reines HTML';
+$lang['wikimarkup']            = 'Wiki Markup';
+$lang['page_nonexist_rev']     = 'Seite existierte nicht an der Stelle %s. Sie wurde an folgende Stelle erstellt: <a href="%s">%s</a>.';
+$lang['unable_to_parse_date']  = 'Parameter "%s" kann nicht geparsed werden.';
+$lang['email_signature_text']  = 'Diese E-Mail wurde erzeugt vom DokuWiki unter
+@DOKUWIKIURL@';
diff --git a/wiki/inc/lang/de-informal/locked.txt b/wiki/inc/lang/de-informal/locked.txt
new file mode 100644
index 0000000..1cfa089
--- /dev/null
+++ b/wiki/inc/lang/de-informal/locked.txt
@@ -0,0 +1,4 @@
+====== Seite gesperrt ======
+
+Diese Seite ist momentan von einem anderen Benutzer gesperrt. Warte, bis dieser mit dem Bearbeiten fertig ist oder die Sperre abläuft.
+
diff --git a/wiki/inc/lang/de-informal/login.txt b/wiki/inc/lang/de-informal/login.txt
new file mode 100644
index 0000000..5c99c48
--- /dev/null
+++ b/wiki/inc/lang/de-informal/login.txt
@@ -0,0 +1,4 @@
+====== Anmelden ======
+
+Gib deinen Benutzernamen und dein Passwort in das Formular unten ein, um dich anzumelden. Bitte beachte, dass dafür "Cookies" in den Sicherheitseinstellungen deines Browsers erlaubt sein müssen.
+
diff --git a/wiki/inc/lang/de-informal/mailtext.txt b/wiki/inc/lang/de-informal/mailtext.txt
new file mode 100644
index 0000000..127b481
--- /dev/null
+++ b/wiki/inc/lang/de-informal/mailtext.txt
@@ -0,0 +1,12 @@
+Eine Seite in deinem Wiki wurde geändert oder neu angelegt. Hier sind die Details:
+
+Datum          : @DATE@
+Browser        : @BROWSER@
+IP-Adresse     : @IPADDRESS@
+Hostname       : @HOSTNAME@
+Alte Version   : @OLDPAGE@
+Neue Version   : @NEWPAGE@
+Zusammenfassung: @SUMMARY@
+Benutzer       : @USER@
+
+@DIFF@
diff --git a/wiki/inc/lang/de-informal/mailwrap.html b/wiki/inc/lang/de-informal/mailwrap.html
new file mode 100644
index 0000000..7df0cdc
--- /dev/null
+++ b/wiki/inc/lang/de-informal/mailwrap.html
@@ -0,0 +1,13 @@
+<html>
+<head>
+    <title>@TITLE@</title>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+</head>
+<body>
+
+@HTMLBODY@
+
+<br /><hr />
+<small>@EMAILSIGNATURE@</small>
+</body>
+</html>
diff --git a/wiki/inc/lang/de-informal/newpage.txt b/wiki/inc/lang/de-informal/newpage.txt
new file mode 100644
index 0000000..5e261cc
--- /dev/null
+++ b/wiki/inc/lang/de-informal/newpage.txt
@@ -0,0 +1,5 @@
+====== Dieses Thema existiert noch nicht ======
+
+Du bist einem Link zu einer Seite gefolgt, die noch nicht existiert. Du kannst die Seite mit dem Knopf **''[Seite anlegen]''** selbst anlegen und mit Inhalt füllen.
+
+
diff --git a/wiki/inc/lang/de-informal/norev.txt b/wiki/inc/lang/de-informal/norev.txt
new file mode 100644
index 0000000..c624331
--- /dev/null
+++ b/wiki/inc/lang/de-informal/norev.txt
@@ -0,0 +1,4 @@
+====== Version existiert nicht ======
+
+Die angegebene Version des Dokuments wurde nicht gefunden. Benutze den **''[Ältere Versionen]''** Knopf, um eine Liste aller verfügbaren Versionen dieses Dokuments zu erhalten.
+
diff --git a/wiki/inc/lang/de-informal/password.txt b/wiki/inc/lang/de-informal/password.txt
new file mode 100644
index 0000000..e99fc53
--- /dev/null
+++ b/wiki/inc/lang/de-informal/password.txt
@@ -0,0 +1,6 @@
+Hallo @FULLNAME@!
+
+Hier sind deine Benutzerdaten für @TITLE@ auf @DOKUWIKIURL@
+
+Benutzername: @LOGIN@
+Passwort    : @PASSWORD@
diff --git a/wiki/inc/lang/de-informal/preview.txt b/wiki/inc/lang/de-informal/preview.txt
new file mode 100644
index 0000000..d3a578f
--- /dev/null
+++ b/wiki/inc/lang/de-informal/preview.txt
@@ -0,0 +1,5 @@
+====== Vorschau ======
+
+So wird dein Text später aussehen. Achtung: Der Text wurde noch **nicht gespeichert**!
+
+
diff --git a/wiki/inc/lang/de-informal/pwconfirm.txt b/wiki/inc/lang/de-informal/pwconfirm.txt
new file mode 100644
index 0000000..a3b95d8
--- /dev/null
+++ b/wiki/inc/lang/de-informal/pwconfirm.txt
@@ -0,0 +1,12 @@
+Hallo @FULLNAME@!
+
+Jemand hat ein neues Passwort für deinen @TITLE@
+Login auf @DOKUWIKIURL@ angefordert.
+
+Wenn du diese Änderung nicht angefordert hast, ignoriere diese
+E-Mail einfach.
+
+Um die Anforderung zu bestätigen, folge bitte dem unten angegebenen
+Bestätigungslink.
+
+@CONFIRM@
diff --git a/wiki/inc/lang/de-informal/read.txt b/wiki/inc/lang/de-informal/read.txt
new file mode 100644
index 0000000..1c5422a
--- /dev/null
+++ b/wiki/inc/lang/de-informal/read.txt
@@ -0,0 +1,2 @@
+Diese Seite ist nicht editierbar. Du kannst den Quelltext sehen, jedoch nicht verändern. Kontaktiere den Administrator, wenn du glaubst, dass hier ein Fehler vorliegt.
+
diff --git a/wiki/inc/lang/de-informal/recent.txt b/wiki/inc/lang/de-informal/recent.txt
new file mode 100644
index 0000000..c05bbae
--- /dev/null
+++ b/wiki/inc/lang/de-informal/recent.txt
@@ -0,0 +1,5 @@
+====== Letzte Änderungen ======
+
+Die folgenden Seiten wurden zuletzt geändert.
+
+
diff --git a/wiki/inc/lang/de-informal/register.txt b/wiki/inc/lang/de-informal/register.txt
new file mode 100644
index 0000000..f6bf6ed
--- /dev/null
+++ b/wiki/inc/lang/de-informal/register.txt
@@ -0,0 +1,4 @@
+====== Als neuer Benutzer registrieren ======
+
+Bitte fülle alle Felder aus, um einen neuen Benutzer-Account in diesem Wiki anzulegen. Stelle sicher, dass eine **gültige E-Mail-Adresse** angegeben wird - das Passwort wird an diese Adresse gesendet. Der Benutzername sollte aus einem Wort ohne Umlaute, Leer- oder Sonderzeichen bestehen.
+
diff --git a/wiki/inc/lang/de-informal/registermail.txt b/wiki/inc/lang/de-informal/registermail.txt
new file mode 100644
index 0000000..e19fb8f
--- /dev/null
+++ b/wiki/inc/lang/de-informal/registermail.txt
@@ -0,0 +1,10 @@
+Ein neuer Benutzer hat sich registriert. Hier sind die Details:
+
+Benutzername : @NEWUSER@
+Voller Name  : @NEWNAME@
+E-Mail       : @NEWEMAIL@
+
+Date         : @DATE@
+Browser      : @BROWSER@
+IP-Address   : @IPADDRESS@
+Hostname     : @HOSTNAME@
diff --git a/wiki/inc/lang/de-informal/resendpwd.txt b/wiki/inc/lang/de-informal/resendpwd.txt
new file mode 100644
index 0000000..a0a7142
--- /dev/null
+++ b/wiki/inc/lang/de-informal/resendpwd.txt
@@ -0,0 +1,3 @@
+====== Neues Passwort anfordern ======
+
+Fülle alle Felder unten aus, um ein neues Passwort für deinen Zugang zu erhalten. Das neue Passwort wird an deine gespeicherte E-Mail-Adresse geschickt. Der Benutzername muss deinem Wiki-Benutzernamen entsprechen.
diff --git a/wiki/inc/lang/de-informal/resetpwd.txt b/wiki/inc/lang/de-informal/resetpwd.txt
new file mode 100644
index 0000000..8423bd8
--- /dev/null
+++ b/wiki/inc/lang/de-informal/resetpwd.txt
@@ -0,0 +1,4 @@
+====== Neues Passwort setzen  ======
+
+Bitte gib ein neues Passwort für deinen Wiki-Zugang ein.
+
diff --git a/wiki/inc/lang/de-informal/revisions.txt b/wiki/inc/lang/de-informal/revisions.txt
new file mode 100644
index 0000000..b69169a
--- /dev/null
+++ b/wiki/inc/lang/de-informal/revisions.txt
@@ -0,0 +1,4 @@
+====== Ältere Versionen ======
+
+Dies sind ältere Versionen der gewählten Seite. Um zu einer älteren Version zurückzukehren, wähle die entsprechende Version aus, klicke auf **''[Diese Seite bearbeiten]''** und speichere sie erneut ab.
+
diff --git a/wiki/inc/lang/de-informal/searchpage.txt b/wiki/inc/lang/de-informal/searchpage.txt
new file mode 100644
index 0000000..5de550a
--- /dev/null
+++ b/wiki/inc/lang/de-informal/searchpage.txt
@@ -0,0 +1,4 @@
+====== Suche ======
+
+Unten sind die Ergebnisse deiner Suche gelistet. @CREATEPAGEINFO@
+
diff --git a/wiki/inc/lang/de-informal/showrev.txt b/wiki/inc/lang/de-informal/showrev.txt
new file mode 100644
index 0000000..65f53c9
--- /dev/null
+++ b/wiki/inc/lang/de-informal/showrev.txt
@@ -0,0 +1,2 @@
+**Dies ist eine alte Version des Dokuments!**
+----
diff --git a/wiki/inc/lang/de-informal/stopwords.txt b/wiki/inc/lang/de-informal/stopwords.txt
new file mode 100644
index 0000000..443b177
--- /dev/null
+++ b/wiki/inc/lang/de-informal/stopwords.txt
@@ -0,0 +1,125 @@
+# This is a list of words the indexer ignores, one word per line
+# When you edit this file be sure to use UNIX line endings (single newline)
+# No need to include words shorter than 3 chars - these are ignored anyway
+# This list is based upon the ones found at http://www.ranks.nl/stopwords/
+aber
+als
+auch
+auf
+aus
+bei
+bin
+bis
+bist
+dadurch
+daher
+darum
+das
+daß
+dass
+dein
+deine
+dem
+den
+der
+des
+dessen
+deshalb
+die
+dies
+dieser
+dieses
+doch
+dort
+durch
+ein
+eine
+einem
+einen
+einer
+eines
+euer
+eure
+für
+hatte
+hatten
+hattest
+hattet
+hier
+hinter
+ich
+ihr
+ihre
+in
+im
+ist
+jede
+jedem
+jeden
+jeder
+jedes
+jener
+jenes
+jetzt
+kann
+kannst
+können
+könnt
+machen
+mein
+meine
+mit
+muß
+mußt
+musst
+müssen
+müßt
+nach
+nachdem
+nein
+nicht
+nun
+oder
+seid
+sein
+seine
+sich
+sie
+sind
+soll
+sollen
+sollst
+sollt
+sonst
+soweit
+sowie
+und
+unser
+unsere
+unter
+vom
+von
+vor
+um
+wann
+warum
+was
+weiter
+weitere
+wenn
+wer
+werde
+werden
+werdet
+weshalb
+wie
+wieder
+wieso
+wir
+wird
+wirst
+woher
+wohin
+zum
+zur
+über
diff --git a/wiki/inc/lang/de-informal/subscr_digest.txt b/wiki/inc/lang/de-informal/subscr_digest.txt
new file mode 100644
index 0000000..1e29137
--- /dev/null
+++ b/wiki/inc/lang/de-informal/subscr_digest.txt
@@ -0,0 +1,16 @@
+Hallo!
+
+Die Seite @PAGE@ im @TITLE@ Wiki wurde bearbeitet.
+Üersicht der Änderungen:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Alte Revision: @OLDPAGE@
+Neue Revision: @NEWPAGE@
+
+Um das Abonnement für diese Seite aufzulösen, melde dich im Wiki an
+@DOKUWIKIURL@, besuchen dann
+@SUBSCRIBE@
+und klicke auf den Link 'Aboverwaltung'.
diff --git a/wiki/inc/lang/de-informal/subscr_form.txt b/wiki/inc/lang/de-informal/subscr_form.txt
new file mode 100644
index 0000000..7bf74f2
--- /dev/null
+++ b/wiki/inc/lang/de-informal/subscr_form.txt
@@ -0,0 +1,3 @@
+====== Abonnementverwaltung ======
+
+Hier kannst du deine Abonnements für die aktuelle Seite oder den aktuellen [[doku>Namespaces|Namespace]] verwalten.
diff --git a/wiki/inc/lang/de-informal/subscr_list.txt b/wiki/inc/lang/de-informal/subscr_list.txt
new file mode 100644
index 0000000..0bc7a6a
--- /dev/null
+++ b/wiki/inc/lang/de-informal/subscr_list.txt
@@ -0,0 +1,13 @@
+Hallo!
+
+Die Seiten im Namensraum @PAGE@ im @TITLE@ wurden geändert.
+Nachfolgenden findest du die geänderten Seiten:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Um die Benachrichtigungen zu deaktivieren, melde dich am Wiki unter
+@DOKUWIKIURL@ an, gehe zur Seite
+@SUBSCRIBE@
+und deaktiviere das Abonnement für die Seite und/oder den Namensraum.
diff --git a/wiki/inc/lang/de-informal/subscr_single.txt b/wiki/inc/lang/de-informal/subscr_single.txt
new file mode 100644
index 0000000..7ab02cc
--- /dev/null
+++ b/wiki/inc/lang/de-informal/subscr_single.txt
@@ -0,0 +1,19 @@
+Hallo!
+
+Die Seite @PAGE@ im @TITLE@ Wiki wurde bearbeitet.
+Übersicht der Änderungen:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Datum: @DATE@
+Benutzer: @USER@
+Zusammenfassung: @SUMMARY@
+Alte Revision: @OLDPAGE@
+Neue Revision: @NEWPAGE@
+
+Um das Abonnement für diese Seite aufzulösen, melde dich im Wiki an
+@DOKUWIKIURL@, besuche dann
+@SUBSCRIBE@
+und klicke auf den Link 'Aboverwaltung'.
diff --git a/wiki/inc/lang/de-informal/updateprofile.txt b/wiki/inc/lang/de-informal/updateprofile.txt
new file mode 100644
index 0000000..66c2e82
--- /dev/null
+++ b/wiki/inc/lang/de-informal/updateprofile.txt
@@ -0,0 +1,5 @@
+====== Benutzerprofil ändern ======
+
+Nur die Felder, die du änderst, werden aktualisiert. Alle anderen bleiben, wie sie sind. Deinen Benutzernamen kannst du jedoch nicht ändern.
+
+
diff --git a/wiki/inc/lang/de-informal/uploadmail.txt b/wiki/inc/lang/de-informal/uploadmail.txt
new file mode 100644
index 0000000..d608cd5
--- /dev/null
+++ b/wiki/inc/lang/de-informal/uploadmail.txt
@@ -0,0 +1,11 @@
+Eine Datei wurde in deinem Wiki hochgeladen. Hier sind die Details:
+
+Datei       : @MEDIA@
+Alte Version: @OLD@
+Datum       : @DATE@
+Browser     : @BROWSER@
+IP-Adresse  : @IPADDRESS@
+Hostname    : @HOSTNAME@
+Größe       : @SIZE@
+MIME-Typ    : @MIME@
+Benutzer    : @USER@
diff --git a/wiki/inc/lang/de/admin.txt b/wiki/inc/lang/de/admin.txt
new file mode 100644
index 0000000..f079f7e
--- /dev/null
+++ b/wiki/inc/lang/de/admin.txt
@@ -0,0 +1,4 @@
+====== Administration ======
+
+Folgende administrative Aufgaben stehen in DokuWiki zur Verfügung:
+
diff --git a/wiki/inc/lang/de/adminplugins.txt b/wiki/inc/lang/de/adminplugins.txt
new file mode 100644
index 0000000..d3bfd09
--- /dev/null
+++ b/wiki/inc/lang/de/adminplugins.txt
@@ -0,0 +1 @@
+===== Weitere Plugins =====
\ No newline at end of file
diff --git a/wiki/inc/lang/de/backlinks.txt b/wiki/inc/lang/de/backlinks.txt
new file mode 100644
index 0000000..b9caf94
--- /dev/null
+++ b/wiki/inc/lang/de/backlinks.txt
@@ -0,0 +1,5 @@
+====== Links hierher (Backlinks) ======
+
+Dies ist eine Liste der Seiten, welche zurück zur momentanen Seite führen.
+
+
diff --git a/wiki/inc/lang/de/conflict.txt b/wiki/inc/lang/de/conflict.txt
new file mode 100644
index 0000000..0d0283b
--- /dev/null
+++ b/wiki/inc/lang/de/conflict.txt
@@ -0,0 +1,6 @@
+====== Es gibt eine neuere Version ======
+
+Es existiert eine neuere Version des aktuell in Bearbeitung befindlichen Dokumentes. Das heißt, jemand hat parallel an der selben Seite gearbeitet und zuerst gespeichert.
+
+Die unten aufgeführten Unterschiede können bei der Entscheidung helfen, welchem Dokument Vorrang gewährt wird. Wählen Sie  **''[Speichern]''** zum Sichern Ihrer Version oder **''[Abbrechen]''**,  um Ihre Version zu verwerfen und die zuerst gespeicherte Seite zu behalten.
+
diff --git a/wiki/inc/lang/de/denied.txt b/wiki/inc/lang/de/denied.txt
new file mode 100644
index 0000000..db33438
--- /dev/null
+++ b/wiki/inc/lang/de/denied.txt
@@ -0,0 +1,4 @@
+====== Zugang verweigert ======
+
+Sie haben nicht die erforderliche Berechtigung, um diese Aktion durchzuführen.
+
diff --git a/wiki/inc/lang/de/diff.txt b/wiki/inc/lang/de/diff.txt
new file mode 100644
index 0000000..3747da8
--- /dev/null
+++ b/wiki/inc/lang/de/diff.txt
@@ -0,0 +1,5 @@
+====== Unterschiede ======
+
+Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
+
+
diff --git a/wiki/inc/lang/de/draft.txt b/wiki/inc/lang/de/draft.txt
new file mode 100644
index 0000000..17d5d31
--- /dev/null
+++ b/wiki/inc/lang/de/draft.txt
@@ -0,0 +1,6 @@
+====== Entwurf gefunden ======
+
+Ihre letzte Bearbeitungssitzung wurde nicht ordnungsgemäß abgeschlossen. DokuWiki hat während Ihrer Arbeit automatisch einen Zwischenentwurf gespeichert, den Sie jetzt nutzen können, um Ihre Arbeit fortzusetzen. Unten sehen Sie die Daten, die bei Ihrer letzten Sitzung gespeichert wurden.
+
+Bitte entscheiden Sie, ob Sie den Entwurf //wiederherstellen// oder //löschen// wollen, oder ob Sie die Bearbeitung abbrechen möchten.
+
diff --git a/wiki/inc/lang/de/edit.txt b/wiki/inc/lang/de/edit.txt
new file mode 100644
index 0000000..6e56d25
--- /dev/null
+++ b/wiki/inc/lang/de/edit.txt
@@ -0,0 +1,4 @@
+Seite Bearbeiten und **''[Speichern]''** drücken. Siehe [[wiki:syntax]] zur Wiki-Syntax.
+Bitte nur editieren, falls das Dokument tatsächlich **verbessert** werden kann.
+Zum Testen bitte erst im [[playground:playground|Spielplatz]] üben.
+
diff --git a/wiki/inc/lang/de/editrev.txt b/wiki/inc/lang/de/editrev.txt
new file mode 100644
index 0000000..6c1f642
--- /dev/null
+++ b/wiki/inc/lang/de/editrev.txt
@@ -0,0 +1,2 @@
+**Eine ältere Version des Dokuments wurde geladen!** Beim Speichern wird eine neue Version des Dokuments mit diesem Inhalt erstellt.
+----
\ No newline at end of file
diff --git a/wiki/inc/lang/de/index.txt b/wiki/inc/lang/de/index.txt
new file mode 100644
index 0000000..fa8dc46
--- /dev/null
+++ b/wiki/inc/lang/de/index.txt
@@ -0,0 +1,4 @@
+====== Übersicht ======
+
+Dies ist eine Übersicht über alle vorhandenen Seiten und [[doku>namespaces|Namensräume]].
+
diff --git a/wiki/inc/lang/de/install.html b/wiki/inc/lang/de/install.html
new file mode 100644
index 0000000..47dcdf6
--- /dev/null
+++ b/wiki/inc/lang/de/install.html
@@ -0,0 +1,27 @@
+<p>Diese Seite hilft Ihnen bei der Erstinstallation und Konfiguration von
+<a href="http://dokuwiki.org">DokuWiki</a>. Zusätzliche Informationen zu
+diesem Installationsskript finden Sie auf der entsprechenden
+<a href="http://dokuwiki.org/installer">Hilfe Seite</a> (en).</p>
+
+<p>DokuWiki verwendet normale Dateien für das Speichern von Wikiseiten und
+anderen Informationen (Bilder, Suchindizes, alte Versionen usw.).
+Um DokuWiki betreiben zu können, <strong>muss</strong> Schreibzugriff auf die
+Verzeichnisse bestehen, in denen DokuWiki diese Dateien ablegt. Dieses
+Installationsprogramm kann diese Rechte nicht für Sie setzen. Sie müssen dies
+manuell auf einer Kommando-Shell oder, falls Sie DokuWiki bei einem Fremdanbieter
+hosten, über FTP oder ein entsprechendes Werkzeug (z.B. cPanel) durchführen.</p>
+
+<p>Dieses Skript hilft Ihnen beim ersten Einrichten des Zugangsschutzes
+(<abbr title="access control list">ACL</abbr>) von DokuWiki, welcher eine
+Administratoranmeldung und damit Zugang zum Administrationsmenu ermöglicht.
+Dort können Sie dann weitere Tätigkeiten wie das Installieren von Plugins, dass
+Verwalten von Benutzern und das Ändern von Konfigurationseinstellungen durchführen.
+Das Nutzen der Zugangskontrolle ist nicht zwingend erforderlich, es erleichtert aber
+die Administration von DokuWiki.</p>
+
+<p>Erfahrene Anwender oder Benutzer mit speziellen Konfigurationsbedürfnissen sollten
+die folgenden Links nutzen, um sich über
+<a href="http://dokuwiki.org/install">Installation</a>
+und <a href="http://dokuwiki.org/config">Konfiguration</a> zu
+informieren.</p>
+
diff --git a/wiki/inc/lang/de/jquery.ui.datepicker.js b/wiki/inc/lang/de/jquery.ui.datepicker.js
new file mode 100644
index 0000000..a677908
--- /dev/null
+++ b/wiki/inc/lang/de/jquery.ui.datepicker.js
@@ -0,0 +1,37 @@
+/* German initialisation for the jQuery UI date picker plugin. */
+/* Written by Milian Wolff (mail@milianw.de). */
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "../widgets/datepicker" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery.datepicker );
+	}
+}( function( datepicker ) {
+
+datepicker.regional.de = {
+	closeText: "Schließen",
+	prevText: "&#x3C;Zurück",
+	nextText: "Vor&#x3E;",
+	currentText: "Heute",
+	monthNames: [ "Januar","Februar","März","April","Mai","Juni",
+	"Juli","August","September","Oktober","November","Dezember" ],
+	monthNamesShort: [ "Jan","Feb","Mär","Apr","Mai","Jun",
+	"Jul","Aug","Sep","Okt","Nov","Dez" ],
+	dayNames: [ "Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag" ],
+	dayNamesShort: [ "So","Mo","Di","Mi","Do","Fr","Sa" ],
+	dayNamesMin: [ "So","Mo","Di","Mi","Do","Fr","Sa" ],
+	weekHeader: "KW",
+	dateFormat: "dd.mm.yy",
+	firstDay: 1,
+	isRTL: false,
+	showMonthAfterYear: false,
+	yearSuffix: "" };
+datepicker.setDefaults( datepicker.regional.de );
+
+return datepicker.regional.de;
+
+} ) );
diff --git a/wiki/inc/lang/de/lang.php b/wiki/inc/lang/de/lang.php
new file mode 100644
index 0000000..2fd78f5
--- /dev/null
+++ b/wiki/inc/lang/de/lang.php
@@ -0,0 +1,384 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Karl_de_Hall <Karl.Grohmueller@sonnenhof-sha.de>
+ * @author Michael Bohn <mjbohn@gmail.com>
+ * @author Joel Strasser <strasser999@gmail.com>
+ * @author Robert Riebisch <robert.riebisch@googlemail.com>
+ * @author Joerg <scooter22@gmx.de>
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @author Christof <gagi@fin.de>
+ * @author Anika Henke <anika@selfthinker.org>
+ * @author Esther Brunner <esther@kaffeehaus.ch>
+ * @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
+ * @author Michael Klier <chi@chimeric.de>
+ * @author Leo Moll <leo@yeasoft.com>
+ * @author Florian Anderiasch <fa@art-core.org>
+ * @author Robin Kluth <commi1993@gmail.com>
+ * @author Arne Pelka <mail@arnepelka.de>
+ * @author Dirk Einecke <dirk@dirkeinecke.de>
+ * @author Blitzi94 <Blitzi94@gmx.de>
+ * @author Robert Bogenschneider <robog@gmx.de>
+ * @author Niels Lange <niels@boldencursief.nl>
+ * @author Christian Wichmann <nospam@zone0.de>
+ * @author Matthias Schulte <mailinglist@lupo49.de>
+ * @author Paul Lachewsky <kaeptn.haddock@gmail.com>
+ * @author Pierre Corell <info@joomla-praxis.de>
+ * @author Mateng Schimmerlos <mateng@firemail.de>
+ * @author Benedikt Fey <spam@lifeisgoooood.de>
+ * @author Simon <st103267@stud.uni-stuttgart.de>
+ * @author Hoisl <hoisl@gmx.at>
+ * @author Marcel Eickhoff <eickhoff.marcel@gmail.com>
+ * @author Pascal Schröder <Pascal1802@gmail.com>
+ * @author Hendrik Diel <diel.hendrik@gmail.com>
+ * @author Marco Hofmann <xenadmin@meinekleinefarm.net>
+ * @author Hella Breitkopf <hella.breitkopf@gmail.com>
+ */
+$lang['encoding']              = 'utf-8';
+$lang['direction']             = 'ltr';
+$lang['doublequoteopening']    = '„';
+$lang['doublequoteclosing']    = '“';
+$lang['singlequoteopening']    = '‚';
+$lang['singlequoteclosing']    = '‘';
+$lang['apostrophe']            = '’';
+$lang['btn_edit']              = 'Diese Seite bearbeiten';
+$lang['btn_source']            = 'Zeige Quelltext';
+$lang['btn_show']              = 'Seite anzeigen';
+$lang['btn_create']            = 'Seite anlegen';
+$lang['btn_search']            = 'Suche';
+$lang['btn_save']              = 'Speichern';
+$lang['btn_preview']           = 'Vorschau';
+$lang['btn_top']               = 'Nach oben';
+$lang['btn_newer']             = '<< neuere Änderungen';
+$lang['btn_older']             = 'ältere Änderungen >>';
+$lang['btn_revs']              = 'Ältere Versionen';
+$lang['btn_recent']            = 'Letzte Änderungen';
+$lang['btn_upload']            = 'Hochladen';
+$lang['btn_cancel']            = 'Abbrechen';
+$lang['btn_index']             = 'Übersicht';
+$lang['btn_secedit']           = 'Bearbeiten';
+$lang['btn_login']             = 'Anmelden';
+$lang['btn_logout']            = 'Abmelden';
+$lang['btn_admin']             = 'Admin';
+$lang['btn_update']            = 'Aktualisieren';
+$lang['btn_delete']            = 'Löschen';
+$lang['btn_back']              = 'Zurück';
+$lang['btn_backlink']          = 'Links hierher';
+$lang['btn_subscribe']         = 'Aboverwaltung';
+$lang['btn_profile']           = 'Benutzerprofil';
+$lang['btn_reset']             = 'Zurücksetzen';
+$lang['btn_resendpwd']         = 'Setze neues Passwort';
+$lang['btn_draft']             = 'Entwurf bearbeiten';
+$lang['btn_recover']           = 'Entwurf wiederherstellen';
+$lang['btn_draftdel']          = 'Entwurf löschen';
+$lang['btn_revert']            = 'Wiederherstellen';
+$lang['btn_register']          = 'Registrieren';
+$lang['btn_apply']             = 'Übernehmen';
+$lang['btn_media']             = 'Medien-Manager';
+$lang['btn_deleteuser']        = 'Benutzerprofil löschen';
+$lang['btn_img_backto']        = 'Zurück zu %s';
+$lang['btn_mediaManager']      = 'Im Medien-Manager anzeigen';
+$lang['loggedinas']            = 'Angemeldet als:';
+$lang['user']                  = 'Benutzername';
+$lang['pass']                  = 'Passwort';
+$lang['newpass']               = 'Neues Passwort';
+$lang['oldpass']               = 'Bestätigen (Altes Passwort)';
+$lang['passchk']               = 'Passwort erneut eingeben';
+$lang['remember']              = 'Angemeldet bleiben';
+$lang['fullname']              = 'Voller Name';
+$lang['email']                 = 'E-Mail';
+$lang['profile']               = 'Benutzerprofil';
+$lang['badlogin']              = 'Benutzername oder Passwort sind falsch.';
+$lang['badpassconfirm']        = 'Das Passwort war falsch.';
+$lang['minoredit']             = 'kleine Änderung';
+$lang['draftdate']             = 'Entwurf gespeichert am';
+$lang['nosecedit']             = 'Diese Seite wurde in der Zwischenzeit geändert, der Seitenabschnitt ist veraltet, lade stattdessen volle Seite.';
+$lang['searchcreatepage']      = 'Falls der gesuchte Begriff nicht gefunden wurde, können Sie direkt eine neue, nach Ihrer Anfrage benannte Seite %s anlegen.';
+$lang['search_fullresults']    = 'Volltextergebnisse';
+$lang['js']['search_toggle_tools'] = 'Suchwerkzeuge umschalten';
+$lang['js']['willexpire']      = 'Die Sperre zur Bearbeitung dieser Seite läuft in einer Minute ab.\nUm Bearbeitungskonflikte zu vermeiden, sollten Sie sie durch einen Klick auf den Vorschau-Knopf verlängern.';
+$lang['js']['notsavedyet']     = 'Nicht gespeicherte Änderungen gehen verloren!';
+$lang['js']['searchmedia']     = 'Suche Dateien';
+$lang['js']['keepopen']        = 'Fenster nach Auswahl nicht schließen';
+$lang['js']['hidedetails']     = 'Details ausblenden';
+$lang['js']['mediatitle']      = 'Linkeinstellungen';
+$lang['js']['mediadisplay']    = 'Linktyp';
+$lang['js']['mediaalign']      = 'Ausrichtung';
+$lang['js']['mediasize']       = 'Bildgröße';
+$lang['js']['mediatarget']     = 'Linkziel';
+$lang['js']['mediaclose']      = 'Schließen';
+$lang['js']['mediainsert']     = 'Einfügen';
+$lang['js']['mediadisplayimg'] = 'Bild anzeigen.';
+$lang['js']['mediadisplaylnk'] = 'Nur den Link anzeigen.';
+$lang['js']['mediasmall']      = 'Kleine Version';
+$lang['js']['mediamedium']     = 'Mittlere Version';
+$lang['js']['medialarge']      = 'Große Version';
+$lang['js']['mediaoriginal']   = 'Originalversion';
+$lang['js']['medialnk']        = 'Link zur Detailseite';
+$lang['js']['mediadirect']     = 'Direktlink zum Original';
+$lang['js']['medianolnk']      = 'Kein Link';
+$lang['js']['medianolink']     = 'Bild nicht verlinken';
+$lang['js']['medialeft']       = 'Das Bild links ausrichten.';
+$lang['js']['mediaright']      = 'Das Bild rechts ausrichten.';
+$lang['js']['mediacenter']     = 'Das Bild in der Mitte ausrichten.';
+$lang['js']['medianoalign']    = 'Keine Ausrichtung benutzen.';
+$lang['js']['nosmblinks']      = 'Das Verlinken von Windows-Freigaben funktioniert nur im Microsoft Internet Explorer.\nDer Link kann jedoch durch Kopieren und Einfügen verwendet werden.';
+$lang['js']['linkwiz']         = 'Link-Assistent';
+$lang['js']['linkto']          = 'Link nach:';
+$lang['js']['del_confirm']     = 'Eintrag wirklich löschen?';
+$lang['js']['restore_confirm'] = 'Wirklich diese Version wiederherstellen?';
+$lang['js']['media_diff']      = 'Unterschiede anzeigen:';
+$lang['js']['media_diff_both'] = 'Nebeneinander';
+$lang['js']['media_diff_opacity'] = 'Überblenden';
+$lang['js']['media_diff_portions'] = 'Übergang';
+$lang['js']['media_select']    = 'Dateien auswählen…';
+$lang['js']['media_upload_btn'] = 'Hochladen';
+$lang['js']['media_done_btn']  = 'Fertig';
+$lang['js']['media_drop']      = 'Dateien hier hinziehen um sie hochzuladen';
+$lang['js']['media_cancel']    = 'Entfernen';
+$lang['js']['media_overwrt']   = 'Existierende Dateien überschreiben';
+$lang['search_exact_match']    = 'genaue Treffer';
+$lang['search_starts_with']    = 'beginnt mit';
+$lang['search_ends_with']      = 'endet mit';
+$lang['search_contains']       = 'enthält';
+$lang['search_custom_match']   = 'angepasst ';
+$lang['search_any_ns']         = 'alle Kategorien';
+$lang['search_any_time']       = 'jederzeit';
+$lang['search_past_7_days']    = 'letzte Woche';
+$lang['search_past_month']     = 'letzter Monat';
+$lang['search_past_year']      = 'letztes Jahr';
+$lang['search_sort_by_hits']   = 'Sortiere nach Treffer';
+$lang['search_sort_by_mtime']  = 'Sortiere nach letzter Änderung';
+$lang['regmissing']            = 'Bitte alle Felder ausfüllen!';
+$lang['reguexists']            = 'Der Benutzername existiert leider schon.';
+$lang['regsuccess']            = 'Der neue Benutzer wurde angelegt und das Passwort per E-Mail versandt.';
+$lang['regsuccess2']           = 'Der neue Benutzer wurde angelegt.';
+$lang['regfail']               = 'Der Benutzer konnte nicht angelegt werden.';
+$lang['regmailfail']           = 'Offenbar ist ein Fehler beim Versenden der Passwort-E-Mail aufgetreten. Bitte wenden Sie sich an den Wiki-Admin.';
+$lang['regbadmail']            = 'Die angegebene E-Mail-Adresse scheint ungültig zu sein. Falls dies ein Fehler ist, wenden Sie sich bitte an den Wiki-Admin.';
+$lang['regbadpass']            = 'Die beiden eingegeben Passwörter stimmen nicht überein. Bitte versuchen Sie es noch einmal.';
+$lang['regpwmail']             = 'Ihr DokuWiki-Passwort';
+$lang['reghere']               = 'Sie haben noch keinen Zugang? Hier registrieren';
+$lang['profna']                = 'Änderung des Benutzerprofils in diesem Wiki nicht möglich.';
+$lang['profnochange']          = 'Keine Änderungen, nichts zu tun.';
+$lang['profnoempty']           = 'Es muss ein Name und eine E-Mail-Adresse angegeben werden.';
+$lang['profchanged']           = 'Benutzerprofil erfolgreich geändert.';
+$lang['profnodelete']          = 'Dieses Wiki unterstützt kein Löschen von Benutzern.';
+$lang['profdeleteuser']        = 'Benutzerprofil löschen';
+$lang['profdeleted']           = 'Ihr Benutzerprofil wurde im Wiki gelöscht.';
+$lang['profconfdelete']        = 'Ich möchte mein Benutzerprofil löschen.<br/> Diese Aktion lässt sich nicht rückgängig machen,';
+$lang['profconfdeletemissing'] = 'Bestätigung in Kontrollkästchen fehlt';
+$lang['proffail']              = 'Das Benutzerkonto konnte nicht aktualisiert werden.';
+$lang['pwdforget']             = 'Passwort vergessen? Fordern Sie ein neues an';
+$lang['resendna']              = 'Passwörter versenden ist in diesem Wiki nicht möglich.';
+$lang['resendpwd']             = 'Neues Passwort setzen für';
+$lang['resendpwdmissing']      = 'Es tut mir leid, aber Sie müssen alle Felder ausfüllen.';
+$lang['resendpwdnouser']       = 'Es tut mir leid, aber der Benutzer existiert nicht in unserer Datenbank.';
+$lang['resendpwdbadauth']      = 'Es tut mir leid, aber dieser Authentifizierungscode ist ungültig. Stellen Sie sicher, dass Sie den kompletten Bestätigungslink verwendet haben.';
+$lang['resendpwdconfirm']      = 'Ein Bestätigungslink wurde per E-Mail versandt.';
+$lang['resendpwdsuccess']      = 'Ihr neues Passwort wurde per E-Mail versandt.';
+$lang['license']               = 'Falls nicht anders bezeichnet, ist der Inhalt dieses Wikis unter der folgenden Lizenz veröffentlicht:';
+$lang['licenseok']             = 'Hinweis: Durch das Bearbeiten dieser Seite geben Sie Ihr Einverständnis, dass Ihr Inhalt unter der folgenden Lizenz veröffentlicht wird:';
+$lang['searchmedia']           = 'Suche Dateinamen:';
+$lang['searchmedia_in']        = 'Suche in %s';
+$lang['txt_upload']            = 'Datei zum Hochladen auswählen:';
+$lang['txt_filename']          = 'Hochladen als (optional):';
+$lang['txt_overwrt']           = 'Bestehende Datei überschreiben';
+$lang['maxuploadsize']         = 'Max. %s pro Datei-Upload.';
+$lang['lockedby']              = 'Momentan gesperrt von:';
+$lang['lockexpire']            = 'Sperre läuft ab am:';
+$lang['rssfailed']             = 'Es ist ein Fehler beim Laden des Feeds aufgetreten: ';
+$lang['nothingfound']          = 'Nichts gefunden.';
+$lang['mediaselect']           = 'Dateiauswahl';
+$lang['uploadsucc']            = 'Datei wurde erfolgreich hochgeladen';
+$lang['uploadfail']            = 'Hochladen fehlgeschlagen. Keine Berechtigung?';
+$lang['uploadwrong']           = 'Hochladen verweigert. Diese Dateiendung ist nicht erlaubt.';
+$lang['uploadexist']           = 'Datei existiert bereits. Keine Änderungen vorgenommen.';
+$lang['uploadbadcontent']      = 'Die hochgeladenen Daten stimmen nicht mit der Dateiendung %s überein.';
+$lang['uploadspam']            = 'Hochladen verweigert: Treffer auf der Spamliste.';
+$lang['uploadxss']             = 'Hochladen verweigert: Daten scheinen Schadcode zu enthalten.';
+$lang['uploadsize']            = 'Die hochgeladene Datei war zu groß. (max. %s)';
+$lang['deletesucc']            = 'Die Datei "%s" wurde gelöscht.';
+$lang['deletefail']            = '"%s" konnte nicht gelöscht werden - prüfen Sie die Berechtigungen.';
+$lang['mediainuse']            = 'Die Datei "%s" wurde nicht gelöscht - sie wird noch verwendet.';
+$lang['namespaces']            = 'Namensräume';
+$lang['mediafiles']            = 'Vorhandene Dateien in';
+$lang['accessdenied']          = 'Diese Seite dürfen sie nicht sehen.';
+$lang['mediausage']            = 'Syntax zum Verwenden dieser Datei:';
+$lang['mediaview']             = 'Originaldatei öffnen';
+$lang['mediaroot']             = 'Wurzel';
+$lang['mediaupload']           = 'Laden Sie hier eine Datei in den momentanen Namensraum hoch. Um Unterordner zu erstellen, stellen Sie diese dem Dateinamen durch Doppelpunkt getrennt voran, nachdem Sie die Datei ausgewählt haben.';
+$lang['mediaextchange']        = 'Dateiendung von .%s nach .%s geändert!';
+$lang['reference']             = 'Verwendung von';
+$lang['ref_inuse']             = 'Diese Datei kann nicht gelöscht werden, da sie noch von folgenden Seiten benutzt wird:';
+$lang['ref_hidden']            = 'Einige Verweise sind auf Seiten, für die Sie keine Leseberechtigung haben.';
+$lang['hits']                  = 'Treffer';
+$lang['quickhits']             = 'Passende Seitennamen';
+$lang['toc']                   = 'Inhaltsverzeichnis';
+$lang['current']               = 'aktuell';
+$lang['yours']                 = 'Ihre Version';
+$lang['diff']                  = 'Zeige Unterschiede zu aktueller Version';
+$lang['diff2']                 = 'Zeige Unterschiede der ausgewählten Versionen';
+$lang['difflink']              = 'Link zu dieser Vergleichsansicht';
+$lang['diff_type']             = 'Unterschiede anzeigen:';
+$lang['diff_inline']           = 'Inline';
+$lang['diff_side']             = 'Nebeneinander';
+$lang['diffprevrev']           = 'Vorhergehende Überarbeitung';
+$lang['diffnextrev']           = 'Nächste  Überarbeitung';
+$lang['difflastrev']           = 'Letzte  Überarbeitung';
+$lang['diffbothprevrev']       = 'Beide Seiten der vorigen Revision';
+$lang['diffbothnextrev']       = 'Beide Seiten der Revision';
+$lang['line']                  = 'Zeile';
+$lang['breadcrumb']            = 'Zuletzt angesehen:';
+$lang['youarehere']            = 'Sie befinden sich hier:';
+$lang['lastmod']               = 'Zuletzt geändert:';
+$lang['by']                    = 'von';
+$lang['deleted']               = 'gelöscht';
+$lang['created']               = 'angelegt';
+$lang['restored']              = 'alte Version wiederhergestellt (%s)';
+$lang['external_edit']         = 'Externe Bearbeitung';
+$lang['summary']               = 'Zusammenfassung';
+$lang['noflash']               = 'Das <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> wird benötigt, um diesen Inhalt anzuzeigen.';
+$lang['download']              = 'Schnipsel herunterladen';
+$lang['tools']                 = 'Werkzeuge';
+$lang['user_tools']            = 'Benutzer-Werkzeuge';
+$lang['site_tools']            = 'Webseiten-Werkzeuge';
+$lang['page_tools']            = 'Seiten-Werkzeuge';
+$lang['skip_to_content']       = 'zum Inhalt springen';
+$lang['sidebar']               = 'Seitenleiste';
+$lang['mail_newpage']          = 'Neue Seite:';
+$lang['mail_changed']          = 'Seite geändert:';
+$lang['mail_subscribe_list']   = 'Geänderte Seiten im Namensraum:';
+$lang['mail_new_user']         = 'Neuer Benutzer:';
+$lang['mail_upload']           = 'Datei hochgeladen:';
+$lang['changes_type']          = 'Änderungen anzeigen von';
+$lang['pages_changes']         = 'Seiten';
+$lang['media_changes']         = 'Mediendateien';
+$lang['both_changes']          = 'Beides: Seiten- und Mediendateien';
+$lang['qb_bold']               = 'Fetter Text';
+$lang['qb_italic']             = 'Kursiver Text';
+$lang['qb_underl']             = 'Unterstrichener Text';
+$lang['qb_code']               = 'Code Text';
+$lang['qb_strike']             = 'Durchgestrichener Text';
+$lang['qb_h1']                 = 'Level 1 Überschrift';
+$lang['qb_h2']                 = 'Level 2 Überschrift';
+$lang['qb_h3']                 = 'Level 3 Überschrift';
+$lang['qb_h4']                 = 'Level 4 Überschrift';
+$lang['qb_h5']                 = 'Level 5 Überschrift';
+$lang['qb_h']                  = 'Überschrift';
+$lang['qb_hs']                 = 'Wähle die Überschrift';
+$lang['qb_hplus']              = 'Obere Überschrift';
+$lang['qb_hminus']             = 'Untere Überschrift';
+$lang['qb_hequal']             = 'Gleichzeilige Überschrift';
+$lang['qb_link']               = 'Interner Link';
+$lang['qb_extlink']            = 'Externer Link';
+$lang['qb_hr']                 = 'Horizontale Linie';
+$lang['qb_ol']                 = 'Nummerierter Listenpunkt';
+$lang['qb_ul']                 = 'Listenpunkt';
+$lang['qb_media']              = 'Bilder und andere Dateien hinzufügen (öffnet sich in einem neuen Fenster)';
+$lang['qb_sig']                = 'Unterschrift einfügen';
+$lang['qb_smileys']            = 'Smileys';
+$lang['qb_chars']              = 'Sonderzeichen';
+$lang['upperns']               = 'zum übergeordneten Namensraum springen';
+$lang['metaedit']              = 'Metadaten bearbeiten';
+$lang['metasaveerr']           = 'Die Metadaten konnten nicht gesichert werden';
+$lang['metasaveok']            = 'Metadaten gesichert';
+$lang['img_title']             = 'Titel:';
+$lang['img_caption']           = 'Bildunterschrift:';
+$lang['img_date']              = 'Datum:';
+$lang['img_fname']             = 'Dateiname:';
+$lang['img_fsize']             = 'Größe:';
+$lang['img_artist']            = 'FotografIn:';
+$lang['img_copyr']             = 'Copyright:';
+$lang['img_format']            = 'Format:';
+$lang['img_camera']            = 'Kamera:';
+$lang['img_keywords']          = 'Schlagwörter:';
+$lang['img_width']             = 'Breite:';
+$lang['img_height']            = 'Höhe:';
+$lang['subscr_subscribe_success'] = '%s hat nun Änderungen der Seite %s abonniert';
+$lang['subscr_subscribe_error'] = '%s kann die Änderungen der Seite %s nicht abonnieren';
+$lang['subscr_subscribe_noaddress'] = 'Weil Ihre E-Mail-Adresse fehlt, können Sie das Thema nicht abonnieren';
+$lang['subscr_unsubscribe_success'] = 'Das Abonnement von %s für die Seite %s wurde aufgelöst';
+$lang['subscr_unsubscribe_error'] = 'Das Abonnement von %s für die Seite %s konnte nicht aufgelöst werden';
+$lang['subscr_already_subscribed'] = '%s hat %s bereits abonniert';
+$lang['subscr_not_subscribed'] = '%s hat %s nicht abonniert';
+$lang['subscr_m_not_subscribed'] = 'Sie haben die aktuelle Seite und ihre Namensräume nicht abonniert.';
+$lang['subscr_m_new_header']   = 'Abonnement hinzufügen';
+$lang['subscr_m_current_header'] = 'Aktuelle Abonnements';
+$lang['subscr_m_unsubscribe']  = 'Löschen';
+$lang['subscr_m_subscribe']    = 'Abonnieren';
+$lang['subscr_m_receive']      = 'Benachrichtigung';
+$lang['subscr_style_every']    = 'E-Mail bei jeder Bearbeitung';
+$lang['subscr_style_digest']   = 'E-Mail-Zusammenfassung der Änderungen jeder Seite (Alle %.2f Tage)';
+$lang['subscr_style_list']     = 'Liste der geänderten Seiten (Alle %.2f Tage)';
+$lang['authtempfail']          = 'Benutzerüberprüfung momentan nicht möglich. Falls das Problem andauert, wenden Sie sich bitte an den Admin.';
+$lang['i_chooselang']          = 'Wählen Sie Ihre Sprache';
+$lang['i_installer']           = 'DokuWiki Installation';
+$lang['i_wikiname']            = 'Wiki-Name';
+$lang['i_enableacl']           = 'Zugangskontrolle (ACL) aktivieren (empfohlen)';
+$lang['i_superuser']           = 'Benutzername des Administrators';
+$lang['i_problems']            = 'Das Installationsprogramm hat unten aufgeführte Probleme festgestellt, die zunächst behoben werden müssen bevor Sie mit der Installation fortfahren können.';
+$lang['i_modified']            = 'Aus Sicherheitsgründen arbeitet dieses Skript nur mit einer neuen bzw. nicht modifizierten DokuWiki Installation. Sie sollten entweder alle Dateien noch einmal frisch installieren oder die <a href="http://dokuwiki.org/install">Dokuwiki-Installationsanleitung</a> konsultieren.';
+$lang['i_funcna']              = 'Die PHP-Funktion <code>%s</code> ist nicht verfügbar. Unter Umständen wurde sie von Ihrem Hoster deaktiviert?';
+$lang['i_phpver']              = 'Ihre PHP-Version <code>%s</code> ist niedriger als die benötigte Version <code>%s</code>. Bitte aktualisieren Sie Ihre PHP-Installation.';
+$lang['i_mbfuncoverload']      = 'Um DokuWiki zu starten muss mbstring.func_overload in php.ini ausgeschaltet sein.';
+$lang['i_permfail']            = '<code>%s</code> ist nicht durch DokuWiki beschreibbar. Sie müssen die Berechtigungen dieses Ordners ändern!';
+$lang['i_confexists']          = '<code>%s</code> existiert bereits';
+$lang['i_writeerr']            = '<code>%s</code> konnte nicht erzeugt werden. Sie sollten die Verzeichnis-/Datei-Rechte überprüfen und die Datei manuell anlegen.';
+$lang['i_badhash']             = 'Unbekannte oder modifizierte dokuwiki.php (Hash=<code>%s</code>)';
+$lang['i_badval']              = '<code>%s</code> - unerlaubter oder leerer Wert';
+$lang['i_success']             = 'Die Konfiguration wurde erfolgreich abgeschlossen. Sie können jetzt die install.php löschen. Ihr <a href="doku.php?id=wiki:welcome">neues DokuWiki</a> ist jetzt für Sie bereit.';
+$lang['i_failure']             = 'Es sind Fehler beim Schreiben der Konfigurationsdateien aufgetreten. Sie müssen diese von Hand beheben, bevor Sie Ihr <a href="doku.php?id=wiki:welcome">neues DokuWiki</a> nutzen können.';
+$lang['i_policy']              = 'Anfangseinstellungen der Zugangskontrolle (ACL)';
+$lang['i_pol0']                = 'Offenes Wiki (lesen, schreiben und hochladen für alle Benutzer)';
+$lang['i_pol1']                = 'Öffentliches Wiki (Lesen für alle, Schreiben und Hochladen nur für registrierte Benutzer)';
+$lang['i_pol2']                = 'Geschlossenes Wiki (Lesen, Schreiben und Hochladen nur für registrierte Benutzer)';
+$lang['i_allowreg']            = 'Benutzer dürfen sich registrieren';
+$lang['i_retry']               = 'Wiederholen';
+$lang['i_license']             = 'Bitte wählen Sie die Lizenz, unter die Sie Ihre Inhalte stellen möchten:';
+$lang['i_license_none']        = 'Lizensierungsinformation nicht anzeigen';
+$lang['i_pop_field']           = 'Bitte helfen Sie mit, DokuWiki zu verbessern:';
+$lang['i_pop_label']           = 'Einmal monatlich anonymisierte Nutzungsdaten an das DokuWiki-Entwicklerteam senden';
+$lang['recent_global']         = 'Im Moment sehen Sie die Änderungen im Namensraum <b>%s</b>. Sie können auch <a href="%s">die Änderungen im gesamten Wiki sehen</a>.';
+$lang['years']                 = 'vor %d Jahren';
+$lang['months']                = 'vor %d Monaten';
+$lang['weeks']                 = 'vor %d Wochen';
+$lang['days']                  = 'vor %d Tagen';
+$lang['hours']                 = 'vor %d Stunden';
+$lang['minutes']               = 'vor %d Minuten';
+$lang['seconds']               = 'vor %d Sekunden';
+$lang['wordblock']             = 'Ihre Bearbeitung wurde nicht gespeichert, da sie gesperrten Text enthielt (Spam).';
+$lang['media_uploadtab']       = 'Hochladen';
+$lang['media_searchtab']       = 'Suchen';
+$lang['media_file']            = 'Datei';
+$lang['media_viewtab']         = 'Anzeigen';
+$lang['media_edittab']         = 'Bearbeiten';
+$lang['media_historytab']      = 'Verlauf';
+$lang['media_list_thumbs']     = 'Vorschaubilder';
+$lang['media_list_rows']       = 'Reihen';
+$lang['media_sort_name']       = 'Name';
+$lang['media_sort_date']       = 'Datum';
+$lang['media_namespaces']      = 'Namensraum wählen';
+$lang['media_files']           = 'Dateien in %s';
+$lang['media_upload']          = 'In den <strong>%s</strong> Namensraum hochladen.';
+$lang['media_search']          = 'Im Namensraum <strong>%s</strong> suchen.';
+$lang['media_view']            = '%s';
+$lang['media_viewold']         = '%s in %s';
+$lang['media_edit']            = '%s bearbeiten';
+$lang['media_history']         = 'Versionsverlauf von %s.';
+$lang['media_meta_edited']     = 'Meta-Informationen bearbeitet';
+$lang['media_perm_read']       = 'Sie besitzen nicht die notwendigen Berechtigungen um die Datei anzuzeigen.';
+$lang['media_perm_upload']     = 'Sie besitzen nicht die notwendigen Berechtigungen um Dateien hochzuladen.';
+$lang['media_update']          = 'Neue Version hochladen';
+$lang['media_restore']         = 'Diese Version wiederherstellen';
+$lang['media_acl_warning']     = 'Diese Liste ist möglicherweise nicht vollständig. Versteckte und durch ACL gesperrte Seiten werden nicht angezeigt.';
+$lang['currentns']             = 'Aktueller Namensraum';
+$lang['searchresult']          = 'Suchergebnisse';
+$lang['plainhtml']             = 'HTML Klartext';
+$lang['wikimarkup']            = 'Wiki Markup';
+$lang['page_nonexist_rev']     = 'Die Seite exitiert nicht unter %s. Sie wurde aber unter <a href="%s">%s</a>';
+$lang['unable_to_parse_date']  = 'Parameter "%s" kann nicht geparsed werden.';
+$lang['email_signature_text']  = 'Diese E-Mail wurde erzeugt vom DokuWiki unter
+@DOKUWIKIURL@';
diff --git a/wiki/inc/lang/de/locked.txt b/wiki/inc/lang/de/locked.txt
new file mode 100644
index 0000000..97323ca
--- /dev/null
+++ b/wiki/inc/lang/de/locked.txt
@@ -0,0 +1,4 @@
+====== Seite gesperrt ======
+
+Diese Seite ist momentan von einem anderen Benutzer gesperrt. Warten Sie, bis dieser mit dem Bearbeiten fertig ist oder die Sperre abläuft.
+
diff --git a/wiki/inc/lang/de/login.txt b/wiki/inc/lang/de/login.txt
new file mode 100644
index 0000000..6698da6
--- /dev/null
+++ b/wiki/inc/lang/de/login.txt
@@ -0,0 +1,4 @@
+====== Anmelden ======
+
+Geben Sie Ihren Benutzernamen und Ihr Passwort in das Formular unten ein, um sich anzumelden. Bitte beachten Sie, dass dafür "Cookies" in den Sicherheitseinstellungen Ihres Browsers erlaubt sein müssen.
+
diff --git a/wiki/inc/lang/de/mailtext.txt b/wiki/inc/lang/de/mailtext.txt
new file mode 100644
index 0000000..5968a70
--- /dev/null
+++ b/wiki/inc/lang/de/mailtext.txt
@@ -0,0 +1,12 @@
+Eine Seite in Ihrem Wiki wurde geändert oder neu angelegt. Hier sind die Details:
+
+Datum          : @DATE@
+Browser        : @BROWSER@
+IP-Adresse     : @IPADDRESS@
+Hostname       : @HOSTNAME@
+Alte Version   : @OLDPAGE@
+Neue Version   : @NEWPAGE@
+Zusammenfassung: @SUMMARY@
+Benutzer       : @USER@
+
+@DIFF@
diff --git a/wiki/inc/lang/de/mailwrap.html b/wiki/inc/lang/de/mailwrap.html
new file mode 100644
index 0000000..7df0cdc
--- /dev/null
+++ b/wiki/inc/lang/de/mailwrap.html
@@ -0,0 +1,13 @@
+<html>
+<head>
+    <title>@TITLE@</title>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+</head>
+<body>
+
+@HTMLBODY@
+
+<br /><hr />
+<small>@EMAILSIGNATURE@</small>
+</body>
+</html>
diff --git a/wiki/inc/lang/de/newpage.txt b/wiki/inc/lang/de/newpage.txt
new file mode 100644
index 0000000..7871c67
--- /dev/null
+++ b/wiki/inc/lang/de/newpage.txt
@@ -0,0 +1,5 @@
+====== Dieses Thema existiert noch nicht ======
+
+Sie sind einem Link zu einer Seite gefolgt, die noch nicht existiert. Sie können die Seite mit dem Knopf **"[Seite anlegen]"** selbst anlegen und mit Inhalt füllen.
+
+
diff --git a/wiki/inc/lang/de/norev.txt b/wiki/inc/lang/de/norev.txt
new file mode 100644
index 0000000..8a9c692
--- /dev/null
+++ b/wiki/inc/lang/de/norev.txt
@@ -0,0 +1,4 @@
+====== Version existiert nicht ======
+
+Die angegebene Version des Dokuments wurde nicht gefunden. Benutzen Sie den **''[Ältere Versionen]''** Knopf,  um eine Liste aller verfügbaren Versionen dieses Dokuments zu erhalten.
+
diff --git a/wiki/inc/lang/de/password.txt b/wiki/inc/lang/de/password.txt
new file mode 100644
index 0000000..e6ab83c
--- /dev/null
+++ b/wiki/inc/lang/de/password.txt
@@ -0,0 +1,6 @@
+Hallo @FULLNAME@!
+
+Hier sind Ihre Benutzerdaten für @TITLE@ auf @DOKUWIKIURL@
+
+Benutzername: @LOGIN@
+Passwort    : @PASSWORD@
diff --git a/wiki/inc/lang/de/preview.txt b/wiki/inc/lang/de/preview.txt
new file mode 100644
index 0000000..b07ae50
--- /dev/null
+++ b/wiki/inc/lang/de/preview.txt
@@ -0,0 +1,5 @@
+====== Vorschau ======
+
+So wird Ihr Text später aussehen. Achtung: Der Text wurde noch **nicht gespeichert**!
+
+
diff --git a/wiki/inc/lang/de/pwconfirm.txt b/wiki/inc/lang/de/pwconfirm.txt
new file mode 100644
index 0000000..b571163
--- /dev/null
+++ b/wiki/inc/lang/de/pwconfirm.txt
@@ -0,0 +1,12 @@
+Hallo @FULLNAME@!
+
+Jemand hat ein neues Passwort für Ihren @TITLE@
+login auf @DOKUWIKIURL@ angefordert.
+
+Wenn Sie diese Änderung nicht angefordert haben, ignorieren Sie diese
+E-Mail einfach.
+
+Um die Anforderung zu bestätigen, folgen Sie bitte dem unten angegebenen
+Bestätigungslink.
+
+@CONFIRM@
diff --git a/wiki/inc/lang/de/read.txt b/wiki/inc/lang/de/read.txt
new file mode 100644
index 0000000..bc011d0
--- /dev/null
+++ b/wiki/inc/lang/de/read.txt
@@ -0,0 +1,2 @@
+Diese Seite ist nicht editierbar. Sie können den Quelltext sehen, jedoch nicht verändern. Kontaktieren Sie den Administrator, wenn Sie glauben, dass hier ein Fehler vorliegt.
+
diff --git a/wiki/inc/lang/de/recent.txt b/wiki/inc/lang/de/recent.txt
new file mode 100644
index 0000000..c05bbae
--- /dev/null
+++ b/wiki/inc/lang/de/recent.txt
@@ -0,0 +1,5 @@
+====== Letzte Änderungen ======
+
+Die folgenden Seiten wurden zuletzt geändert.
+
+
diff --git a/wiki/inc/lang/de/register.txt b/wiki/inc/lang/de/register.txt
new file mode 100644
index 0000000..f1ea30a
--- /dev/null
+++ b/wiki/inc/lang/de/register.txt
@@ -0,0 +1,4 @@
+====== Als neuer Benutzer registrieren ======
+
+Bitte füllen Sie alle Felder aus, um einen neuen Benutzer-Account in diesem Wiki anzulegen. Stellen Sie sicher, dass eine **gültige E-Mail-Adresse** angegeben wird - das Passwort wird an diese Adresse gesendet. Der Benutzername sollte aus einem Wort ohne Umlaute, Leer- oder Sonderzeichen bestehen.
+
diff --git a/wiki/inc/lang/de/registermail.txt b/wiki/inc/lang/de/registermail.txt
new file mode 100644
index 0000000..e19fb8f
--- /dev/null
+++ b/wiki/inc/lang/de/registermail.txt
@@ -0,0 +1,10 @@
+Ein neuer Benutzer hat sich registriert. Hier sind die Details:
+
+Benutzername : @NEWUSER@
+Voller Name  : @NEWNAME@
+E-Mail       : @NEWEMAIL@
+
+Date         : @DATE@
+Browser      : @BROWSER@
+IP-Address   : @IPADDRESS@
+Hostname     : @HOSTNAME@
diff --git a/wiki/inc/lang/de/resendpwd.txt b/wiki/inc/lang/de/resendpwd.txt
new file mode 100644
index 0000000..a63fd5d
--- /dev/null
+++ b/wiki/inc/lang/de/resendpwd.txt
@@ -0,0 +1,3 @@
+====== Neues Passwort anfordern ======
+
+Füllen Sie alle Felder unten aus, um ein neues Passwort für Ihren Zugang zu erhalten. Das neue Passwort wird an Ihre gespeicherte E-Mail-Adresse geschickt. Der Benutzername muss Ihrem Wiki-Benutzernamen entsprechen.
diff --git a/wiki/inc/lang/de/resetpwd.txt b/wiki/inc/lang/de/resetpwd.txt
new file mode 100644
index 0000000..a0a55c6
--- /dev/null
+++ b/wiki/inc/lang/de/resetpwd.txt
@@ -0,0 +1,4 @@
+====== Neues Passwort setzen  ======
+
+Bitte geben Sie ein neues Passwort für Ihren Wiki-Zugang ein.
+
diff --git a/wiki/inc/lang/de/revisions.txt b/wiki/inc/lang/de/revisions.txt
new file mode 100644
index 0000000..843c3f9
--- /dev/null
+++ b/wiki/inc/lang/de/revisions.txt
@@ -0,0 +1,4 @@
+====== Ältere Versionen ======
+
+Dies sind ältere Versionen der gewählten Seite. Um zu einer älteren Version zurückzukehren, wählen Sie die entsprechende Version aus, klicken auf **''[Diese Seite bearbeiten]''** und speichern Sie diese erneut ab.
+
diff --git a/wiki/inc/lang/de/searchpage.txt b/wiki/inc/lang/de/searchpage.txt
new file mode 100644
index 0000000..19fe84b
--- /dev/null
+++ b/wiki/inc/lang/de/searchpage.txt
@@ -0,0 +1,3 @@
+====== Suche ======
+
+Unten sind die Ergebnisse Ihrer Suche gelistet. @CREATEPAGEINFO@
diff --git a/wiki/inc/lang/de/showrev.txt b/wiki/inc/lang/de/showrev.txt
new file mode 100644
index 0000000..65f53c9
--- /dev/null
+++ b/wiki/inc/lang/de/showrev.txt
@@ -0,0 +1,2 @@
+**Dies ist eine alte Version des Dokuments!**
+----
diff --git a/wiki/inc/lang/de/stopwords.txt b/wiki/inc/lang/de/stopwords.txt
new file mode 100644
index 0000000..0487a94
--- /dev/null
+++ b/wiki/inc/lang/de/stopwords.txt
@@ -0,0 +1,125 @@
+# Die Wörter dieser Liste werden bei der Indexierung ignoriert. Jedes Wort steht in einer neuen Zeile.
+# Beachten Sie beim Bearbeiten der Datei darauf, dass Sie UNIX-Zeilenumbrüche verwenden (einfacher Zeilenumbruch).
+# Wörter, die kürzer als 3 Buchstaben sind, brauchen Sie nicht in die Liste mit aufnehmen. Diese werden automatisch ignoriert.
+# Diese Liste basiert auf der folgenden: http://www.ranks.nl/stopwords/
+aber
+als
+auch
+auf
+aus
+bei
+bin
+bis
+bist
+dadurch
+daher
+darum
+das
+daß
+dass
+dein
+deine
+dem
+den
+der
+des
+dessen
+deshalb
+die
+dies
+dieser
+dieses
+doch
+dort
+durch
+ein
+eine
+einem
+einen
+einer
+eines
+euer
+eure
+für
+hatte
+hatten
+hattest
+hattet
+hier
+hinter
+ich
+ihr
+ihre
+in
+im
+ist
+jede
+jedem
+jeden
+jeder
+jedes
+jener
+jenes
+jetzt
+kann
+kannst
+können
+könnt
+machen
+mein
+meine
+mit
+muß
+mußt
+musst
+müssen
+müßt
+nach
+nachdem
+nein
+nicht
+nun
+oder
+seid
+sein
+seine
+sich
+sie
+sind
+soll
+sollen
+sollst
+sollt
+sonst
+soweit
+sowie
+und
+unser
+unsere
+unter
+vom
+von
+vor
+um
+wann
+warum
+was
+weiter
+weitere
+wenn
+wer
+werde
+werden
+werdet
+weshalb
+wie
+wieder
+wieso
+wir
+wird
+wirst
+woher
+wohin
+zum
+zur
+über
diff --git a/wiki/inc/lang/de/subscr_digest.txt b/wiki/inc/lang/de/subscr_digest.txt
new file mode 100644
index 0000000..75d9236
--- /dev/null
+++ b/wiki/inc/lang/de/subscr_digest.txt
@@ -0,0 +1,16 @@
+Hallo!
+
+Die Seite @PAGE@ im @TITLE@ Wiki wurde bearbeitet.
+Übersicht der Änderungen:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Alte Revision: @OLDPAGE@
+Neue Revision: @NEWPAGE@
+
+Um das Abonnement für diese Seite aufzulösen, melden Sie sich im Wiki an
+@DOKUWIKIURL@, besuchen dann
+@SUBSCRIBE@
+und klicken auf den Link 'Aboverwaltung'.
diff --git a/wiki/inc/lang/de/subscr_form.txt b/wiki/inc/lang/de/subscr_form.txt
new file mode 100644
index 0000000..4ba6afb
--- /dev/null
+++ b/wiki/inc/lang/de/subscr_form.txt
@@ -0,0 +1,3 @@
+====== Abonnementverwaltung ======
+
+Hier können Sie Ihre Abonnements für die aktuelle Seite oder den aktuellen [[doku>Namespaces|Namespace]] verwalten.
diff --git a/wiki/inc/lang/de/subscr_list.txt b/wiki/inc/lang/de/subscr_list.txt
new file mode 100644
index 0000000..1b2331a
--- /dev/null
+++ b/wiki/inc/lang/de/subscr_list.txt
@@ -0,0 +1,13 @@
+Hallo!
+
+Seite im Namensraum @PAGE@ im @TITLE@ Wiki wurden bearbeitet.
+Das sind die geänderten Seiten:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Um das Abonnement für diese Seite aufzulösen, melden Sie sich im Wiki an
+@DOKUWIKIURL@, besuchen dann
+@SUBSCRIBE@
+und klicken auf die Taste 'Änderungen abbestellen'.
diff --git a/wiki/inc/lang/de/subscr_single.txt b/wiki/inc/lang/de/subscr_single.txt
new file mode 100644
index 0000000..087ad5a
--- /dev/null
+++ b/wiki/inc/lang/de/subscr_single.txt
@@ -0,0 +1,19 @@
+Hallo!
+
+Die Seite @PAGE@ im @TITLE@ Wiki wurde bearbeitet.
+Übersicht der Änderungen:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Datum: @DATE@
+Benutzer: @USER@
+Zusammenfassung: @SUMMARY@
+Alte Revision: @OLDPAGE@
+Neue Revision: @NEWPAGE@
+
+Um das Abonnement für diese Seite aufzulösen, melden Sie sich im Wiki an
+@DOKUWIKIURL@, besuchen dann
+@SUBSCRIBE@
+und klicken auf die Taste 'Aboverwaltung'.
diff --git a/wiki/inc/lang/de/updateprofile.txt b/wiki/inc/lang/de/updateprofile.txt
new file mode 100644
index 0000000..f19dd13
--- /dev/null
+++ b/wiki/inc/lang/de/updateprofile.txt
@@ -0,0 +1,5 @@
+====== Benutzerprofil ändern ======
+
+Nur die Felder, die Sie ändern, werden aktualisiert. Alle anderen bleiben, wie sie sind. Ihren Benutzernamen können Sie jedoch nicht ändern.
+
+
diff --git a/wiki/inc/lang/de/uploadmail.txt b/wiki/inc/lang/de/uploadmail.txt
new file mode 100644
index 0000000..3646bcc
--- /dev/null
+++ b/wiki/inc/lang/de/uploadmail.txt
@@ -0,0 +1,11 @@
+Eine Datei wurde in Ihrem Wiki hochgeladen. Hier sind die Details:
+
+Datei       : @MEDIA@
+Alte Version: @OLD@
+Datum       : @DATE@
+Browser     : @BROWSER@
+IP-Adresse  : @IPADDRESS@
+Hostname    : @HOSTNAME@
+Größe       : @SIZE@
+MIME-Typ    : @MIME@
+Benutzer    : @USER@
diff --git a/wiki/inc/lang/el/admin.txt b/wiki/inc/lang/el/admin.txt
new file mode 100644
index 0000000..729004b
--- /dev/null
+++ b/wiki/inc/lang/el/admin.txt
@@ -0,0 +1,3 @@
+====== Διαχείριση ======
+
+Παρακάτω μπορείτε να βρείτε μια λίστα με τις λειτουργίες διαχείρισης στο DokuWiki
diff --git a/wiki/inc/lang/el/adminplugins.txt b/wiki/inc/lang/el/adminplugins.txt
new file mode 100644
index 0000000..ef1a285
--- /dev/null
+++ b/wiki/inc/lang/el/adminplugins.txt
@@ -0,0 +1 @@
+===== Πρόσθετα =====
\ No newline at end of file
diff --git a/wiki/inc/lang/el/backlinks.txt b/wiki/inc/lang/el/backlinks.txt
new file mode 100644
index 0000000..572f857
--- /dev/null
+++ b/wiki/inc/lang/el/backlinks.txt
@@ -0,0 +1,3 @@
+====== Σύνδεσμοι προς την τρέχουσα σελίδα ======
+
+Οι παρακάτω σελίδες περιέχουν συνδέσμους προς την τρέχουσα σελίδα.
\ No newline at end of file
diff --git a/wiki/inc/lang/el/conflict.txt b/wiki/inc/lang/el/conflict.txt
new file mode 100644
index 0000000..a2065c0
--- /dev/null
+++ b/wiki/inc/lang/el/conflict.txt
@@ -0,0 +1,8 @@
+====== Υπάρχει μία νεώτερη έκδοση αυτής της σελίδας ======
+
+Υπάρχει μία νεώτερη έκδοση της σελίδας που τρoποποιήσατε. 
+Αυτό συμβαίνει εάν κάποιος άλλος χρήστης τροποποίησε την ίδια σελίδα ενώ την επεξεργαζόσασταν και εσείς.
+
+Ελέγξτε προσεκτικά τις διαφορές που παρουσιάζονται παρακάτω και έπειτα αποφασίστε ποια έκδοση θα κρατήσετε.
+Εάν επιλέξετε ''Αποθήκευση'', η δική σας έκδοση θα αποθηκευτεί. 
+Εάν επιλέξετε ''Ακύρωση'', η νεώτερη έκδοση θα διατηρηθεί ως τρέχουσα.
diff --git a/wiki/inc/lang/el/denied.txt b/wiki/inc/lang/el/denied.txt
new file mode 100644
index 0000000..25fcbe8
--- /dev/null
+++ b/wiki/inc/lang/el/denied.txt
@@ -0,0 +1,4 @@
+====== Μη επιτρεπτή ενέργεια ======
+
+Συγγνώμη, αλλά δεν έχετε επαρκή δικαιώματα για την συγκεκριμένη ενέργεια.
+
diff --git a/wiki/inc/lang/el/diff.txt b/wiki/inc/lang/el/diff.txt
new file mode 100644
index 0000000..dde065b
--- /dev/null
+++ b/wiki/inc/lang/el/diff.txt
@@ -0,0 +1,3 @@
+====== Σύγκριση εκδόσεων ======
+
+Εδώ βλέπετε τις διαφορές μεταξύ της επιλεγμένης έκδοσης και της τρέχουσας έκδοσης της σελίδας.
diff --git a/wiki/inc/lang/el/draft.txt b/wiki/inc/lang/el/draft.txt
new file mode 100644
index 0000000..5ca7b8d
--- /dev/null
+++ b/wiki/inc/lang/el/draft.txt
@@ -0,0 +1,9 @@
+====== Βρέθηκε μία αυτόματα αποθηκευμένη σελίδα ======
+
+Η τελευταία τροποποίηση αυτής της σελίδας δεν ολοκληρώθηκε επιτυχώς. 
+Η εφαρμογή αποθήκευσε αυτόματα μία εκδοχή της σελίδας την ώρα που την επεξεργαζόσασταν και μπορείτε να την χρησιμοποιήσετε για να συνεχίσετε την εργασία σας.
+Παρακάτω φαίνεται αυτή η πιο πρόσφατη αυτόματα αποθηκευμένη σελίδα.
+
+Μπορείτε να //επαναφέρετε// αυτή την αυτόματα αποθηκευμένη σελίδα ως τρέχουσα, να την //διαγράψετε// ή να //ακυρώσετε// τη διαδικασία τροποποίησης της τρέχουσας σελίδας.
+
+
diff --git a/wiki/inc/lang/el/edit.txt b/wiki/inc/lang/el/edit.txt
new file mode 100644
index 0000000..8d9559f
--- /dev/null
+++ b/wiki/inc/lang/el/edit.txt
@@ -0,0 +1,3 @@
+Τροποποιήστε την σελίδα **μόνο** εάν μπορείτε να την **βελτιώσετε**. 
+Για να κάνετε δοκιμές με ασφάλεια ή να εξοικειωθείτε με το περιβάλλον χρησιμοποιήστε το [[:playground:playground|playground]]. 
+Αφού τροποποιήστε την σελίδα επιλέξτε ''Αποθήκευση''. Δείτε τις [[:wiki:syntax|οδηγίες]] για την σωστή σύνταξη.
diff --git a/wiki/inc/lang/el/editrev.txt b/wiki/inc/lang/el/editrev.txt
new file mode 100644
index 0000000..ac6bc5a
--- /dev/null
+++ b/wiki/inc/lang/el/editrev.txt
@@ -0,0 +1,2 @@
+**Φορτώσατε μια παλαιότερη έκδοση της σελίδας!** Εάν την αποθηκεύσετε, θα αντικαταστήσει την τρέχουσα έκδοση.
+----
\ No newline at end of file
diff --git a/wiki/inc/lang/el/index.txt b/wiki/inc/lang/el/index.txt
new file mode 100644
index 0000000..e2da3a8
--- /dev/null
+++ b/wiki/inc/lang/el/index.txt
@@ -0,0 +1,3 @@
+====== Κατάλογος ======
+
+Εδώ βλέπετε τον κατάλογο όλων των διαθέσιμων σελίδων, ταξινομημένες κατά [[doku>namespaces|φακέλους]].
diff --git a/wiki/inc/lang/el/install.html b/wiki/inc/lang/el/install.html
new file mode 100644
index 0000000..c99a02f
--- /dev/null
+++ b/wiki/inc/lang/el/install.html
@@ -0,0 +1,26 @@
+<p>Αυτή η σελίδα περιέχει πληροφορίες που βοηθούν στην αρχική εγκατάσταση και
+ρύθμιση της εφαρμογής <a href="http://www.dokuwiki.org/el:dokuwiki">Dokuwiki</a>.
+Περισσότερες πληροφορίες υπάρχουν στη <a href="http://www.dokuwiki.org/el:installer">
+σελίδα τεκμηρίωσης</a> του οδηγού εγκατάστασης.</p>
+
+<p>Η εφαρμογή DokuWiki χρησιμοποιεί απλά αρχεία για να αποθηκεύει τις σελίδες
+wiki καθώς και πληροφορίες που σχετίζονται με αυτές (π.χ. εικόνες, καταλόγους
+αναζήτησης, παλαιότερες εκδόσεις σελίδων, κλπ). Για να λειτουργεί σωστά η εφαρμογή
+DokuWiki <strong>πρέπει</strong> να έχει δικαιώματα εγγραφής στους φακέλους που
+φιλοξενούν αυτά τα αρχεία. Ο οδηγός εγκατάστασης δεν έχει την δυνατότητα να
+παραχωρήσει αυτά τα δικαιώματα εγγραφής στους σχετικούς φακέλους. Ο κανονικός
+τρόπος για να γίνει αυτό είναι είτε απευθείας σε περιβάλλον γραμμής εντολών ή,
+εάν δεν έχετε τέτοια πρόσβαση, μέσω FTP ή του πίνακα ελέγχου του περιβάλλοντος
+φιλοξενίας (π.χ. cPanel).</p>
+
+<p>Ο οδηγός εγκατάστασης θα ρυθμίσει την εφαρμογή DokuWiki ώστε να χρησιμοποιεί
+<abbr title="access control list">ACL</abbr>, με τρόπο ώστε ο διαχειριστής
+να έχει δυνατότητα εισόδου και πρόσβαση στο μενού διαχείρισης της εφαρμογής για
+εγκατάσταση επεκτάσεων, διαχείριση χρηστών, διαχείριση δικαιωμάτων πρόσβασης στις
+διάφορες σελίδες και αλλαγή των ρυθμίσεων. Αυτό δεν είναι απαραίτητο για να
+λειτουργήσει η εφαρμογή, αλλά κάνει την διαχείρισή της ευκολότερη.</p>
+
+<p>Οι έμπειροι χρήστες και οι χρήστες με ειδικές απαιτήσεις μπορούν να επισκεφθούν
+τις σελίδες που περιέχουν λεπτομερείς <a href="http://dokuwiki.org/install">
+οδηγίες εγκατάστασης</a> και <a href="http://dokuwiki.org/config">πληροφορίες
+για τις ρυθμίσεις</a>.</p>
\ No newline at end of file
diff --git a/wiki/inc/lang/el/jquery.ui.datepicker.js b/wiki/inc/lang/el/jquery.ui.datepicker.js
new file mode 100644
index 0000000..f08d6f2
--- /dev/null
+++ b/wiki/inc/lang/el/jquery.ui.datepicker.js
@@ -0,0 +1,37 @@
+/* Greek (el) initialisation for the jQuery UI date picker plugin. */
+/* Written by Alex Cicovic (http://www.alexcicovic.com) */
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "../widgets/datepicker" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery.datepicker );
+	}
+}( function( datepicker ) {
+
+datepicker.regional.el = {
+	closeText: "Κλείσιμο",
+	prevText: "Προηγούμενος",
+	nextText: "Επόμενος",
+	currentText: "Σήμερα",
+	monthNames: [ "Ιανουάριος","Φεβρουάριος","Μάρτιος","Απρίλιος","Μάιος","Ιούνιος",
+	"Ιούλιος","Αύγουστος","Σεπτέμβριος","Οκτώβριος","Νοέμβριος","Δεκέμβριος" ],
+	monthNamesShort: [ "Ιαν","Φεβ","Μαρ","Απρ","Μαι","Ιουν",
+	"Ιουλ","Αυγ","Σεπ","Οκτ","Νοε","Δεκ" ],
+	dayNames: [ "Κυριακή","Δευτέρα","Τρίτη","Τετάρτη","Πέμπτη","Παρασκευή","Σάββατο" ],
+	dayNamesShort: [ "Κυρ","Δευ","Τρι","Τετ","Πεμ","Παρ","Σαβ" ],
+	dayNamesMin: [ "Κυ","Δε","Τρ","Τε","Πε","Πα","Σα" ],
+	weekHeader: "Εβδ",
+	dateFormat: "dd/mm/yy",
+	firstDay: 1,
+	isRTL: false,
+	showMonthAfterYear: false,
+	yearSuffix: "" };
+datepicker.setDefaults( datepicker.regional.el );
+
+return datepicker.regional.el;
+
+} ) );
diff --git a/wiki/inc/lang/el/lang.php b/wiki/inc/lang/el/lang.php
new file mode 100644
index 0000000..4533f41
--- /dev/null
+++ b/wiki/inc/lang/el/lang.php
@@ -0,0 +1,338 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Thanos Massias <tm@thriasio.gr>
+ * @author Αθανάσιος Νταής <homunculus@wana.gr>
+ * @author Konstantinos Koryllos <koryllos@gmail.com>
+ * @author George Petsagourakis <petsagouris@gmail.com>
+ * @author Petros Vidalis <pvidalis@gmail.com>
+ * @author Vasileios Karavasilis vasileioskaravasilis@gmail.com
+ * @author Constantinos Xanthopoulos <conx@xanthopoulos.info>
+ * @author chris taklis <ctaklis@gmail.com>
+ * @author cross <cross1962@gmail.com>
+ * @author Zacharias Sdregas <zsdregas@sch.gr>
+ */
+$lang['encoding']              = 'utf-8';
+$lang['direction']             = 'ltr';
+$lang['doublequoteopening']    = '“';
+$lang['doublequoteclosing']    = '”';
+$lang['singlequoteopening']    = '‘';
+$lang['singlequoteclosing']    = '’';
+$lang['apostrophe']            = '’';
+$lang['btn_edit']              = 'Επεξεργασία σελίδας';
+$lang['btn_source']            = 'Προβολή κώδικα σελίδας';
+$lang['btn_show']              = 'Προβολή σελίδας';
+$lang['btn_create']            = 'Δημιουργία σελίδας';
+$lang['btn_search']            = 'Αναζήτηση';
+$lang['btn_save']              = 'Αποθήκευση';
+$lang['btn_preview']           = 'Προεπισκόπηση';
+$lang['btn_top']               = 'Επιστροφή στην κορυφή της σελίδας';
+$lang['btn_newer']             = '<< πρόσφατες';
+$lang['btn_older']             = 'παλαιότερες >>';
+$lang['btn_revs']              = 'Παλαιότερες εκδόσεις σελίδας';
+$lang['btn_recent']            = 'Πρόσφατες αλλαγές';
+$lang['btn_upload']            = 'Φόρτωση';
+$lang['btn_cancel']            = 'Ακύρωση';
+$lang['btn_index']             = 'Κατάλογος';
+$lang['btn_secedit']           = 'Επεξεργασία';
+$lang['btn_login']             = 'Σύνδεση χρήστη';
+$lang['btn_logout']            = 'Αποσύνδεση χρήστη';
+$lang['btn_admin']             = 'Διαχείριση';
+$lang['btn_update']            = 'Ενημέρωση';
+$lang['btn_delete']            = 'Σβήσιμο';
+$lang['btn_back']              = 'Πίσω';
+$lang['btn_backlink']          = 'Σύνδεσμοι προς αυτή τη σελίδα';
+$lang['btn_subscribe']         = 'Εγγραφή σε λήψη ενημερώσεων σελίδας';
+$lang['btn_profile']           = 'Επεξεργασία προφίλ';
+$lang['btn_reset']             = 'Ακύρωση';
+$lang['btn_resendpwd']         = 'Εισαγωγή νέου κωδικού';
+$lang['btn_draft']             = 'Επεξεργασία  αυτόματα αποθηκευμένης σελίδας';
+$lang['btn_recover']           = 'Επαναφορά αυτόματα αποθηκευμένης σελίδας';
+$lang['btn_draftdel']          = 'Διαγραφή αυτόματα αποθηκευμένης σελίδας';
+$lang['btn_revert']            = 'Αποκατάσταση';
+$lang['btn_register']          = 'Εγγραφή';
+$lang['btn_apply']             = 'Εφαρμογή';
+$lang['btn_media']             = 'Διαχειριστής πολυμέσων';
+$lang['btn_deleteuser']        = 'Αφαίρεσε τον λογαριασμό μου';
+$lang['btn_img_backto']        = 'Επιστροφή σε %s';
+$lang['btn_mediaManager']      = 'Εμφάνιση στον διαχειριστή πολυμέσων';
+$lang['loggedinas']            = 'Συνδεδεμένος ως:';
+$lang['user']                  = 'Όνομα χρήστη';
+$lang['pass']                  = 'Κωδικός';
+$lang['newpass']               = 'Νέος κωδικός';
+$lang['oldpass']               = 'Επιβεβαίωση τρέχοντος κωδικού';
+$lang['passchk']               = 'ακόμη μια φορά';
+$lang['remember']              = 'Απομνημόνευση στοιχείων λογαριασμού';
+$lang['fullname']              = 'Ονοματεπώνυμο';
+$lang['email']                 = 'e-mail';
+$lang['profile']               = 'Προφίλ χρήστη';
+$lang['badlogin']              = 'Συγνώμη, το όνομα χρήστη ή ο κωδικός ήταν λανθασμένο.';
+$lang['badpassconfirm']        = 'Ο κωδικός που εισάγατε είναι λανθασμένος';
+$lang['minoredit']             = 'Ασήμαντες αλλαγές';
+$lang['draftdate']             = 'Αυτόματη αποθήκευση πρόχειρης σελίδας στις';
+$lang['nosecedit']             = 'Η σελίδα τροποποιήθηκε στο μεταξύ και τα στοιχεία της ενότητας δεν ήταν συγχρονισμένα, οπότε φορτώθηκε η πλήρης σελίδα.  ';
+$lang['regmissing']            = 'Πρέπει να συμπληρώσετε όλα τα πεδία.';
+$lang['reguexists']            = 'Αυτός ο λογαριασμός υπάρχει ήδη.';
+$lang['regsuccess']            = 'Ο λογαριασμός δημιουργήθηκε και ο κωδικός εστάλει με e-mail.';
+$lang['regsuccess2']           = 'Ο λογαριασμός δημιουργήθηκε.';
+$lang['regfail']               = 'Δεν έγινε η δημιουργία χρήστη.';
+$lang['regmailfail']           = 'Φαίνεται να υπάρχει πρόβλημα με την αποστολή του κωδικού μέσω e-mail. Παρακαλούμε επικοινωνήστε μαζί μας!';
+$lang['regbadmail']            = 'Η διεύθυνση e-mail δεν είναι έγκυρη - εάν πιστεύετε ότι αυτό είναι λάθος, επικοινωνήστε μαζί μας';
+$lang['regbadpass']            = 'Οι δύο κωδικοί δεν είναι ίδιοι, προσπαθήστε ξανά.';
+$lang['regpwmail']             = 'Ο κωδικός σας';
+$lang['reghere']               = 'Δεν έχετε λογαριασμό ακόμη? Δημιουργήστε έναν';
+$lang['profna']                = 'Αυτό το wiki δεν υποστηρίζει την επεξεργασία προφίλ.';
+$lang['profnochange']          = 'Καμία αλλαγή.';
+$lang['profnoempty']           = 'Δεν επιτρέπεται κενό όνομα χρήστη η κενή διεύθυνση email.';
+$lang['profchanged']           = 'Το προφίλ χρήστη τροποποιήθηκε επιτυχώς.';
+$lang['profnodelete']          = 'Το wiki δεν υποστηρίζει την διαγραφή χρηστών';
+$lang['profdeleteuser']        = 'Διαγραφή λογαριασμού';
+$lang['profdeleted']           = 'Ο λογαριασμός διαγράφηκε από αυτό το wiki';
+$lang['profconfdelete']        = 'Επιθυμώ να διαγράψω τον λογαριασμό μου από αυτό το wiki. <br/> Αυτή η επιλογή δεν μπορεί να αναιρεθεί.';
+$lang['profconfdeletemissing'] = 'Το κουμπί επιβεβαίωσης δεν πατήθηκε';
+$lang['proffail']              = 'Δεν ενημερώθηκε το προφίλ του χρήστη.';
+$lang['pwdforget']             = 'Ξεχάσατε το κωδικό σας; Αποκτήστε νέο.';
+$lang['resendna']              = 'Αυτό το wiki δεν υποστηρίζει την εκ\' νέου αποστολή κωδικών.';
+$lang['resendpwd']             = 'Εισαγωγή νέου ωδικού για';
+$lang['resendpwdmissing']      = 'Πρέπει να συμπληρώσετε όλα τα πεδία.';
+$lang['resendpwdnouser']       = 'Αυτός ο χρήστης δεν υπάρχει στα αρχεία μας.';
+$lang['resendpwdbadauth']      = 'Αυτός ο κωδικός ενεργοποίησης δεν είναι έγκυρος.';
+$lang['resendpwdconfirm']      = 'Ο σύνδεσμος προς την σελίδα ενεργοποίησης εστάλει με e-mail.';
+$lang['resendpwdsuccess']      = 'Ο νέος σας κωδικός εστάλη με e-mail.';
+$lang['license']               = 'Εκτός εάν αναφέρεται διαφορετικά, το περιεχόμενο σε αυτο το wiki διέπεται από την ακόλουθη άδεια:';
+$lang['licenseok']             = 'Σημείωση: Τροποποιώντας αυτή την σελίδα αποδέχεστε την διάθεση του υλικού σας σύμφωνα με την ακόλουθη άδεια:';
+$lang['searchmedia']           = 'Αναζήτηση αρχείου:';
+$lang['searchmedia_in']        = 'Αναζήτηση σε %s';
+$lang['txt_upload']            = 'Επιλέξτε αρχείο για φόρτωση:';
+$lang['txt_filename']          = 'Επιλέξτε νέο όνομα αρχείου (προαιρετικό):';
+$lang['txt_overwrt']           = 'Αντικατάσταση υπάρχοντος αρχείου';
+$lang['maxuploadsize']         = 'Μέγιστο μέγεθος αρχείου: %s.';
+$lang['lockedby']              = 'Προσωρινά κλειδωμένο από:';
+$lang['lockexpire']            = 'Το κλείδωμα λήγει στις:';
+$lang['js']['willexpire']      = 'Το κλείδωμά σας για την επεξεργασία αυτής της σελίδας θα λήξει σε ένα λεπτό.\n Για να το ανανεώσετε χρησιμοποιήστε την Προεπισκόπηση.';
+$lang['js']['notsavedyet']     = 'Οι μη αποθηκευμένες αλλαγές θα χαθούν.
+Θέλετε να συνεχίσετε;';
+$lang['js']['searchmedia']     = 'Αναζήτηση για αρχεία';
+$lang['js']['keepopen']        = 'Το παράθυρο να μην κλείνει';
+$lang['js']['hidedetails']     = 'Απόκρυψη λεπτομερειών';
+$lang['js']['mediatitle']      = 'Ρυθμίσεις συνδέσμων';
+$lang['js']['mediadisplay']    = 'Τύπος συνδέσμου';
+$lang['js']['mediaalign']      = 'Στοίχηση';
+$lang['js']['mediasize']       = 'Μέγεθος εικόνας';
+$lang['js']['mediatarget']     = 'Προορισμός συνδέσμου';
+$lang['js']['mediaclose']      = 'Κλείσιμο';
+$lang['js']['mediainsert']     = 'Εισαγωγή';
+$lang['js']['mediadisplayimg'] = 'Προβολή εικόνας.';
+$lang['js']['mediadisplaylnk'] = 'Προβολή μόνο του συνδέσμου.';
+$lang['js']['mediasmall']      = 'Μικρό μέγεθος';
+$lang['js']['mediamedium']     = 'Μεσαίο μέγεθος';
+$lang['js']['medialarge']      = 'Μεγάλο μέγεθος';
+$lang['js']['mediaoriginal']   = 'Αρχικό μέγεθος';
+$lang['js']['medialnk']        = 'Σύνδεσμος στην σελίδα λεπτομερειών';
+$lang['js']['mediadirect']     = 'Απευθείας σύνδεσμος στο αυθεντικό';
+$lang['js']['medianolnk']      = 'Χωρίς σύνδεσμο';
+$lang['js']['medianolink']     = 'Να μην γίνει σύνδεσμος η εικόνα';
+$lang['js']['medialeft']       = 'Αριστερή στοίχιση εικόνας.';
+$lang['js']['mediaright']      = 'Δεξιά στοίχιση εικόνας.';
+$lang['js']['mediacenter']     = 'Κέντρική στοίχιση εικόνας.';
+$lang['js']['medianoalign']    = 'Χωρίς στοίχηση.';
+$lang['js']['nosmblinks']      = 'Οι σύνδεσμοι προς Windows shares δουλεύουν μόνο στον Microsoft Internet Explorer.
+Μπορείτε πάντα να κάνετε αντιγραφή και επικόλληση του συνδέσμου.';
+$lang['js']['linkwiz']         = 'Αυτόματος Οδηγός Συνδέσμων';
+$lang['js']['linkto']          = 'Σύνδεση σε:';
+$lang['js']['del_confirm']     = 'Να διαγραφεί;';
+$lang['js']['restore_confirm'] = 'Θέλετε την επαναφορά σε αυτή την έκδοση;';
+$lang['js']['media_diff']      = 'Εμφάνιση διαφορών:';
+$lang['js']['media_diff_both'] = 'Δίπλα δίπλα';
+$lang['js']['media_diff_opacity'] = 'Επικάλυψη';
+$lang['js']['media_diff_portions'] = 'Κύλιση';
+$lang['js']['media_select']    = 'Επιλογή αρχείων...';
+$lang['js']['media_upload_btn'] = 'Φόρτωση';
+$lang['js']['media_done_btn']  = 'Ολοκλήρωση';
+$lang['js']['media_drop']      = 'Ρίξτε αρχεία εδώ για να τα φορτώσετε';
+$lang['js']['media_cancel']    = 'αφαίρεση';
+$lang['js']['media_overwrt']   = 'Αντικατάσταση υπάρχοντων αρχείων';
+$lang['rssfailed']             = 'Παρουσιάστηκε κάποιο σφάλμα κατά την ανάγνωση αυτού του feed: ';
+$lang['nothingfound']          = 'Δεν βρέθηκαν σχετικά αποτελέσματα.';
+$lang['mediaselect']           = 'Επιλογή Αρχείων';
+$lang['uploadsucc']            = 'Επιτυχής φόρτωση';
+$lang['uploadfail']            = 'Η μεταφόρτωση απέτυχε. Πιθανόν αυτό να οφείλεται στις ρυθμίσεις πρόσβασης του αρχείου.';
+$lang['uploadwrong']           = 'Η μεταφόρτωση δεν έγινε δεκτή. Δεν επιτρέπονται αρχεία αυτού του τύπου!';
+$lang['uploadexist']           = 'Το αρχείο ήδη υπάρχει. Δεν έγινε καμία αλλαγή.';
+$lang['uploadspam']            = 'Η μεταφόρτωση ακυρώθηκε από το φίλτρο spam.';
+$lang['uploadxss']             = 'Η μεταφόρτωση ακυρώθηκε λόγω πιθανού επικίνδυνου περιεχομένου.';
+$lang['uploadsize']            = 'Το αρχείο ήταν πολύ μεγάλο. (μέγιστο %s)';
+$lang['deletesucc']            = 'Το αρχείο "%s" διαγράφηκε.';
+$lang['deletefail']            = 'Το αρχείο "%s" δεν διαγράφηκε. Πιθανόν αυτό να οφείλεται στις ρυθμίσεις πρόσβασης του αρχείου.';
+$lang['mediainuse']            = 'Το αρχείο "%s" δεν διαγράφηκε - είναι ακόμα σε χρήση.';
+$lang['namespaces']            = 'Φάκελοι';
+$lang['mediafiles']            = 'Διαθέσιμα αρχεία σε';
+$lang['accessdenied']          = 'Δεν σας επιτρέπεται να δείτε αυτήν την σελίδα.';
+$lang['mediausage']            = 'Χρησιμοποιήστε την ακόλουθη σύνταξη για να παραθέσετε αυτό το αρχείο:';
+$lang['mediaview']             = 'Κανονική προβολή αρχείου';
+$lang['mediaroot']             = 'root';
+$lang['mediaupload']           = 'Φορτώστε ένα αρχείο στον τρέχοντα φάκελο. Για δημιουργία υπο-φακέλων, προσθέστε τους πριν από το όνομα του αρχείου, στο πεδίο "Αποθήκευση ως", χρησιμοποιώντας άνω-κάτω τελείες ως διαχωριστικά.';
+$lang['mediaextchange']        = 'Η επέκταση του αρχείου τροποποιήθηκε από .%s σε .%s!';
+$lang['reference']             = 'Αναφορές προς';
+$lang['ref_inuse']             = 'Το αρχείο δεν μπορεί να διαγραφεί, επειδή είναι ακόμη σε χρήση από τις ακόλουθες σελίδες:';
+$lang['ref_hidden']            = 'Μερικές αναφορές βρίσκονται σε σελίδες που δεν έχετε δικαίωμα να διαβάσετε';
+$lang['hits']                  = 'Αναφορές';
+$lang['quickhits']             = 'Σχετικές σελίδες';
+$lang['toc']                   = 'Πίνακας Περιεχομένων';
+$lang['current']               = 'τρέχουσα';
+$lang['yours']                 = 'Η έκδοσή σας';
+$lang['diff']                  = 'Προβολή διαφορών με την τρέχουσα έκδοση';
+$lang['diff2']                 = 'Προβολή διαφορών μεταξύ των επιλεγμένων εκδόσεων';
+$lang['difflink']              = 'Σύνδεσμος σε αυτή την προβολή διαφορών.';
+$lang['diff_type']             = 'Προβολή διαφορών:';
+$lang['diff_inline']           = 'Σε σειρά';
+$lang['diff_side']             = 'Δίπλα-δίπλα';
+$lang['diffprevrev']           = 'Προηγούμενη αναθεώρηση';
+$lang['diffnextrev']           = 'Επόμενη αναθεώρηση';
+$lang['difflastrev']           = 'Τελευταία αναθεώρηση';
+$lang['line']                  = 'Γραμμή';
+$lang['breadcrumb']            = 'Ιστορικό:';
+$lang['youarehere']            = 'Είστε εδώ:';
+$lang['lastmod']               = 'Τελευταία τροποποίηση:';
+$lang['by']                    = 'από';
+$lang['deleted']               = 'διαγράφηκε';
+$lang['created']               = 'δημιουργήθηκε';
+$lang['restored']              = 'παλαιότερη έκδοση επαναφέρθηκε (%s)';
+$lang['external_edit']         = 'εξωτερική τροποποίηση';
+$lang['summary']               = 'Επεξεργασία σύνοψης';
+$lang['noflash']               = 'Το <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> απαιτείται για την προβολή αυτού του στοιχείου.';
+$lang['download']              = 'Λήψη Κώδικα';
+$lang['tools']                 = 'Εργαλεία';
+$lang['user_tools']            = 'Εργαλεία Χρήστη';
+$lang['site_tools']            = 'Εργαλεία ιστότοπου';
+$lang['page_tools']            = 'Εργαλεία ιστοσελίδας';
+$lang['skip_to_content']       = 'παράληψη περιεχομένων';
+$lang['sidebar']               = 'Sidebar';
+$lang['mail_newpage']          = 'σελίδα προστέθηκε:';
+$lang['mail_changed']          = 'σελίδα τροποποιήθηκε:';
+$lang['mail_subscribe_list']   = 'σελίδες που άλλαξαν στον φάκελο:';
+$lang['mail_new_user']         = 'νέος χρήστης:';
+$lang['mail_upload']           = 'αρχείο φορτώθηκε:';
+$lang['changes_type']          = 'Εμφάνιση αλλαγών του';
+$lang['pages_changes']         = 'Σελίδες';
+$lang['media_changes']         = 'Αρχεία πολυμέσων';
+$lang['both_changes']          = 'Σελίδες και αρχεία πολυμέσων';
+$lang['qb_bold']               = 'Έντονο Κείμενο';
+$lang['qb_italic']             = 'Πλάγιο Κείμενο';
+$lang['qb_underl']             = 'Υπογραμμισμένο Κείμενο';
+$lang['qb_code']               = 'Κείμενο κώδικα';
+$lang['qb_strike']             = 'Διαγραμμισμένο Κείμενο';
+$lang['qb_h1']                 = 'Κεφαλίδα 1ου Επιπέδου';
+$lang['qb_h2']                 = 'Κεφαλίδα 2ου Επιπέδου';
+$lang['qb_h3']                 = 'Κεφαλίδα 3ου Επιπέδου';
+$lang['qb_h4']                 = 'Κεφαλίδα 4ου Επιπέδου';
+$lang['qb_h5']                 = 'Κεφαλίδα 5ου Επιπέδου';
+$lang['qb_h']                  = 'Κεφαλίδα';
+$lang['qb_hs']                 = 'Επιλογή Κεφαλίδας';
+$lang['qb_hplus']              = 'Μεγαλύτερη Κεφαλίδα';
+$lang['qb_hminus']             = 'Μικρότερη Κεφαλίδα';
+$lang['qb_hequal']             = 'Κεφαλίδα ίδιο μεγέθους';
+$lang['qb_link']               = 'Εσωτερικός Σύνδεσμος';
+$lang['qb_extlink']            = 'Εξωτερικός Σύνδεσμος';
+$lang['qb_hr']                 = 'Διαχωριστική Γραμμή';
+$lang['qb_ol']                 = 'Αριθμημένη Λίστα';
+$lang['qb_ul']                 = 'Λίστα';
+$lang['qb_media']              = 'Προσθήκη Αρχείων';
+$lang['qb_sig']                = 'Προσθήκη Υπογραφής';
+$lang['qb_smileys']            = 'Smileys';
+$lang['qb_chars']              = 'Ειδικοί Χαρακτήρες';
+$lang['upperns']               = 'πήγαινε στον μητρικό φάκελο';
+$lang['metaedit']              = 'Τροποποίηση metadata';
+$lang['metasaveerr']           = 'Η αποθήκευση των metadata απέτυχε';
+$lang['metasaveok']            = 'Επιτυχής αποθήκευση metadata';
+$lang['img_title']             = 'Τίτλος:';
+$lang['img_caption']           = 'Λεζάντα:';
+$lang['img_date']              = 'Ημερομηνία:';
+$lang['img_fname']             = 'Όνομα αρχείου:';
+$lang['img_fsize']             = 'Μέγεθος:';
+$lang['img_artist']            = 'Καλλιτέχνης:';
+$lang['img_copyr']             = 'Copyright:';
+$lang['img_format']            = 'Format:';
+$lang['img_camera']            = 'Camera:';
+$lang['img_keywords']          = 'Λέξεις-κλειδιά:';
+$lang['img_width']             = 'Πλάτος:';
+$lang['img_height']            = 'Ύψος:';
+$lang['subscr_subscribe_success'] = 'Ο/η %s προστέθηκε στην λίστα ειδοποιήσεων για το %s';
+$lang['subscr_subscribe_error'] = 'Σφάλμα κατά την προσθήκη του/της %s στην λίστα ειδοποιήσεων για το %s';
+$lang['subscr_subscribe_noaddress'] = 'Δεν υπάρχει διεύθυνση ταχυδρομείου συσχετισμένη με το όνομα χρήστη σας. Κατά συνέπεια δεν μπορείτε να προστεθείτε στην λίστα ειδοποιήσεων';
+$lang['subscr_unsubscribe_success'] = 'Ο/η %s, απομακρύνθηκε από την λίστα ειδοποιήσεων για το %s';
+$lang['subscr_unsubscribe_error'] = 'Σφάλμα κατά την απομάκρυνση του/της %s στην λίστα ειδοποιήσεων για το %s';
+$lang['subscr_already_subscribed'] = 'Ο/η %s είναι ήδη στην λίστα ειδοποίησης για το %s';
+$lang['subscr_not_subscribed'] = 'Ο/η %s δεν είναι στην λίστα ειδοποίησης για το %s';
+$lang['subscr_m_not_subscribed'] = 'Αυτήν την στιγμή, δεν είσαστε εγεγγραμμένος/η στην λίστα ειδοποίησης της τρέχουσας σελίδας ή φακέλου.';
+$lang['subscr_m_new_header']   = 'Προσθήκη στην λίστα ειδοποίησης';
+$lang['subscr_m_current_header'] = 'Τρέχουσες εγγραφές ειδοποιήσεων';
+$lang['subscr_m_unsubscribe']  = 'Διαγραφή';
+$lang['subscr_m_subscribe']    = 'Εγγραφή';
+$lang['subscr_m_receive']      = 'Λήψη';
+$lang['subscr_style_every']    = 'email σε κάθε αλλαγή';
+$lang['subscr_style_digest']   = 'συνοπτικό email αλλαγών της σελίδας (κάθε %.2f μέρες)';
+$lang['subscr_style_list']     = 'λίστα σελίδων με αλλαγές μετά από το τελευταίο email (κάθε %.2f μέρες)';
+$lang['authtempfail']          = 'Η συνδεση χρηστών είναι απενεργοποιημένη αυτή την στιγμή. Αν αυτό διαρκέσει για πολύ, παρακαλούμε ενημερώστε τον διαχειριστή του wiki.';
+$lang['i_chooselang']          = 'Επιλογή γλώσσας';
+$lang['i_installer']           = 'Οδηγός εγκατάστασης DokuWiki';
+$lang['i_wikiname']            = 'Ονομασία wiki';
+$lang['i_enableacl']           = 'Ενεργοποίηση Λίστας Δικαιωμάτων Πρόσβασης - ACL (συνίσταται)';
+$lang['i_superuser']           = 'Διαχειριστής';
+$lang['i_problems']            = 'Ο οδηγός εγκατάστασης συνάντησε τα προβλήματα που αναφέρονται παρακάτω. Η εγκατάσταση δεν θα ολοκληρωθεί επιτυχώς μέχρι να επιλυθούν αυτά τα προβλήματα.';
+$lang['i_modified']            = 'Για λόγους ασφαλείας, ο οδηγός εγκατάστασης λειτουργεί μόνο με νέες και μη τροποποιημένες εγκαταστάσεις Dokuwiki.
+Πρέπει είτε να κάνετε νέα εγκατάσταση, χρησιμοποιώντας το αρχικό πακέτο εγκατάστασης, ή να συμβουλευτείτε τις <a href="http://dokuwiki.org/el:install">οδηγίες εγκατάστασης της εφαρμογής</a>.';
+$lang['i_funcna']              = 'Η λειτουργία <code>%s</code> της PHP δεν είναι διαθέσιμη. Πιθανόν να είναι απενεργοποιημένη στις ρυθμίσεις έναρξης της PHP';
+$lang['i_phpver']              = 'Η έκδοση <code>%s</code> της PHP που έχετε είναι παλαιότερη της απαιτούμενης <code>%s</code>. Πρέπει να αναβαθμίσετε την PHP.';
+$lang['i_mbfuncoverload']      = 'Για να εκτελεστεί το Dokuwiki πρέπει να απενεργοποιήσετε τη ρύθμιση mbstring.func_overload στο αρχείο php.ini';
+$lang['i_permfail']            = 'Ο φάκελος <code>%s</code> δεν είναι εγγράψιμος από την εφαρμογή DokuWiki. Πρέπει να διορθώσετε τα δικαιώματα πρόσβασης αυτού του φακέλου!';
+$lang['i_confexists']          = '<code>%s</code> υπάρχει ήδη';
+$lang['i_writeerr']            = 'Δεν είναι δυνατή η δημιουργία του <code>%s</code>. Πρέπει να διορθώσετε τα δικαιώματα πρόσβασης αυτού του φακέλου/αρχείου και να δημιουργήσετε το αρχείο χειροκίνητα!';
+$lang['i_badhash']             = 'Μη αναγνωρίσιμο ή τροποποιημένο αρχείο dokuwiki.php (hash=<code>%s</code>)';
+$lang['i_badval']              = '<code>%s</code> - λάθος ή ανύπαρκτη τιμή';
+$lang['i_success']             = 'Η εγκατάσταση ολοκληρώθηκε επιτυχώς. Μπορείτε πλέον να διαγράψετε το αρχείο install.php. Συνεχίστε στο <a href="doku.php?id=wiki:welcome">νέο σας DokuWiki</a>.';
+$lang['i_failure']             = 'Εμφανίστηκαν κάποια προβλήματα στη διαδικασία ανανέωσης των αρχείων ρυθμίσεων. Πιθανόν να χρειάζεται να τα τροποποιήσετε χειροκίνητα ώστε να μπορείτε να χρησιμοποιήσετε το <a href="doku.php?id=wiki:welcome">νέο σας DokuWiki</a>.';
+$lang['i_policy']              = 'Αρχική πολιτική Λίστας Δικαιωμάτων Πρόσβασης - ACL';
+$lang['i_pol0']                = 'Ανοιχτό Wiki (όλοι μπορούν να διαβάσουν ή να δημιουργήσουν/τροποποιήσουν σελίδες και να μεταφορτώσουν αρχεία)';
+$lang['i_pol1']                = 'Δημόσιο Wiki (όλοι μπορούν να διαβάσουν σελίδες αλλά μόνο οι εγγεγραμμένοι χρήστες μπορούν να δημιουργήσουν/τροποποιήσουν σελίδες και να μεταφορτώσουν αρχεία)';
+$lang['i_pol2']                = 'Κλειστό Wiki (μόνο οι εγγεγραμμένοι χρήστες μπορούν να διαβάσουν ή να δημιουργήσουν/τροποποιήσουν σελίδες και να μεταφορτώσουν αρχεία)';
+$lang['i_allowreg']            = 'Οι χρήστες επιτρέπεται να εγγραφούν μόνοι τους';
+$lang['i_retry']               = 'Νέα προσπάθεια';
+$lang['i_license']             = 'Παρακαλώ επιλέξτε την άδεια που θα χρησιμοποιήσετε για την διάθεση του περιεχομένου σας:';
+$lang['recent_global']         = 'Βλέπετε τις αλλαγές εντός του φακέλου <b>%s</b>. Μπορείτε επίσης να <a href="%s">δείτε τις πρόσφατες αλλαγές σε όλο το wiki</a>.';
+$lang['years']                 = 'πριν %d χρόνια';
+$lang['months']                = 'πριν %d μήνες';
+$lang['weeks']                 = 'πριν %d εβδομάδες';
+$lang['days']                  = 'πριν %d ημέρες';
+$lang['hours']                 = 'πριν %d ώρες';
+$lang['minutes']               = 'πριν %d λεπτά';
+$lang['seconds']               = 'πριν %d δευτερόλεπτα';
+$lang['wordblock']             = 'Η αλλαγή σας δεν αποθηκεύτηκε γιατί περιείχε spam.';
+$lang['media_uploadtab']       = 'Φόρτωση';
+$lang['media_searchtab']       = 'Αναζήτηση';
+$lang['media_file']            = 'Αρχείο';
+$lang['media_viewtab']         = 'Εμφάνιση';
+$lang['media_edittab']         = 'Επεξεργασία';
+$lang['media_historytab']      = 'Ιστορικό';
+$lang['media_list_thumbs']     = 'Μικρογραφίες';
+$lang['media_list_rows']       = 'Γραμμές';
+$lang['media_sort_name']       = 'ανά όνομα';
+$lang['media_sort_date']       = 'ανά ημερομηνία';
+$lang['media_namespaces']      = 'Επιλογή namespace';
+$lang['media_files']           = 'Αρχεία στο %s φάκελο';
+$lang['media_upload']          = 'Φόρτωση στο <strong>%s</strong> φάκελο.';
+$lang['media_search']          = 'Αναζήτηση στο <strong>%s</strong> φάκελο.';
+$lang['media_view']            = '%s';
+$lang['media_viewold']         = '%s στα %s';
+$lang['media_edit']            = 'Επεξεργασία %s';
+$lang['media_history']         = 'Ιστορικό των %s';
+$lang['media_meta_edited']     = 'τα μεταδεδομένα επεξεργάστηκαν';
+$lang['media_perm_read']       = 'Συγνώμη, δεν έχετε επαρκή διακαιώματα για να διαβάσετε αυτά τα αρχεία.';
+$lang['media_perm_upload']     = 'Συγνώμη, δεν έχετε επαρκή διακαιώματα για να φορτώσετε αυτά τα αρχεία.';
+$lang['media_update']          = 'Φόρτωση νέας έκδοσης';
+$lang['media_restore']         = 'Επαναφορά αυτή της έκδοσης';
+$lang['searchresult']          = 'Αποτέλεσμα έρευνας';
+$lang['email_signature_text']  = 'Αυτό το e-mail δημιουργήθηκε αυτόματα από την εφαρμογή DokuWiki στην διεύθυνση
+@DOKUWIKIURL@';
diff --git a/wiki/inc/lang/el/locked.txt b/wiki/inc/lang/el/locked.txt
new file mode 100644
index 0000000..425c334
--- /dev/null
+++ b/wiki/inc/lang/el/locked.txt
@@ -0,0 +1,5 @@
+====== Κλειδωμένη σελίδα ======
+
+Αυτή η σελίδα είναι προς το παρόν δεσμευμένη για τροποποίηση από άλλον χρήστη. 
+Θα πρέπει να περιμένετε μέχρι ο συγκεκριμένος χρήστης να σταματήσει να την επεξεργάζεται ή να εκπνεύσει το χρονικό όριο για το σχετικό κλείδωμα.
+
diff --git a/wiki/inc/lang/el/login.txt b/wiki/inc/lang/el/login.txt
new file mode 100644
index 0000000..3021a19
--- /dev/null
+++ b/wiki/inc/lang/el/login.txt
@@ -0,0 +1,5 @@
+====== Σύνδεση χρήστη ======
+
+Αυτή την στιγμή δεν έχετε συνδεθεί ως χρήστης!
+Για να συνδεθείτε, εισάγετε τα στοιχεία σας στην παρακάτω φόρμα.
+Πρέπει να έχετε ενεργοποιήσει τα cookies στο πρόγραμμα περιήγηση σας.
diff --git a/wiki/inc/lang/el/mailtext.txt b/wiki/inc/lang/el/mailtext.txt
new file mode 100644
index 0000000..cc2a22f
--- /dev/null
+++ b/wiki/inc/lang/el/mailtext.txt
@@ -0,0 +1,13 @@
+Μία σελίδα προστέθηκε ή τροποποιήθηκε στο DokuWiki σας.
+Αυτά είναι τα αντίστοιχα στοιχεία:
+
+Ημερομηνία      : @DATE@
+Φυλλομετρητής   : @BROWSER@
+IP-Διεύθυνση    : @IPADDRESS@
+Όνομα υπολογιστή: @HOSTNAME@
+Παλιά έκδοση    : @OLDPAGE@
+Νέα έκδοση      : @NEWPAGE@
+Σύνοψη          : @SUMMARY@
+Χρήστης         : @USER@
+
+@DIFF@
diff --git a/wiki/inc/lang/el/mailwrap.html b/wiki/inc/lang/el/mailwrap.html
new file mode 100644
index 0000000..d257190
--- /dev/null
+++ b/wiki/inc/lang/el/mailwrap.html
@@ -0,0 +1,13 @@
+<html>
+<head>
+<title>@TITLE@</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+</head>
+<body>
+
+@HTMLBODY@
+
+<br /><hr />
+<small>@EMAILSIGNATURE@</small>
+</body>
+</html>
\ No newline at end of file
diff --git a/wiki/inc/lang/el/newpage.txt b/wiki/inc/lang/el/newpage.txt
new file mode 100644
index 0000000..3349ad9
--- /dev/null
+++ b/wiki/inc/lang/el/newpage.txt
@@ -0,0 +1,4 @@
+====== Αυτή η σελίδα δεν υπάρχει ακόμη ======
+
+Η σελίδα που ζητάτε δεν υπάρχει ακόμη. 
+Aν όμως έχετε επαρκή δικαιώματα, μπορείτε να την δημιουργήσετε επιλέγοντας ''Δημιουργία σελίδας''.
diff --git a/wiki/inc/lang/el/norev.txt b/wiki/inc/lang/el/norev.txt
new file mode 100644
index 0000000..2b13290
--- /dev/null
+++ b/wiki/inc/lang/el/norev.txt
@@ -0,0 +1,5 @@
+====== Αυτή η έκδοση δεν υπάρχει ======
+
+Η έκδοση που αναζητήσατε δεν υπάρχει. 
+Μπορείτε να δείτε λίστα με τις παλαιότερες εκδόσεις της τρέχουσας σελίδας πατώντας ''Παλαιότερες εκδόσεις σελίδας''.
+
diff --git a/wiki/inc/lang/el/password.txt b/wiki/inc/lang/el/password.txt
new file mode 100644
index 0000000..c664cb0
--- /dev/null
+++ b/wiki/inc/lang/el/password.txt
@@ -0,0 +1,6 @@
+@FULLNAME@!, γειά σας.
+
+Αυτά είναι τα στοιχεία εισόδου για το @TITLE@ στο @DOKUWIKIURL@
+
+Όνομα       : @LOGIN@
+Συνθηματικό : @PASSWORD@
diff --git a/wiki/inc/lang/el/preview.txt b/wiki/inc/lang/el/preview.txt
new file mode 100644
index 0000000..aef65c9
--- /dev/null
+++ b/wiki/inc/lang/el/preview.txt
@@ -0,0 +1,5 @@
+====== Προεπισκόπηση ======
+
+Αυτή είναι μια προεπισκόπηση του πως θα δείχνει η σελίδα. 
+Υπενθύμιση: Οι αλλαγές σας **δεν έχουν αποθηκευθεί** ακόμη!
+
diff --git a/wiki/inc/lang/el/pwconfirm.txt b/wiki/inc/lang/el/pwconfirm.txt
new file mode 100644
index 0000000..4c1559c
--- /dev/null
+++ b/wiki/inc/lang/el/pwconfirm.txt
@@ -0,0 +1,10 @@
+Γεια σας @FULLNAME@!
+
+Κάποιος ζήτησε τη δημιουργία νέου συνθηματικού για τον λογαριασμό @TITLE@
+που διατηρείτε στο @DOKUWIKIURL@
+
+Αν δεν ζητήσατε εσείς την δημιουργία νέου συνθηματικού απλά αγνοήστε αυτό το e-mail.
+
+Αν όντως εσείς ζητήσατε την δημιουργία νέου συνθηματικού, ακολουθήστε τον παρακάτω σύνδεσμο για να το επιβεβαιώσετε.
+
+@CONFIRM@
diff --git a/wiki/inc/lang/el/read.txt b/wiki/inc/lang/el/read.txt
new file mode 100644
index 0000000..a620ab5
--- /dev/null
+++ b/wiki/inc/lang/el/read.txt
@@ -0,0 +1,2 @@
+Μπορείτε να διαβάσετε αυτή την σελίδα αλλά δεν μπορείτε να την τροποποιήσετε. 
+Αν πιστεύετε ότι αυτό δεν είναι σωστό, απευθυνθείτε στον διαχειριστή της εφαρμογής.
diff --git a/wiki/inc/lang/el/recent.txt b/wiki/inc/lang/el/recent.txt
new file mode 100644
index 0000000..78c74a6
--- /dev/null
+++ b/wiki/inc/lang/el/recent.txt
@@ -0,0 +1,3 @@
+====== Πρόσφατες αλλαγές ======
+
+Οι παρακάτω σελίδες τροποποιήθηκαν πρόσφατα:
diff --git a/wiki/inc/lang/el/register.txt b/wiki/inc/lang/el/register.txt
new file mode 100644
index 0000000..6a4e963
--- /dev/null
+++ b/wiki/inc/lang/el/register.txt
@@ -0,0 +1,5 @@
+====== Εγγραφή νέου χρήστη ======
+
+Συμπληρώστε όλα τα παρακάτω πεδία για να δημιουργήσετε ένα νέο λογαριασμό σε αυτό το wiki.
+Πρέπει να δώσετε μια **υπαρκτή e-mail διεύθυνση** - ο κωδικός σας θα σας αποσταλεί σε αυτήν.
+Το όνομα χρήστη θα πρέπει να πληρεί τις ίδιες απαιτήσεις ονόματος που ισχύουν και για τους [[doku>el:pagename|φακέλους]].
diff --git a/wiki/inc/lang/el/registermail.txt b/wiki/inc/lang/el/registermail.txt
new file mode 100644
index 0000000..5266fc1
--- /dev/null
+++ b/wiki/inc/lang/el/registermail.txt
@@ -0,0 +1,10 @@
+Ένας νέος χρήστης εγγράφηκε. Ορίστε οι λεπτομέρειες:
+
+Χρήστης         : @NEWUSER@
+Όνομα           : @NEWNAME@
+e-mail          : @NEWEMAIL@
+
+Ημερομηνία      : @DATE@
+Φυλλομετρητής   : @BROWSER@
+IP-Διεύθυνση    : @IPADDRESS@
+Όνομα υπολογιστή: @HOSTNAME@
diff --git a/wiki/inc/lang/el/resendpwd.txt b/wiki/inc/lang/el/resendpwd.txt
new file mode 100644
index 0000000..6b4f3bb
--- /dev/null
+++ b/wiki/inc/lang/el/resendpwd.txt
@@ -0,0 +1,6 @@
+====== Αποστολή νέου κωδικού ======
+
+Συμπληρώστε όλα τα παρακάτω πεδία για να λάβετε ένα νέο κωδικό για τον λογαριασμό σας σε αυτό το wiki. 
+Ο νέος κωδικός σας θα σταλεί στην e-mail διεύθυνση που έχετε ήδη δηλώσει. 
+Το όνομα πρέπει να είναι αυτό που ισχύει για τον λογαριασμό σας σε αυτό το wiki.
+
diff --git a/wiki/inc/lang/el/resetpwd.txt b/wiki/inc/lang/el/resetpwd.txt
new file mode 100644
index 0000000..0d26d05
--- /dev/null
+++ b/wiki/inc/lang/el/resetpwd.txt
@@ -0,0 +1,3 @@
+====== Εισάγετε νέο κωδικό πρόσβασης ======
+
+Παρακαλούμε, εισάγετε έναν νέο κωδικό πρόσβασης για τον λογαριασμό σας.
\ No newline at end of file
diff --git a/wiki/inc/lang/el/revisions.txt b/wiki/inc/lang/el/revisions.txt
new file mode 100644
index 0000000..955fa17
--- /dev/null
+++ b/wiki/inc/lang/el/revisions.txt
@@ -0,0 +1,8 @@
+====== Παλαιότερες εκδόσεις σελίδας ======
+
+Οι παρακάτω είναι παλαιότερες εκδόσεις της τρέχουσας σελίδας. 
+Εάν θέλετε να αντικαταστήσετε την τρέχουσα σελίδα με κάποια από τις παλαιότερες εκδόσεις της κάντε τα παρακάτω:
+  * επιλέξτε την σχετική έκδοση
+  * επιλέξτε ''Τροποποίηση σελίδας''
+  * κάνετε τυχόν αλλαγές 
+  * αποθηκεύστε την
diff --git a/wiki/inc/lang/el/searchpage.txt b/wiki/inc/lang/el/searchpage.txt
new file mode 100644
index 0000000..c5bbbbf
--- /dev/null
+++ b/wiki/inc/lang/el/searchpage.txt
@@ -0,0 +1,4 @@
+====== Αναζήτηση ======
+
+Τα αποτελέσματα της αναζήτησής σας. @CREATEPAGEINFO@
+
diff --git a/wiki/inc/lang/el/showrev.txt b/wiki/inc/lang/el/showrev.txt
new file mode 100644
index 0000000..a6ba3f9
--- /dev/null
+++ b/wiki/inc/lang/el/showrev.txt
@@ -0,0 +1,2 @@
+**Βλέπετε μια παλαιότερη έκδοση της σελίδας!**
+----
diff --git a/wiki/inc/lang/el/stopwords.txt b/wiki/inc/lang/el/stopwords.txt
new file mode 100644
index 0000000..01d5103
--- /dev/null
+++ b/wiki/inc/lang/el/stopwords.txt
@@ -0,0 +1,103 @@
+# This is a list of words the indexer ignores, one word per line
+# When you edit this file be sure to use UNIX line endings (single newline)
+# No need to include words shorter than 3 chars - these are ignored anyway
+# This list is provided by Fotis Lazarinis based on his research found at: http://lazarinf.teimes.gr/papers/J8.pdf
+και
+ήταν
+το
+ενός
+να
+πολύ
+του
+όμως

+κατά
+της
+αυτή
+με
+όταν
+που
+μέσα
+την
+οποίο
+από
+πως
+για
+έτσι
+τα
+στους
+είναι
+μέσω
+των
+όλα
+σε
+καθώς
+ο
+αυτά
+οι
+προς
+στο
+ένας
+θα
+πριν
+τη
+μου
+στην
+όχι
+τον
+χωρίς
+τους
+επίσης
+δεν
+μεταξύ
+τις
+μέχρι
+ένα
+έναν
+μια
+μιας
+ότι
+αφού

+ακόμα
+στη
+όπου
+στα
+είχε
+μας
+δηλαδή
+αλλά
+τρόπος
+στον
+όσο
+στις
+ακόμη
+αυτό
+τόσο
+όπως
+έχουμε
+αν
+ώστε
+μπορεί
+αυτές
+μετά
+γιατί
+σας
+πάνω
+δύο
+τότε
+τι
+τώρα
+ως
+κάτι
+κάθε
+άλλο
+πρέπει
+μην
+πιο
+εδώ
+οποία
+είτε
+μόνο
+μη
+ενώ
\ No newline at end of file
diff --git a/wiki/inc/lang/el/subscr_digest.txt b/wiki/inc/lang/el/subscr_digest.txt
new file mode 100644
index 0000000..5ee54d3
--- /dev/null
+++ b/wiki/inc/lang/el/subscr_digest.txt
@@ -0,0 +1,16 @@
+Χαίρετε!
+
+Η σελίδα @PAGE@ στο @TITLE@ άλλαξε.
+Ορίστε οι αλλαγές:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Παλιά έκδοση: @OLDPAGE@
+Νέα έκδοση: @NEWPAGE@
+
+Για να σταματήσουν αυτές οι ειδοποιήσεις συνδεθείτε
+στο wiki στην διεύθυνση @DOKUWIKIURL@
+και στην συνέχεια επισκεφθείτε το @SUBSCRIBE@
+και διαγραφείτε από τις ειδοποιήσεις της σελίδας ή του φακέλου.
diff --git a/wiki/inc/lang/el/subscr_form.txt b/wiki/inc/lang/el/subscr_form.txt
new file mode 100644
index 0000000..c21a29a
--- /dev/null
+++ b/wiki/inc/lang/el/subscr_form.txt
@@ -0,0 +1,3 @@
+====== Διαχείριση Εγγραφών σε Ειδοποιήσεις ======
+
+Εδώ μπορείτε να διαχειριστείτε τις εγγραφές σας στις ειδοποιήσεις για αλλαγές στην τρέχουσα σελίδα και φάκελο.
\ No newline at end of file
diff --git a/wiki/inc/lang/el/subscr_list.txt b/wiki/inc/lang/el/subscr_list.txt
new file mode 100644
index 0000000..11ebf15
--- /dev/null
+++ b/wiki/inc/lang/el/subscr_list.txt
@@ -0,0 +1,16 @@
+Χαίρετε!
+
+Η σελίδα @PAGE@ στο @TITLE@ άλλαξε.
+
+Κάποιες σελίδες στον φάκελο @PAGE@ του wiki
+@TITLE@ έχουν αλλάξει.
+Ορίστε οι αλλαγμένες σελίδες:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Για να σταματήσουν αυτές οι ειδοποιήσεις συνδεθείτε στο wiki
+στην διεύθυνση @DOKUWIKIURL@
+και στην συνέχεια επισκεφθείτε το @SUBSCRIBE@
+και διαγραφείτε από τις ειδοποιήσεις της σελίδας ή του φακέλου.
diff --git a/wiki/inc/lang/el/subscr_single.txt b/wiki/inc/lang/el/subscr_single.txt
new file mode 100644
index 0000000..b67631c
--- /dev/null
+++ b/wiki/inc/lang/el/subscr_single.txt
@@ -0,0 +1,18 @@
+Χαίρετε!
+
+Η σελίδα @PAGE@ στο @TITLE@ άλλαξε.
+Ορίστε οι αλλαγές:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+Ημερομηνία : @DATE@
+Χρήστης : @USER@
+Περίληψη αλλαγών: @SUMMARY@
+Παλιά έκδοση: @OLDPAGE@
+Νέα έκδοση: @NEWPAGE@
+
+Για να σταματήσουν αυτές οι ειδοποιήσεις συνδεθείτε στο wiki
+στην διεύθυνση @DOKUWIKIURL@
+και στην συνέχεια επισκεφθείτε το @SUBSCRIBE@
+και διαγραφείτε από τις ειδοποιήσεις της σελίδας ή του φακέλου.
diff --git a/wiki/inc/lang/el/updateprofile.txt b/wiki/inc/lang/el/updateprofile.txt
new file mode 100644
index 0000000..56f176d
--- /dev/null
+++ b/wiki/inc/lang/el/updateprofile.txt
@@ -0,0 +1,4 @@
+====== Τροποποίηση προφίλ ======
+
+Τροποποιήστε **μόνο** τα πεδία που θέλετε να αλλάξετε. 
+Δεν μπορείτε να αλλάξετε το πεδίο ''Όνομα''.
diff --git a/wiki/inc/lang/el/uploadmail.txt b/wiki/inc/lang/el/uploadmail.txt
new file mode 100644
index 0000000..c9cfca9
--- /dev/null
+++ b/wiki/inc/lang/el/uploadmail.txt
@@ -0,0 +1,11 @@
+Ένα αρχείο φορτώθηκε στο DokuWiki σας.
+Αυτά είναι τα αντίστοιχα στοιχεία:
+
+Αρχείο          : @MEDIA@
+Ημερομηνία      : @DATE@
+Φυλλομετρητής   : @BROWSER@
+IP-Διεύθυνση    : @IPADDRESS@
+Όνομα υπολογιστή: @HOSTNAME@
+Μέγεθος         : @SIZE@
+MIME Type       : @MIME@
+Χρήστης         : @USER@
diff --git a/wiki/inc/lang/en/admin.txt b/wiki/inc/lang/en/admin.txt
new file mode 100644
index 0000000..cfd21b2
--- /dev/null
+++ b/wiki/inc/lang/en/admin.txt
@@ -0,0 +1,4 @@
+====== Administration ======
+
+Below you can find a list of administrative tasks available in DokuWiki.
+
diff --git a/wiki/inc/lang/en/adminplugins.txt b/wiki/inc/lang/en/adminplugins.txt
new file mode 100644
index 0000000..3ec46cf
--- /dev/null
+++ b/wiki/inc/lang/en/adminplugins.txt
@@ -0,0 +1,2 @@
+===== Additional Plugins =====
+
diff --git a/wiki/inc/lang/en/backlinks.txt b/wiki/inc/lang/en/backlinks.txt
new file mode 100644
index 0000000..5b40b84
--- /dev/null
+++ b/wiki/inc/lang/en/backlinks.txt
@@ -0,0 +1,4 @@
+====== Backlinks ======
+
+This is a list of pages that seem to link back to the current page.
+
diff --git a/wiki/inc/lang/en/conflict.txt b/wiki/inc/lang/en/conflict.txt
new file mode 100644
index 0000000..624f17b
--- /dev/null
+++ b/wiki/inc/lang/en/conflict.txt
@@ -0,0 +1,6 @@
+====== A newer version exists ======
+
+A newer version of the document you edited exists. This happens when another user changed the document while you were editing it.
+
+Examine the differences shown below thoroughly, then decide which version to keep. If you choose ''save'', your version will be saved. Hit ''cancel'' to keep the current version.
+
diff --git a/wiki/inc/lang/en/denied.txt b/wiki/inc/lang/en/denied.txt
new file mode 100644
index 0000000..34cb845
--- /dev/null
+++ b/wiki/inc/lang/en/denied.txt
@@ -0,0 +1,4 @@
+====== Permission Denied ======
+
+Sorry, you don't have enough rights to continue.
+
diff --git a/wiki/inc/lang/en/diff.txt b/wiki/inc/lang/en/diff.txt
new file mode 100644
index 0000000..934534d
--- /dev/null
+++ b/wiki/inc/lang/en/diff.txt
@@ -0,0 +1,4 @@
+====== Differences ======
+
+This shows you the differences between two versions of the page.
+
diff --git a/wiki/inc/lang/en/draft.txt b/wiki/inc/lang/en/draft.txt
new file mode 100644
index 0000000..e84d34a
--- /dev/null
+++ b/wiki/inc/lang/en/draft.txt
@@ -0,0 +1,6 @@
+====== Draft file found ======
+
+Your last edit session on this page was not completed correctly. DokuWiki automatically saved a draft during your work which you may now use to continue your editing. Below you can see the data that was saved from your last session.
+
+Please decide if you want to //recover// your lost edit session, //delete// the autosaved draft or //cancel// the editing process.
+
diff --git a/wiki/inc/lang/en/edit.txt b/wiki/inc/lang/en/edit.txt
new file mode 100644
index 0000000..48c9c29
--- /dev/null
+++ b/wiki/inc/lang/en/edit.txt
@@ -0,0 +1,2 @@
+Edit the page and hit ''Save''. See [[wiki:syntax]] for Wiki syntax. Please edit the page only if you can **improve** it. If you want to test some things, learn to make your first steps on the [[playground:playground|playground]].
+
diff --git a/wiki/inc/lang/en/editrev.txt b/wiki/inc/lang/en/editrev.txt
new file mode 100644
index 0000000..638216b
--- /dev/null
+++ b/wiki/inc/lang/en/editrev.txt
@@ -0,0 +1,2 @@
+**You've loaded an old revision of the document!** If you save it, you will create a new version with this data.
+----
diff --git a/wiki/inc/lang/en/index.txt b/wiki/inc/lang/en/index.txt
new file mode 100644
index 0000000..152911b
--- /dev/null
+++ b/wiki/inc/lang/en/index.txt
@@ -0,0 +1,4 @@
+====== Sitemap ======
+
+This is a sitemap over all available pages ordered by [[doku>namespaces|namespaces]].
+
diff --git a/wiki/inc/lang/en/install.html b/wiki/inc/lang/en/install.html
new file mode 100644
index 0000000..df2b699
--- /dev/null
+++ b/wiki/inc/lang/en/install.html
@@ -0,0 +1,24 @@
+<p>This page assists in the first time installation and configuration of
+<a href="http://dokuwiki.org">Dokuwiki</a>. More info on this
+installer is available on it's own
+<a href="http://dokuwiki.org/installer">documentation page</a>.</p>
+
+<p>DokuWiki uses ordinary files for the storage of wiki pages and other
+information associated with those pages (e.g. images, search indexes, old
+revisions, etc).  In order to operate successfully DokuWiki
+<strong>must</strong> have write access to the directories that hold those
+files.  This installer is not capable of setting up directory permissions. That
+normally needs to be done directly on a command shell or if you are using hosting,
+through FTP or your hosting control panel (e.g. cPanel).</p>
+
+<p>This installer will setup your DokuWiki configuration for
+<abbr title="access control list">ACL</abbr>, which in turn allows administrator
+login and access to DokuWiki's admin menu for installing plugins, managing
+users, managing access to wiki pages and alteration of configuration settings.
+It isn't required for DokuWiki to operate, however it will make Dokuwiki easier
+to administer.</p>
+
+<p>Experienced users or users with special setup requirements should use these links
+for details concerning
+<a href="http://dokuwiki.org/install">installation instructions</a>
+and <a href="http://dokuwiki.org/config">configuration settings</a>.</p>
diff --git a/wiki/inc/lang/en/lang.php b/wiki/inc/lang/en/lang.php
new file mode 100644
index 0000000..4d11bac
--- /dev/null
+++ b/wiki/inc/lang/en/lang.php
@@ -0,0 +1,389 @@
+<?php
+/**
+ * english language file
+ *
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author     Andreas Gohr <andi@splitbrain.org>
+ * @author     Anika Henke <anika@selfthinker.org>
+ * @author     Matthias Grimm <matthiasgrimm@users.sourceforge.net>
+ * @author     Matthias Schulte <mailinglist@lupo49.de>
+ */
+$lang['encoding']              = 'utf-8';
+$lang['direction']             = 'ltr';
+$lang['doublequoteopening']    = '“'; //&ldquo;
+$lang['doublequoteclosing']    = '”'; //&rdquo;
+$lang['singlequoteopening']    = '‘'; //&lsquo;
+$lang['singlequoteclosing']    = '’'; //&rsquo;
+$lang['apostrophe']            = '’'; //&rsquo;
+
+$lang['btn_edit']              = 'Edit this page';
+$lang['btn_source']            = 'Show pagesource';
+$lang['btn_show']              = 'Show page';
+$lang['btn_create']            = 'Create this page';
+$lang['btn_search']            = 'Search';
+$lang['btn_save']              = 'Save';
+$lang['btn_preview']           = 'Preview';
+$lang['btn_top']               = 'Back to top';
+$lang['btn_newer']             = '<< more recent';
+$lang['btn_older']             = 'less recent >>';
+$lang['btn_revs']              = 'Old revisions';
+$lang['btn_recent']            = 'Recent Changes';
+$lang['btn_upload']            = 'Upload';
+$lang['btn_cancel']            = 'Cancel';
+$lang['btn_index']             = 'Sitemap';
+$lang['btn_secedit']           = 'Edit';
+$lang['btn_login']             = 'Log In';
+$lang['btn_logout']            = 'Log Out';
+$lang['btn_admin']             = 'Admin';
+$lang['btn_update']            = 'Update';
+$lang['btn_delete']            = 'Delete';
+$lang['btn_back']              = 'Back';
+$lang['btn_backlink']          = 'Backlinks';
+$lang['btn_subscribe']         = 'Manage Subscriptions';
+$lang['btn_profile']           = 'Update Profile';
+$lang['btn_reset']             = 'Reset';
+$lang['btn_resendpwd']         = 'Set new password';
+$lang['btn_draft']             = 'Edit draft';
+$lang['btn_recover']           = 'Recover draft';
+$lang['btn_draftdel']          = 'Delete draft';
+$lang['btn_revert']            = 'Restore';
+$lang['btn_register']          = 'Register';
+$lang['btn_apply']             = 'Apply';
+$lang['btn_media']             = 'Media Manager';
+$lang['btn_deleteuser']        = 'Remove My Account';
+$lang['btn_img_backto']        = 'Back to %s';
+$lang['btn_mediaManager']      = 'View in media manager';
+
+$lang['loggedinas']            = 'Logged in as:';
+$lang['user']                  = 'Username';
+$lang['pass']                  = 'Password';
+$lang['newpass']               = 'New password';
+$lang['oldpass']               = 'Confirm current password';
+$lang['passchk']               = 'once again';
+$lang['remember']              = 'Remember me';
+$lang['fullname']              = 'Real name';
+$lang['email']                 = 'E-Mail';
+$lang['profile']               = 'User Profile';
+$lang['badlogin']              = 'Sorry, username or password was wrong.';
+$lang['badpassconfirm']        = 'Sorry, the password was wrong';
+$lang['minoredit']             = 'Minor Changes';
+$lang['draftdate']             = 'Draft autosaved on'; // full dformat date will be added
+$lang['nosecedit']             = 'The page was changed in the meantime, section info was out of date loaded full page instead.';
+$lang['searchcreatepage']      = 'If you didn\'t find what you were looking for, you can create or edit the page %s, named after your query.';
+
+$lang['search_fullresults']    = 'Fulltext results';
+$lang['js']['search_toggle_tools']   = 'Toggle Search Tools';
+$lang['search_exact_match']    = 'Exact match';
+$lang['search_starts_with']    = 'Starts with';
+$lang['search_ends_with']      = 'Ends with';
+$lang['search_contains']       = 'Contains';
+$lang['search_custom_match']   = 'Custom';
+$lang['search_any_ns']         = 'Any namespace';
+$lang['search_any_time']       = 'Any time';
+$lang['search_past_7_days']    = 'Past week';
+$lang['search_past_month']     = 'Past month';
+$lang['search_past_year']      = 'Past year';
+$lang['search_sort_by_hits']   = 'Sort by hits';
+$lang['search_sort_by_mtime']  = 'Sort by last modified';
+
+$lang['regmissing']            = 'Sorry, you must fill in all fields.';
+$lang['reguexists']            = 'Sorry, a user with this login already exists.';
+$lang['regsuccess']            = 'The user has been created and the password was sent by email.';
+$lang['regsuccess2']           = 'The user has been created.';
+$lang['regfail']               = 'The user could not be created.';
+$lang['regmailfail']           = 'Looks like there was an error on sending the password mail. Please contact the admin!';
+$lang['regbadmail']            = 'The given email address looks invalid - if you think this is an error, contact the admin';
+$lang['regbadpass']            = 'The two given passwords are not identical, please try again.';
+$lang['regpwmail']             = 'Your DokuWiki password';
+$lang['reghere']               = 'You don\'t have an account yet? Just get one';
+
+$lang['profna']                = 'This wiki does not support profile modification';
+$lang['profnochange']          = 'No changes, nothing to do.';
+$lang['profnoempty']           = 'An empty name or email address is not allowed.';
+$lang['profchanged']           = 'User profile successfully updated.';
+$lang['profnodelete']          = 'This wiki does not support deleting users';
+$lang['profdeleteuser']        = 'Delete Account';
+$lang['profdeleted']           = 'Your user account has been deleted from this wiki';
+$lang['profconfdelete']        = 'I wish to remove my account from this wiki. <br/> This action can not be undone.';
+$lang['profconfdeletemissing'] = 'Confirmation check box not ticked';
+$lang['proffail']              = 'User profile was not updated.';
+
+$lang['pwdforget']             = 'Forgotten your password? Get a new one';
+$lang['resendna']              = 'This wiki does not support password resending.';
+$lang['resendpwd']             = 'Set new password for';
+$lang['resendpwdmissing']      = 'Sorry, you must fill in all fields.';
+$lang['resendpwdnouser']       = 'Sorry, we can\'t find this user in our database.';
+$lang['resendpwdbadauth']      = 'Sorry, this auth code is not valid. Make sure you used the complete confirmation link.';
+$lang['resendpwdconfirm']      = 'A confirmation link has been sent by email.';
+$lang['resendpwdsuccess']      = 'Your new password has been sent by email.';
+
+$lang['license']               = 'Except where otherwise noted, content on this wiki is licensed under the following license:';
+$lang['licenseok']             = 'Note: By editing this page you agree to license your content under the following license:';
+
+$lang['searchmedia']           = 'Search file name:';
+$lang['searchmedia_in']        = 'Search in %s';
+$lang['txt_upload']            = 'Select file to upload:';
+$lang['txt_filename']          = 'Upload as (optional):';
+$lang['txt_overwrt']           = 'Overwrite existing file';
+$lang['maxuploadsize']         = 'Upload max. %s per file.';
+$lang['lockedby']              = 'Currently locked by:';
+$lang['lockexpire']            = 'Lock expires at:';
+
+$lang['js']['willexpire']      = 'Your lock for editing this page is about to expire in a minute.\nTo avoid conflicts use the preview button to reset the locktimer.';
+$lang['js']['notsavedyet']     = 'Unsaved changes will be lost.';
+$lang['js']['searchmedia']     = 'Search for files';
+$lang['js']['keepopen']        = 'Keep window open on selection';
+$lang['js']['hidedetails']     = 'Hide Details';
+$lang['js']['mediatitle']      = 'Link settings';
+$lang['js']['mediadisplay']    = 'Link type';
+$lang['js']['mediaalign']      = 'Alignment';
+$lang['js']['mediasize']       = 'Image size';
+$lang['js']['mediatarget']     = 'Link target';
+$lang['js']['mediaclose']      = 'Close';
+$lang['js']['mediainsert']     = 'Insert';
+$lang['js']['mediadisplayimg'] = 'Show the image.';
+$lang['js']['mediadisplaylnk'] = 'Show only the link.';
+$lang['js']['mediasmall']      = 'Small version';
+$lang['js']['mediamedium']     = 'Medium version';
+$lang['js']['medialarge']      = 'Large version';
+$lang['js']['mediaoriginal']   = 'Original version';
+$lang['js']['medialnk']        = 'Link to detail page';
+$lang['js']['mediadirect']     = 'Direct link to original';
+$lang['js']['medianolnk']      = 'No link';
+$lang['js']['medianolink']     = 'Do not link the image';
+$lang['js']['medialeft']       = 'Align the image on the left.';
+$lang['js']['mediaright']      = 'Align the image on the right.';
+$lang['js']['mediacenter']     = 'Align the image in the middle.';
+$lang['js']['medianoalign']    = 'Use no align.';
+$lang['js']['nosmblinks']      = 'Linking to Windows shares only works in Microsoft Internet Explorer.\nYou still can copy and paste the link.';
+$lang['js']['linkwiz']         = 'Link Wizard';
+$lang['js']['linkto']          = 'Link to:';
+$lang['js']['del_confirm']     = 'Really delete selected item(s)?';
+$lang['js']['restore_confirm'] = 'Really restore this version?';
+$lang['js']['media_diff']          = 'View differences:';
+$lang['js']['media_diff_both']     = 'Side by Side';
+$lang['js']['media_diff_opacity']  = 'Shine-through';
+$lang['js']['media_diff_portions'] = 'Swipe';
+$lang['js']['media_select']        = 'Select files…';
+$lang['js']['media_upload_btn']    = 'Upload';
+$lang['js']['media_done_btn']      = 'Done';
+$lang['js']['media_drop']          = 'Drop files here to upload';
+$lang['js']['media_cancel']        = 'remove';
+$lang['js']['media_overwrt']       = 'Overwrite existing files';
+
+$lang['rssfailed']             = 'An error occurred while fetching this feed: ';
+$lang['nothingfound']          = 'Nothing was found.';
+
+$lang['mediaselect']           = 'Media Files';
+$lang['uploadsucc']            = 'Upload successful';
+$lang['uploadfail']            = 'Upload failed. Maybe wrong permissions?';
+$lang['uploadwrong']           = 'Upload denied. This file extension is forbidden!';
+$lang['uploadexist']           = 'File already exists. Nothing done.';
+$lang['uploadbadcontent']      = 'The uploaded content did not match the %s file extension.';
+$lang['uploadspam']            = 'The upload was blocked by the spam blacklist.';
+$lang['uploadxss']             = 'The upload was blocked for possibly malicious content.';
+$lang['uploadsize']            = 'The uploaded file was too big. (max. %s)';
+$lang['deletesucc']            = 'The file "%s" has been deleted.';
+$lang['deletefail']            = '"%s" couldn\'t be deleted - check permissions.';
+$lang['mediainuse']            = 'The file "%s" hasn\'t been deleted - it is still in use.';
+$lang['namespaces']            = 'Namespaces';
+$lang['mediafiles']            = 'Available files in';
+$lang['accessdenied']          = 'You are not allowed to view this page.';
+$lang['mediausage']            = 'Use the following syntax to reference this file:';
+$lang['mediaview']             = 'View original file';
+$lang['mediaroot']             = 'root';
+$lang['mediaupload']           = 'Upload a file to the current namespace here. To create subnamespaces, prepend them to your filename separated by colons after you selected the files. Files can also be selected by drag and drop.';
+$lang['mediaextchange']        = 'Filextension changed from .%s to .%s!';
+$lang['reference']             = 'References for';
+$lang['ref_inuse']             = 'The file can\'t be deleted, because it\'s still used by the following pages:';
+$lang['ref_hidden']            = 'Some references  are on pages you don\'t have permission to read';
+
+$lang['hits']                  = 'Hits';
+$lang['quickhits']             = 'Matching pagenames';
+$lang['toc']                   = 'Table of Contents';
+$lang['current']               = 'current';
+$lang['yours']                 = 'Your Version';
+$lang['diff']                  = 'Show differences to current revisions';
+$lang['diff2']                 = 'Show differences between selected revisions';
+$lang['difflink']              = 'Link to this comparison view';
+$lang['diff_type']             = 'View differences:';
+$lang['diff_inline']           = 'Inline';
+$lang['diff_side']             = 'Side by Side';
+$lang['diffprevrev']           = 'Previous revision';
+$lang['diffnextrev']           = 'Next revision';
+$lang['difflastrev']           = 'Last revision';
+$lang['diffbothprevrev']       = 'Both sides previous revision';
+$lang['diffbothnextrev']       = 'Both sides next revision';
+$lang['line']                  = 'Line';
+$lang['breadcrumb']            = 'Trace:';
+$lang['youarehere']            = 'You are here:';
+$lang['lastmod']               = 'Last modified:';
+$lang['by']                    = 'by';
+$lang['deleted']               = 'removed';
+$lang['created']               = 'created';
+$lang['restored']              = 'old revision restored (%s)';
+$lang['external_edit']         = 'external edit';
+$lang['summary']               = 'Edit summary';
+$lang['noflash']               = 'The <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> is needed to display this content.';
+$lang['download']              = 'Download Snippet';
+$lang['tools']                 = 'Tools';
+$lang['user_tools']            = 'User Tools';
+$lang['site_tools']            = 'Site Tools';
+$lang['page_tools']            = 'Page Tools';
+$lang['skip_to_content']       = 'skip to content';
+$lang['sidebar']               = 'Sidebar';
+
+$lang['mail_newpage']          = 'page added:';
+$lang['mail_changed']          = 'page changed:';
+$lang['mail_subscribe_list']   = 'pages changed in namespace:';
+$lang['mail_new_user']         = 'new user:';
+$lang['mail_upload']           = 'file uploaded:';
+
+$lang['changes_type']          = 'View changes of';
+$lang['pages_changes']         = 'Pages';
+$lang['media_changes']         = 'Media files';
+$lang['both_changes']          = 'Both pages and media files';
+
+$lang['qb_bold']               = 'Bold Text';
+$lang['qb_italic']             = 'Italic Text';
+$lang['qb_underl']             = 'Underlined Text';
+$lang['qb_code']               = 'Monospaced Text';
+$lang['qb_strike']             = 'Strike-through Text';
+$lang['qb_h1']                 = 'Level 1 Headline';
+$lang['qb_h2']                 = 'Level 2 Headline';
+$lang['qb_h3']                 = 'Level 3 Headline';
+$lang['qb_h4']                 = 'Level 4 Headline';
+$lang['qb_h5']                 = 'Level 5 Headline';
+$lang['qb_h']                  = 'Headline';
+$lang['qb_hs']                 = 'Select Headline';
+$lang['qb_hplus']              = 'Higher Headline';
+$lang['qb_hminus']             = 'Lower Headline';
+$lang['qb_hequal']             = 'Same Level Headline';
+$lang['qb_link']               = 'Internal Link';
+$lang['qb_extlink']            = 'External Link';
+$lang['qb_hr']                 = 'Horizontal Rule';
+$lang['qb_ol']                 = 'Ordered List Item';
+$lang['qb_ul']                 = 'Unordered List Item';
+$lang['qb_media']              = 'Add Images and other files (opens in a new window)';
+$lang['qb_sig']                = 'Insert Signature';
+$lang['qb_smileys']            = 'Smileys';
+$lang['qb_chars']              = 'Special Chars';
+
+$lang['upperns']               = 'jump to parent namespace';
+
+$lang['metaedit']              = 'Edit Metadata';
+$lang['metasaveerr']           = 'Writing metadata failed';
+$lang['metasaveok']            = 'Metadata saved';
+$lang['img_title']             = 'Title:';
+$lang['img_caption']           = 'Caption:';
+$lang['img_date']              = 'Date:';
+$lang['img_fname']             = 'Filename:';
+$lang['img_fsize']             = 'Size:';
+$lang['img_artist']            = 'Photographer:';
+$lang['img_copyr']             = 'Copyright:';
+$lang['img_format']            = 'Format:';
+$lang['img_camera']            = 'Camera:';
+$lang['img_keywords']          = 'Keywords:';
+$lang['img_width']             = 'Width:';
+$lang['img_height']            = 'Height:';
+
+$lang['subscr_subscribe_success']   = 'Added %s to subscription list for %s';
+$lang['subscr_subscribe_error']     = 'Error adding %s to subscription list for %s';
+$lang['subscr_subscribe_noaddress'] = 'There is no address associated with your login, you cannot be added to the subscription list';
+$lang['subscr_unsubscribe_success'] = 'Removed %s from subscription list for %s';
+$lang['subscr_unsubscribe_error']   = 'Error removing %s from subscription list for %s';
+$lang['subscr_already_subscribed']  = '%s is already subscribed to %s';
+$lang['subscr_not_subscribed']      = '%s is not subscribed to %s';
+// Manage page for subscriptions
+$lang['subscr_m_not_subscribed']    = 'You are currently not subscribed to the current page or namespace.';
+$lang['subscr_m_new_header']        = 'Add subscription';
+$lang['subscr_m_current_header']    = 'Current subscriptions';
+$lang['subscr_m_unsubscribe']       = 'Unsubscribe';
+$lang['subscr_m_subscribe']         = 'Subscribe';
+$lang['subscr_m_receive']           = 'Receive';
+$lang['subscr_style_every']         = 'email on every change';
+$lang['subscr_style_digest']        = 'digest email of changes for each page (every %.2f days)';
+$lang['subscr_style_list']          = 'list of changed pages since last email (every %.2f days)';
+
+/* auth.class language support */
+$lang['authtempfail']          = 'User authentication is temporarily unavailable. If this situation persists, please inform your Wiki Admin.';
+
+/* installer strings */
+$lang['i_chooselang']          = 'Choose your language';
+$lang['i_installer']           = 'DokuWiki Installer';
+$lang['i_wikiname']            = 'Wiki Name';
+$lang['i_enableacl']           = 'Enable ACL (recommended)';
+$lang['i_superuser']           = 'Superuser';
+$lang['i_problems']            = 'The installer found some problems, indicated below. You can not continue until you have fixed them.';
+$lang['i_modified']            = 'For security reasons this script will only work with a new and unmodified Dokuwiki installation.
+                                  You should either re-extract the files from the downloaded package or consult the complete
+                                  <a href="http://dokuwiki.org/install">Dokuwiki installation instructions</a>';
+$lang['i_funcna']              = 'PHP function <code>%s</code> is not available. Maybe your hosting provider disabled it for some reason?';
+$lang['i_phpver']              = 'Your PHP version <code>%s</code> is lower than the needed <code>%s</code>. You need to upgrade your PHP install.';
+$lang['i_mbfuncoverload']      = 'mbstring.func_overload must be disabled in php.ini to run DokuWiki.';
+$lang['i_permfail']            = '<code>%s</code> is not writable by DokuWiki. You need to fix the permission settings of this directory!';
+$lang['i_confexists']          = '<code>%s</code> already exists';
+$lang['i_writeerr']            = 'Unable to create <code>%s</code>. You will need to check directory/file permissions and create the file manually.';
+$lang['i_badhash']             = 'unrecognised or modified dokuwiki.php (hash=<code>%s</code>)';
+$lang['i_badval']              = '<code>%s</code> - illegal or empty value';
+$lang['i_success']             = 'The configuration was finished successfully. You may delete the install.php file now. Continue to
+                                 <a href="doku.php?id=wiki:welcome">your new DokuWiki</a>.';
+$lang['i_failure']             = 'Some errors occurred while writing the configuration files. You may need to fix them manually before
+                                  you can use <a href="doku.php?id=wiki:welcome">your new DokuWiki</a>.';
+$lang['i_policy']              = 'Initial ACL policy';
+$lang['i_pol0']                = 'Open Wiki (read, write, upload for everyone)';
+$lang['i_pol1']                = 'Public Wiki (read for everyone, write and upload for registered users)';
+$lang['i_pol2']                = 'Closed Wiki (read, write, upload for registered users only)';
+$lang['i_allowreg']            = 'Allow users to register themselves';
+$lang['i_retry']               = 'Retry';
+$lang['i_license']             = 'Please choose the license you want to put your content under:';
+$lang['i_license_none']        = 'Do not show any license information';
+$lang['i_pop_field']           = 'Please, help us to improve the DokuWiki experience:';
+$lang['i_pop_label']           = 'Once a month, send anonymous usage data to the DokuWiki developers';
+
+$lang['recent_global']         = 'You\'re currently watching the changes inside the <b>%s</b> namespace. You can also <a href="%s">view the recent changes of the whole wiki</a>.';
+$lang['years']                 = '%d years ago';
+$lang['months']                = '%d months ago';
+$lang['weeks']                 = '%d weeks ago';
+$lang['days']                  = '%d days ago';
+$lang['hours']                 = '%d hours ago';
+$lang['minutes']               = '%d minutes ago';
+$lang['seconds']               = '%d seconds ago';
+
+$lang['wordblock']             = 'Your change was not saved because it contains blocked text (spam).';
+
+$lang['media_uploadtab']       = 'Upload';
+$lang['media_searchtab']       = 'Search';
+$lang['media_file']            = 'File';
+$lang['media_viewtab']         = 'View';
+$lang['media_edittab']         = 'Edit';
+$lang['media_historytab']      = 'History';
+$lang['media_list_thumbs']     = 'Thumbnails';
+$lang['media_list_rows']       = 'Rows';
+$lang['media_sort_name']       = 'Name';
+$lang['media_sort_date']       = 'Date';
+$lang['media_namespaces']      = 'Choose namespace';
+$lang['media_files']           = 'Files in %s';
+$lang['media_upload']          = 'Upload to %s';
+$lang['media_search']          = 'Search in %s';
+$lang['media_view']            = '%s';
+$lang['media_viewold']         = '%s at %s';
+$lang['media_edit']            = 'Edit %s';
+$lang['media_history']         = 'History of %s';
+$lang['media_meta_edited']     = 'metadata edited';
+$lang['media_perm_read']       = 'Sorry, you don\'t have enough rights to read files.';
+$lang['media_perm_upload']     = 'Sorry, you don\'t have enough rights to upload files.';
+$lang['media_update']          = 'Upload new version';
+$lang['media_restore']         = 'Restore this version';
+$lang['media_acl_warning']     = 'This list might not be complete due to ACL restrictions and hidden pages.';
+
+$lang['currentns']             = 'Current namespace';
+$lang['searchresult']          = 'Search Result';
+$lang['plainhtml']             = 'Plain HTML';
+$lang['wikimarkup']            = 'Wiki Markup';
+$lang['page_nonexist_rev']     = 'Page did not exist at %s. It was subsequently created at <a href="%s">%s</a>.';
+$lang['unable_to_parse_date']  = 'Unable to parse at parameter "%s".';
+$lang['email_signature_text'] = 'This mail was generated by DokuWiki at
+@DOKUWIKIURL@';
+#$lang['email_signature_html'] = ''; # the empty default will copy the text signature, you can override it in a local lang file
+
diff --git a/wiki/inc/lang/en/locked.txt b/wiki/inc/lang/en/locked.txt
new file mode 100644
index 0000000..af6347a
--- /dev/null
+++ b/wiki/inc/lang/en/locked.txt
@@ -0,0 +1,3 @@
+====== Page locked ======
+
+This page is currently locked for editing by another user. You have to wait until this user finishes editing or the lock expires.
diff --git a/wiki/inc/lang/en/login.txt b/wiki/inc/lang/en/login.txt
new file mode 100644
index 0000000..2004ea1
--- /dev/null
+++ b/wiki/inc/lang/en/login.txt
@@ -0,0 +1,4 @@
+====== Login ======
+
+You are currently not logged in! Enter your authentication credentials below to log in. You need to have cookies enabled to log in.
+
diff --git a/wiki/inc/lang/en/mailtext.txt b/wiki/inc/lang/en/mailtext.txt
new file mode 100644
index 0000000..aea14d4
--- /dev/null
+++ b/wiki/inc/lang/en/mailtext.txt
@@ -0,0 +1,12 @@
+A page in your DokuWiki was added or changed. Here are the details:
+
+Date        : @DATE@
+Browser     : @BROWSER@
+IP-Address  : @IPADDRESS@
+Hostname    : @HOSTNAME@
+Old Revision: @OLDPAGE@
+New Revision: @NEWPAGE@
+Edit Summary: @SUMMARY@
+User        : @USER@
+
+@DIFF@
diff --git a/wiki/inc/lang/en/mailwrap.html b/wiki/inc/lang/en/mailwrap.html
new file mode 100644
index 0000000..7df0cdc
--- /dev/null
+++ b/wiki/inc/lang/en/mailwrap.html
@@ -0,0 +1,13 @@
+<html>
+<head>
+    <title>@TITLE@</title>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+</head>
+<body>
+
+@HTMLBODY@
+
+<br /><hr />
+<small>@EMAILSIGNATURE@</small>
+</body>
+</html>
diff --git a/wiki/inc/lang/en/newpage.txt b/wiki/inc/lang/en/newpage.txt
new file mode 100644
index 0000000..e78b534
--- /dev/null
+++ b/wiki/inc/lang/en/newpage.txt
@@ -0,0 +1,4 @@
+====== This topic does not exist yet ======
+
+You've followed a link to a topic that doesn't exist yet. If permissions allow, you may create it by clicking on "Create this page".
+
diff --git a/wiki/inc/lang/en/norev.txt b/wiki/inc/lang/en/norev.txt
new file mode 100644
index 0000000..27c336b
--- /dev/null
+++ b/wiki/inc/lang/en/norev.txt
@@ -0,0 +1,4 @@
+====== No such revision ======
+
+The specified revision doesn't exist. Click on "Old revisions" for a list of old revisions of this document.
+
diff --git a/wiki/inc/lang/en/password.txt b/wiki/inc/lang/en/password.txt
new file mode 100644
index 0000000..0a0dfb5
--- /dev/null
+++ b/wiki/inc/lang/en/password.txt
@@ -0,0 +1,6 @@
+Hi @FULLNAME@!
+
+Here is your userdata for @TITLE@ at @DOKUWIKIURL@
+
+Login    : @LOGIN@
+Password : @PASSWORD@
diff --git a/wiki/inc/lang/en/preview.txt b/wiki/inc/lang/en/preview.txt
new file mode 100644
index 0000000..5ca6969
--- /dev/null
+++ b/wiki/inc/lang/en/preview.txt
@@ -0,0 +1,4 @@
+====== Preview ======
+
+This is a preview of what your text will look like. Remember: It is **not saved** yet!
+
diff --git a/wiki/inc/lang/en/pwconfirm.txt b/wiki/inc/lang/en/pwconfirm.txt
new file mode 100644
index 0000000..3732d8a
--- /dev/null
+++ b/wiki/inc/lang/en/pwconfirm.txt
@@ -0,0 +1,11 @@
+Hi @FULLNAME@!
+
+Someone requested a new password for your @TITLE@
+login at @DOKUWIKIURL@
+
+If you did not request a new password then just ignore this email.
+
+To confirm that the request was really sent by you please use the
+following link.
+
+@CONFIRM@
diff --git a/wiki/inc/lang/en/read.txt b/wiki/inc/lang/en/read.txt
new file mode 100644
index 0000000..9f56d81
--- /dev/null
+++ b/wiki/inc/lang/en/read.txt
@@ -0,0 +1,2 @@
+This page is read only. You can view the source, but not change it. Ask your administrator if you think this is wrong.
+
diff --git a/wiki/inc/lang/en/recent.txt b/wiki/inc/lang/en/recent.txt
new file mode 100644
index 0000000..3f7b58c
--- /dev/null
+++ b/wiki/inc/lang/en/recent.txt
@@ -0,0 +1,5 @@
+====== Recent Changes ======
+
+The following pages were changed recently.
+
+
diff --git a/wiki/inc/lang/en/register.txt b/wiki/inc/lang/en/register.txt
new file mode 100644
index 0000000..db68d4f
--- /dev/null
+++ b/wiki/inc/lang/en/register.txt
@@ -0,0 +1,4 @@
+====== Register as new user ======
+
+Fill in all the information below to create a new account in this wiki. Make sure you supply a **valid e-mail address** - if you are not asked to enter a password here, a new one will be sent to that address. The login name should be a valid [[doku>pagename|pagename]].
+
diff --git a/wiki/inc/lang/en/registermail.txt b/wiki/inc/lang/en/registermail.txt
new file mode 100644
index 0000000..5517ca1
--- /dev/null
+++ b/wiki/inc/lang/en/registermail.txt
@@ -0,0 +1,10 @@
+A new user has registered. Here are the details:
+
+User name   : @NEWUSER@
+Full name   : @NEWNAME@
+E-mail      : @NEWEMAIL@
+
+Date        : @DATE@
+Browser     : @BROWSER@
+IP-Address  : @IPADDRESS@
+Hostname    : @HOSTNAME@
diff --git a/wiki/inc/lang/en/resendpwd.txt b/wiki/inc/lang/en/resendpwd.txt
new file mode 100644
index 0000000..98c8c75
--- /dev/null
+++ b/wiki/inc/lang/en/resendpwd.txt
@@ -0,0 +1,4 @@
+====== Send new password ======
+
+Please enter your user name in the form below to request a new password for your account in this wiki. A confirmation link will be sent to your registered email address.
+
diff --git a/wiki/inc/lang/en/resetpwd.txt b/wiki/inc/lang/en/resetpwd.txt
new file mode 100644
index 0000000..993b487
--- /dev/null
+++ b/wiki/inc/lang/en/resetpwd.txt
@@ -0,0 +1,4 @@
+====== Set new password ======
+
+Please enter a new password for your account in this wiki.
+
diff --git a/wiki/inc/lang/en/revisions.txt b/wiki/inc/lang/en/revisions.txt
new file mode 100644
index 0000000..dd5f35b
--- /dev/null
+++ b/wiki/inc/lang/en/revisions.txt
@@ -0,0 +1,4 @@
+====== Old Revisions ======
+
+These are the older revisons of the current document. To revert to an old revision, select it from below, click ''Edit this page'' and save it.
+
diff --git a/wiki/inc/lang/en/searchpage.txt b/wiki/inc/lang/en/searchpage.txt
new file mode 100644
index 0000000..59cbec2
--- /dev/null
+++ b/wiki/inc/lang/en/searchpage.txt
@@ -0,0 +1,4 @@
+====== Search ======
+
+You can find the results of your search below. @CREATEPAGEINFO@
+
diff --git a/wiki/inc/lang/en/showrev.txt b/wiki/inc/lang/en/showrev.txt
new file mode 100644
index 0000000..3608de3
--- /dev/null
+++ b/wiki/inc/lang/en/showrev.txt
@@ -0,0 +1,2 @@
+**This is an old revision of the document!**
+----
diff --git a/wiki/inc/lang/en/stopwords.txt b/wiki/inc/lang/en/stopwords.txt
new file mode 100644
index 0000000..afc3016
--- /dev/null
+++ b/wiki/inc/lang/en/stopwords.txt
@@ -0,0 +1,39 @@
+# This is a list of words the indexer ignores, one word per line
+# When you edit this file be sure to use UNIX line endings (single newline)
+# No need to include words shorter than 3 chars - these are ignored anyway
+# This list is based upon the ones found at http://www.ranks.nl/stopwords/
+about
+are
+as
+an
+and
+you
+your
+them
+their
+com
+for
+from
+into
+if
+in
+is
+it
+how
+of
+on
+or
+that
+the
+this
+to
+was
+what
+when
+where
+who
+will
+with
+und
+the
+www
diff --git a/wiki/inc/lang/en/subscr_digest.txt b/wiki/inc/lang/en/subscr_digest.txt
new file mode 100644
index 0000000..cc42e08
--- /dev/null
+++ b/wiki/inc/lang/en/subscr_digest.txt
@@ -0,0 +1,16 @@
+Hello!
+
+The page @PAGE@ in the @TITLE@ wiki changed.
+Here are the changes:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Old Revision: @OLDPAGE@
+New Revision: @NEWPAGE@
+
+To cancel the page notifications, log into the wiki at
+@DOKUWIKIURL@ then visit
+@SUBSCRIBE@
+and unsubscribe page and/or namespace changes.
diff --git a/wiki/inc/lang/en/subscr_form.txt b/wiki/inc/lang/en/subscr_form.txt
new file mode 100644
index 0000000..d606508
--- /dev/null
+++ b/wiki/inc/lang/en/subscr_form.txt
@@ -0,0 +1,3 @@
+====== Subscription Management ======
+
+This page allows you to manage your subscriptions for the current page and namespace.
diff --git a/wiki/inc/lang/en/subscr_list.txt b/wiki/inc/lang/en/subscr_list.txt
new file mode 100644
index 0000000..dcf8000
--- /dev/null
+++ b/wiki/inc/lang/en/subscr_list.txt
@@ -0,0 +1,13 @@
+Hello!
+
+Pages in the namespace @PAGE@ of the @TITLE@ wiki changed.
+Here are the changed pages:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+To cancel the page notifications, log into the wiki at
+@DOKUWIKIURL@ then visit
+@SUBSCRIBE@
+and unsubscribe page and/or namespace changes.
diff --git a/wiki/inc/lang/en/subscr_single.txt b/wiki/inc/lang/en/subscr_single.txt
new file mode 100644
index 0000000..8f097dc
--- /dev/null
+++ b/wiki/inc/lang/en/subscr_single.txt
@@ -0,0 +1,19 @@
+Hello!
+
+The page @PAGE@ in the @TITLE@ wiki changed.
+Here are the changes:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Date        : @DATE@
+User        : @USER@
+Edit Summary: @SUMMARY@
+Old Revision: @OLDPAGE@
+New Revision: @NEWPAGE@
+
+To cancel the page notifications, log into the wiki at
+@DOKUWIKIURL@ then visit
+@SUBSCRIBE@
+and unsubscribe page and/or namespace changes.
diff --git a/wiki/inc/lang/en/updateprofile.txt b/wiki/inc/lang/en/updateprofile.txt
new file mode 100644
index 0000000..b929fee
--- /dev/null
+++ b/wiki/inc/lang/en/updateprofile.txt
@@ -0,0 +1,5 @@
+====== Update your account profile ======
+
+You only need to complete those fields you wish to change.  You may not change your user name.
+
+
diff --git a/wiki/inc/lang/en/uploadmail.txt b/wiki/inc/lang/en/uploadmail.txt
new file mode 100644
index 0000000..dca8e33
--- /dev/null
+++ b/wiki/inc/lang/en/uploadmail.txt
@@ -0,0 +1,11 @@
+A file was uploaded to your DokuWiki. Here are the details:
+
+File        : @MEDIA@
+Old revision: @OLD@
+Date        : @DATE@
+Browser     : @BROWSER@
+IP-Address  : @IPADDRESS@
+Hostname    : @HOSTNAME@
+Size        : @SIZE@
+MIME Type   : @MIME@
+User        : @USER@
diff --git a/wiki/inc/lang/eo/admin.txt b/wiki/inc/lang/eo/admin.txt
new file mode 100644
index 0000000..4b3cf0c
--- /dev/null
+++ b/wiki/inc/lang/eo/admin.txt
@@ -0,0 +1,3 @@
+====== Administrado ======
+
+Sube vi trovas liston de administraj taskoj haveblaj en DokuWiki.
diff --git a/wiki/inc/lang/eo/adminplugins.txt b/wiki/inc/lang/eo/adminplugins.txt
new file mode 100644
index 0000000..bb7e782
--- /dev/null
+++ b/wiki/inc/lang/eo/adminplugins.txt
@@ -0,0 +1 @@
+===== Aldonaj kromaĵoj =====
\ No newline at end of file
diff --git a/wiki/inc/lang/eo/backlinks.txt b/wiki/inc/lang/eo/backlinks.txt
new file mode 100644
index 0000000..cd0cca9
--- /dev/null
+++ b/wiki/inc/lang/eo/backlinks.txt
@@ -0,0 +1,3 @@
+====== Retroligiloj ======
+
+Ĉi tiu listo montras paĝojn, kiuj referencas al la aktuala paĝo.
\ No newline at end of file
diff --git a/wiki/inc/lang/eo/conflict.txt b/wiki/inc/lang/eo/conflict.txt
new file mode 100644
index 0000000..cd01929
--- /dev/null
+++ b/wiki/inc/lang/eo/conflict.txt
@@ -0,0 +1,5 @@
+====== Pli nova versio ekzistas ======
+
+Ekzistas pli nova versio de la dokumento. Tio okazas kiam iu alia uzanto ŝanĝis enhavon de la dokumento dum vi redaktis ĝin.
+
+Atente esploru distingojn kaj decidu kiun version vi tenos. Se vi premos '"Konservi'", do via versio estos konservita. Presonte butonon '"Rezigni" vi tenos la kurantan version.
diff --git a/wiki/inc/lang/eo/denied.txt b/wiki/inc/lang/eo/denied.txt
new file mode 100644
index 0000000..e0abba1
--- /dev/null
+++ b/wiki/inc/lang/eo/denied.txt
@@ -0,0 +1,4 @@
+====== Aliro malpermesita ======
+
+Vi ne havas sufiĉajn rajtojn daŭrigi.
+
diff --git a/wiki/inc/lang/eo/diff.txt b/wiki/inc/lang/eo/diff.txt
new file mode 100644
index 0000000..3c9db61
--- /dev/null
+++ b/wiki/inc/lang/eo/diff.txt
@@ -0,0 +1,4 @@
+====== Diferencoj ======
+
+Tio montras diferencojn inter du versioj de la paĝo.
+
diff --git a/wiki/inc/lang/eo/draft.txt b/wiki/inc/lang/eo/draft.txt
new file mode 100644
index 0000000..57526f3
--- /dev/null
+++ b/wiki/inc/lang/eo/draft.txt
@@ -0,0 +1,5 @@
+====== Skiza dosiero troviĝis ======
+
+Via lasta redaktosesio en tiu ĉi paĝo ne ĝuste kompletiĝis. DokuWiki aŭtomate konservis skizon dum vi laboris, kiun vi nun povas uzi por daŭrigi vian redaktadon. Sube vi povas vidi la datumaron, kiu konserviĝis el via lasta sesio.
+
+Bonvolu decidi ĉu vi volas //restarigi// vian perditan redakton, //forigi// la aŭtomate konservitan skizon aŭ //rezigni// pri la redakta procezo.
diff --git a/wiki/inc/lang/eo/edit.txt b/wiki/inc/lang/eo/edit.txt
new file mode 100644
index 0000000..ccc8a61
--- /dev/null
+++ b/wiki/inc/lang/eo/edit.txt
@@ -0,0 +1 @@
+Redaktu paĝon kaj poste premu butonon titolitan '"Konservi'". Bonvolu tralegi la [[wiki:syntax|vikian sintakson]] pri la formatigo. Bonvolu redakti **nur**, se vi povas **plibonigi** la enhavon de la paĝo. Se vi volas nur testi ion, bonvolu uzi specialan paĝon: [[playground:playground|sablokesto]].
diff --git a/wiki/inc/lang/eo/editrev.txt b/wiki/inc/lang/eo/editrev.txt
new file mode 100644
index 0000000..2e1406b
--- /dev/null
+++ b/wiki/inc/lang/eo/editrev.txt
@@ -0,0 +1,2 @@
+**Vi laboras kun malnova revizio de la dokumento!** Se vi konservos ĝin, kreiĝos nova kuranta versio kun tiu enhavo.
+----
diff --git a/wiki/inc/lang/eo/index.txt b/wiki/inc/lang/eo/index.txt
new file mode 100644
index 0000000..ac1f32c
--- /dev/null
+++ b/wiki/inc/lang/eo/index.txt
@@ -0,0 +1,3 @@
+====== Enhavo ======
+
+Tio ĉi estas indekso pri ĉiuj disponeblaj paĝoj ordigitaj laŭ [[doku>namespaces|nomspacoj]].
diff --git a/wiki/inc/lang/eo/install.html b/wiki/inc/lang/eo/install.html
new file mode 100644
index 0000000..0fb94e4
--- /dev/null
+++ b/wiki/inc/lang/eo/install.html
@@ -0,0 +1,9 @@
+<p>Tiu ĉi paĝo helpas en la unua instalo kaj agordado de <a href="http://dokuwiki.org">DokuWiki</a>. Pli da informo pri tiu instalilo disponeblas en ĝia propra <a href="http://dokuwiki.org/installer">dokumentada paĝo</a>.</p>
+
+<p>DokuWiki uzas ordinarajn dosierojn por konservi vikiajn paĝojn kaj aliajn informojn asociitaj al tiuj paĝoj (ekz. bildoj, serĉindeksoj, malnovaj revizioj, ktp). Por bone funkcii, DokuWiki <strong>devas</strong> havi registran rajton sur la subdosierujoj, kiuj entenas tiujn dosierojn. Tiu ĉi instalilo ne kapablas difini permes-atributojn de dosierujoj. Ordinare, tio devas esti senpere farita de iu komando en konzolo aŭ, se vi abonas retprovizanton, per FTP aŭ kontrola panelo de tiu retprovidanto (ekz. cPanel).</p>
+
+<p>Tiu ĉi instalilo difinos vian DokuWiki-an agordadon por <abbr title="alir-kontrola listo">ACL</abbr>, kiu ebligas al administranto identiĝi kaj aliri taŭgan interfacon por instali kromaĵojn, administri uzantojn kaj alireblon al vikipaĝoj, kaj difini agordojn ĝeneralajn.
+Ĝi ne estas nepra por ke DokuWiki funkciu, tamen ĝi multe faciligos administradon.</p>
+
+<p>Spertuloj aŭ uzantoj kiuj bezonas specialajn agordrimedojn uzu tiujn ligilojn por havi pli detalojn pri <a href="http://dokuwiki.org/install">instaladaj instrukcioj</a>
+kaj <a href="http://dokuwiki.org/config">agordadaj difinoj</a>.</p>
diff --git a/wiki/inc/lang/eo/jquery.ui.datepicker.js b/wiki/inc/lang/eo/jquery.ui.datepicker.js
new file mode 100644
index 0000000..25f6162
--- /dev/null
+++ b/wiki/inc/lang/eo/jquery.ui.datepicker.js
@@ -0,0 +1,37 @@
+/* Esperanto initialisation for the jQuery UI date picker plugin. */
+/* Written by Olivier M. (olivierweb@ifrance.com). */
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "../widgets/datepicker" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery.datepicker );
+	}
+}( function( datepicker ) {
+
+datepicker.regional.eo = {
+	closeText: "Fermi",
+	prevText: "&#x3C;Anta",
+	nextText: "Sekv&#x3E;",
+	currentText: "Nuna",
+	monthNames: [ "Januaro","Februaro","Marto","Aprilo","Majo","Junio",
+	"Julio","Aŭgusto","Septembro","Oktobro","Novembro","Decembro" ],
+	monthNamesShort: [ "Jan","Feb","Mar","Apr","Maj","Jun",
+	"Jul","Aŭg","Sep","Okt","Nov","Dec" ],
+	dayNames: [ "Dimanĉo","Lundo","Mardo","Merkredo","Ĵaŭdo","Vendredo","Sabato" ],
+	dayNamesShort: [ "Dim","Lun","Mar","Mer","Ĵaŭ","Ven","Sab" ],
+	dayNamesMin: [ "Di","Lu","Ma","Me","Ĵa","Ve","Sa" ],
+	weekHeader: "Sb",
+	dateFormat: "dd/mm/yy",
+	firstDay: 0,
+	isRTL: false,
+	showMonthAfterYear: false,
+	yearSuffix: "" };
+datepicker.setDefaults( datepicker.regional.eo );
+
+return datepicker.regional.eo;
+
+} ) );
diff --git a/wiki/inc/lang/eo/lang.php b/wiki/inc/lang/eo/lang.php
new file mode 100644
index 0000000..26d3dd2
--- /dev/null
+++ b/wiki/inc/lang/eo/lang.php
@@ -0,0 +1,340 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Kristjan SCHMIDT <kristjan.schmidt@googlemail.com>
+ * @author Antono Vasiljev <esperanto.minsk ĈE tut.by>
+ * @author Felipe Castro <fefcas@yahoo.com.br>
+ * @author Robert Bogenschneider <robog@gmx.de>
+ * @author Erik Pedersen <erik.pedersen@shaw.ca>
+ */
+$lang['encoding']              = 'utf-8';
+$lang['direction']             = 'ltr';
+$lang['doublequoteopening']    = '“';
+$lang['doublequoteclosing']    = '”';
+$lang['singlequoteopening']    = '‘';
+$lang['singlequoteclosing']    = '’';
+$lang['apostrophe']            = '’';
+$lang['btn_edit']              = 'Redakti la paĝon';
+$lang['btn_source']            = 'Montri fontan tekston';
+$lang['btn_show']              = 'Montri paĝon';
+$lang['btn_create']            = 'Krei paĝon';
+$lang['btn_search']            = 'Serĉi';
+$lang['btn_save']              = 'Konservi';
+$lang['btn_preview']           = 'Antaŭrigardi';
+$lang['btn_top']               = 'Supren';
+$lang['btn_newer']             = '<< pli freŝe';
+$lang['btn_older']             = 'malpli freŝe >>';
+$lang['btn_revs']              = 'Malnovaj revizioj';
+$lang['btn_recent']            = 'Freŝaj ŝanĝoj';
+$lang['btn_upload']            = 'Alŝuti';
+$lang['btn_cancel']            = 'Rezigni';
+$lang['btn_index']             = 'Indekso';
+$lang['btn_secedit']           = 'Redakti';
+$lang['btn_login']             = 'Ensaluti';
+$lang['btn_logout']            = 'Elsaluti';
+$lang['btn_admin']             = 'Administri';
+$lang['btn_update']            = 'Aktualigi';
+$lang['btn_delete']            = 'Forigi';
+$lang['btn_back']              = 'Retroiri';
+$lang['btn_backlink']          = 'Retroligoj';
+$lang['btn_subscribe']         = 'Aliĝi al paĝaj modifoj';
+$lang['btn_profile']           = 'Aktualigi profilon';
+$lang['btn_reset']             = 'Rekomenci';
+$lang['btn_resendpwd']         = 'Sendi novan pasvorton';
+$lang['btn_draft']             = 'Redakti skizon';
+$lang['btn_recover']           = 'Restarigi skizon';
+$lang['btn_draftdel']          = 'Forigi skizon';
+$lang['btn_revert']            = 'Restarigi';
+$lang['btn_register']          = 'Registriĝi';
+$lang['btn_apply']             = 'Apliki';
+$lang['btn_media']             = 'Medio-administrilo';
+$lang['btn_deleteuser']        = 'Forigi mian konton';
+$lang['btn_img_backto']        = 'Iri reen al %s';
+$lang['btn_mediaManager']      = 'Rigardi en aŭdvidaĵ-administrilo';
+$lang['loggedinas']            = 'Ensalutinta kiel:';
+$lang['user']                  = 'Uzant-nomo';
+$lang['pass']                  = 'Pasvorto';
+$lang['newpass']               = 'Nova pasvorto';
+$lang['oldpass']               = 'Konfirmu la nunan pasvorton';
+$lang['passchk']               = 'plian fojon';
+$lang['remember']              = 'Rememoru min';
+$lang['fullname']              = 'Kompleta nomo';
+$lang['email']                 = 'Retpoŝto';
+$lang['profile']               = 'Uzanto-profilo';
+$lang['badlogin']              = 'Pardonu, uzant-nomo aŭ pasvorto estis erara.';
+$lang['badpassconfirm']        = 'Pardonu, la pasvorto malĝustis';
+$lang['minoredit']             = 'Etaj modifoj';
+$lang['draftdate']             = 'Lasta konservo de la skizo:';
+$lang['nosecedit']             = 'La paĝo ŝanĝiĝis intertempe, sekcio-informo estis malĝisdata, tial la tuta paĝo estas reŝargita.';
+$lang['regmissing']            = 'Pardonu, vi devas plenigi ĉiujn kampojn.';
+$lang['reguexists']            = 'Pardonu, ĉi tiu uzanto-nomo jam ekzistas.';
+$lang['regsuccess']            = 'La uzanto kreiĝis kaj la pasvorto sendiĝis per retpoŝto.';
+$lang['regsuccess2']           = 'La uzanto kreiĝis.';
+$lang['regfail']               = 'Ne eblis krei uzanton.';
+$lang['regmailfail']           = 'Ŝajne okazis eraro dum elsendo de la pasvorto. Bonvolu informi administranton pri tio!';
+$lang['regbadmail']            = 'Entajpita retpoŝta adreso ŝajnas ne valida. Se vi pensas, ke tio estas eraro, kontaktu la administranton.';
+$lang['regbadpass']            = 'La du pasvortoj ne samas, bonvolu provi refoje.';
+$lang['regpwmail']             = 'Via DokuWiki-pasvorto';
+$lang['reghere']               = 'Se vi ne havas konton, vi povas akiri ĝin';
+$lang['profna']                = 'Tiu ĉi vikio ne ebligas modifon en la profiloj.';
+$lang['profnochange']          = 'Neniu ŝanĝo, nenio farinda.';
+$lang['profnoempty']           = 'Malplena nomo aŭ retadreso ne estas permesata.';
+$lang['profchanged']           = 'La profilo de la uzanto sukcese aktualiĝis.';
+$lang['profnodelete']          = 'Tiu ĉi vikio ne subtenas forigo de uzantoj';
+$lang['profdeleteuser']        = 'Forigi aliĝon';
+$lang['profdeleted']           = 'Via uzant-aliĝo estis forigata de tiu ĉi vikio';
+$lang['profconfdelete']        = 'Mi deziras forigi mian aliĝon de tiu ĉi vikio. <br/> Tiu ĉi ago ne povos esti malfarata.';
+$lang['profconfdeletemissing'] = 'Konfirmilo ne estas markita';
+$lang['proffail']              = 'La uzantokonto ne estis aktualigita.';
+$lang['pwdforget']             = 'Ĉu vi forgesis vian pasvorton? Prenu novan';
+$lang['resendna']              = 'Tiu ĉi vikio ne ebligas resendon de la pasvortoj.';
+$lang['resendpwd']             = 'Sendi novan pasvorton al';
+$lang['resendpwdmissing']      = 'Pardonu, vi devas plenigi ĉiujn kampojn.';
+$lang['resendpwdnouser']       = 'Pardonu, tiu uzanto ne troveblas en nia datumbazo.';
+$lang['resendpwdbadauth']      = 'Pardonu, tiu aŭtentiga kodo ne validas. Certiĝu, ke vi uzis la kompletan konfirmigan ligilon.';
+$lang['resendpwdconfirm']      = 'Konfirmiga ligilo sendiĝis per retpoŝto.';
+$lang['resendpwdsuccess']      = 'Via nova pasvorto sendiĝis per retpoŝto.';
+$lang['license']               = 'Krom kie rekte indikite, enhavo de tiu ĉi vikio estas publikigita laŭ la jena permesilo:';
+$lang['licenseok']             = 'Rimarku: redaktante tiun ĉi paĝon vi konsentas publikigi vian enhavon laŭ la jena permesilo:';
+$lang['searchmedia']           = 'Serĉi dosiernomon:';
+$lang['searchmedia_in']        = 'Serĉi en %s';
+$lang['txt_upload']            = 'Elektu dosieron por alŝuti:';
+$lang['txt_filename']          = 'Alŝuti kiel (laŭvole):';
+$lang['txt_overwrt']           = 'Anstataŭigi ekzistantan dosieron';
+$lang['maxuploadsize']         = 'Alŝuto maks. %s po dosiero.';
+$lang['lockedby']              = 'Nune ŝlosita de:';
+$lang['lockexpire']            = 'Ŝlosado ĉesos je:';
+$lang['js']['willexpire']      = 'Vi povos redakti ĉi tiun paĝon post unu minuto.\nSe vi volas nuligi tempokontrolon de la ŝlosado, premu la butonon "Antaŭrigardi".';
+$lang['js']['notsavedyet']     = 'Ne konservitaj modifoj perdiĝos.
+Ĉu vi certe volas daŭrigi la procezon?';
+$lang['js']['searchmedia']     = 'Serĉi dosierojn';
+$lang['js']['keepopen']        = 'Tenu la fenestron malferma dum elekto';
+$lang['js']['hidedetails']     = 'Kaŝi detalojn';
+$lang['js']['mediatitle']      = 'Ligilaj agordoj';
+$lang['js']['mediadisplay']    = 'Ligila tipo';
+$lang['js']['mediaalign']      = 'Poziciigo';
+$lang['js']['mediasize']       = 'Bildgrandeco';
+$lang['js']['mediatarget']     = 'Ligila celo';
+$lang['js']['mediaclose']      = 'Fermi';
+$lang['js']['mediainsert']     = 'Enmeti';
+$lang['js']['mediadisplayimg'] = 'Montri la bildon.';
+$lang['js']['mediadisplaylnk'] = 'Montri nur la ligilon.';
+$lang['js']['mediasmall']      = 'Malgranda versio';
+$lang['js']['mediamedium']     = 'Meza versio';
+$lang['js']['medialarge']      = 'Granda versio';
+$lang['js']['mediaoriginal']   = 'Origina versio';
+$lang['js']['medialnk']        = 'Ligilo al detala paĝo';
+$lang['js']['mediadirect']     = 'Rekta ligilo al la origino';
+$lang['js']['medianolnk']      = 'Neniu ligilo';
+$lang['js']['medianolink']     = 'Ne ligi la bildon';
+$lang['js']['medialeft']       = 'Meti la bildon maldekstren.';
+$lang['js']['mediaright']      = 'Meti la bildon dekstren.';
+$lang['js']['mediacenter']     = 'Meti la bildon mezen.';
+$lang['js']['medianoalign']    = 'Ne uzi poziciigon.';
+$lang['js']['nosmblinks']      = 'Tio ĉi nur funkcias en "Microsoft Internet Explorer".\nVi ankoraŭ povas kopii kaj almeti la ligilon.';
+$lang['js']['linkwiz']         = 'Ligil-Asistanto';
+$lang['js']['linkto']          = 'Ligilo al:';
+$lang['js']['del_confirm']     = 'Ĉu vere forigi elektita(j)n ero(j)n?';
+$lang['js']['restore_confirm'] = 'Ĉu vere restarigi ĉi tiun version?';
+$lang['js']['media_diff']      = 'Rigardu la diferencojn:';
+$lang['js']['media_diff_both'] = 'Flankon apud flanko';
+$lang['js']['media_diff_opacity'] = 'Unu super la alia';
+$lang['js']['media_diff_portions'] = 'Ŝovilo';
+$lang['js']['media_select']    = 'Elektu dosierojn...';
+$lang['js']['media_upload_btn'] = 'Alŝuto';
+$lang['js']['media_done_btn']  = 'Finita';
+$lang['js']['media_drop']      = 'Demetu ĉi-tien por alŝuti';
+$lang['js']['media_cancel']    = 'forigi';
+$lang['js']['media_overwrt']   = 'Anstataûi ekzistantajn dosierojn';
+$lang['rssfailed']             = 'Okazis eraro dum ricevado de la novaĵ-fluo: ';
+$lang['nothingfound']          = 'Ankoraŭ nenio troviĝas tie ĉi.';
+$lang['mediaselect']           = 'Elekto de aŭdvidaĵa dosiero';
+$lang['uploadsucc']            = 'Alŝuto sukcesis';
+$lang['uploadfail']            = 'Alŝuto malsukcesis. Ĉu eble estas problemoj pro permes-atributoj?';
+$lang['uploadwrong']           = 'Rifuzita alŝuto. Tiu ĉi dosiersufikso estas malpermesata!';
+$lang['uploadexist']           = 'La dosiero jam ekzistas. Nenio estas farita.';
+$lang['uploadbadcontent']      = 'La alŝutita enhavo ne kongruas al la sufikso %s.';
+$lang['uploadspam']            = 'La alŝutaĵo blokiĝis de kontraŭspama vortlisto.';
+$lang['uploadxss']             = 'La alŝutajo blokiĝis pro ebla malica enhavo.';
+$lang['uploadsize']            = 'La alŝutita dosiero estis tro granda. (maks. %s)';
+$lang['deletesucc']            = 'La dosiero "%s" forigiĝis.';
+$lang['deletefail']            = '"%s" ne povis esti forigita - kontrolu permes-atributojn.';
+$lang['mediainuse']            = 'La dosiero "%s" ne forigiĝis - ĝi ankoraŭ estas uzata.';
+$lang['namespaces']            = 'Nomspacoj';
+$lang['mediafiles']            = 'Disponeblaj dosieroj';
+$lang['accessdenied']          = 'Vi ne rajtas vidi tiun paĝon.';
+$lang['mediausage']            = 'Uzu jenan sintakson por referenci tiun ĉi dosieron:';
+$lang['mediaview']             = 'Rigardi originalan dosieron';
+$lang['mediaroot']             = 'ĉefo (root)';
+$lang['mediaupload']           = 'Alŝutu dosieron al la kuranta nomspaco tien ĉi. Por krei subnomspacojn, antaŭmetu ilin al via "Alŝuti kiel" dosiernomo, disigigante per dupunktoj (:).';
+$lang['mediaextchange']        = 'La dosiersufikso ŝanĝis de .%s al .%s!';
+$lang['reference']             = 'Referencoj por';
+$lang['ref_inuse']             = 'La dosiero ne povas esti forigita, ĉar ĝi ankoraŭ estas uzata de jenaj paĝoj:';
+$lang['ref_hidden']            = 'Kelkaj referencoj estas en paĝoj, kiujn vi ne rajtas legi';
+$lang['hits']                  = 'Trafoj';
+$lang['quickhits']             = 'Trafoj trovitaj en paĝnomoj';
+$lang['toc']                   = 'Enhavtabelo';
+$lang['current']               = 'aktuala';
+$lang['yours']                 = 'Via versio';
+$lang['diff']                  = 'Montri diferencojn el la aktuala versio';
+$lang['diff2']                 = 'Montri diferencojn inter la elektitaj revizioj';
+$lang['difflink']              = 'Ligilo al kompara rigardo';
+$lang['diff_type']             = 'Rigardi malsamojn:';
+$lang['diff_inline']           = 'Samlinie';
+$lang['diff_side']             = 'Apude';
+$lang['diffprevrev']           = 'Antaŭa revizio';
+$lang['diffnextrev']           = 'Sekva revizio';
+$lang['difflastrev']           = 'Lasta revizio';
+$lang['diffbothprevrev']       = 'Sur ambaŭ flankoj antaŭa revizio';
+$lang['diffbothnextrev']       = 'Sur ambaŭ flankoj sekva revizio';
+$lang['line']                  = 'Linio';
+$lang['breadcrumb']            = 'Paŝoj:';
+$lang['youarehere']            = 'Vi estas ĉi tie:';
+$lang['lastmod']               = 'Lastaj ŝanĝoj:';
+$lang['by']                    = 'de';
+$lang['deleted']               = 'forigita';
+$lang['created']               = 'kreita';
+$lang['restored']              = 'malnova revizio restarigita (%s)';
+$lang['external_edit']         = 'ekstera redakto';
+$lang['summary']               = 'Bulteno de ŝanĝoj';
+$lang['noflash']               = 'La <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> necesas por montri tiun ĉi enhavon.';
+$lang['download']              = 'Elŝuti eltiraĵon';
+$lang['tools']                 = 'Iloj';
+$lang['user_tools']            = 'Uzantaj iloj';
+$lang['site_tools']            = 'Retejaj iloj';
+$lang['page_tools']            = 'Paĝaj iloj';
+$lang['skip_to_content']       = 'al la enhavo';
+$lang['sidebar']               = 'Flanka strio';
+$lang['mail_newpage']          = 'paĝo aldonita:';
+$lang['mail_changed']          = 'paĝo modifita:';
+$lang['mail_subscribe_list']   = 'ŝanĝitaj paĝoj en nomspaco:';
+$lang['mail_new_user']         = 'Nova uzanto:';
+$lang['mail_upload']           = 'dosiero alŝutita:';
+$lang['changes_type']          = 'Rigardi ŝanĝojn de';
+$lang['pages_changes']         = 'Paĝoj';
+$lang['media_changes']         = 'Mediaj dosieroj';
+$lang['both_changes']          = 'Ambaû - paĝojn kaj mediajn dosierojn';
+$lang['qb_bold']               = 'Dika teksto';
+$lang['qb_italic']             = 'Dekliva teksto';
+$lang['qb_underl']             = 'Substrekita teksto';
+$lang['qb_code']               = 'Koduma teksto';
+$lang['qb_strike']             = 'Trastrekita teksto';
+$lang['qb_h1']                 = 'Titolo de 1-a nivelo';
+$lang['qb_h2']                 = 'Titolo de 2-a nivelo';
+$lang['qb_h3']                 = 'Titolo de 3-a nivelo';
+$lang['qb_h4']                 = 'Titolo de 4-a nivelo';
+$lang['qb_h5']                 = 'Titolo de 5-a nivelo';
+$lang['qb_h']                  = 'Ĉeftitolo';
+$lang['qb_hs']                 = 'Elektu ĉeftitolon';
+$lang['qb_hplus']              = 'Altnivela titolo';
+$lang['qb_hminus']             = 'Subnivela titolo';
+$lang['qb_hequal']             = 'Samnivela titolo';
+$lang['qb_link']               = 'Interna ligilo';
+$lang['qb_extlink']            = 'Ekstera ligilo';
+$lang['qb_hr']                 = 'Horizontala streko';
+$lang['qb_ol']                 = 'Elemento de numerita listo';
+$lang['qb_ul']                 = 'Elemento de ne numerita listo';
+$lang['qb_media']              = 'Aldoni bildojn kaj aliajn dosierojn';
+$lang['qb_sig']                = 'Inkluzivi subskribon';
+$lang['qb_smileys']            = 'Ridetuloj';
+$lang['qb_chars']              = 'Specialaj signaĵoj';
+$lang['upperns']               = 'saltu al la parenca nomspaco';
+$lang['metaedit']              = 'Redakti metadatumaron';
+$lang['metasaveerr']           = 'La konservo de metadatumaro malsukcesis';
+$lang['metasaveok']            = 'La metadatumaro konserviĝis';
+$lang['img_title']             = 'Titolo:';
+$lang['img_caption']           = 'Priskribo:';
+$lang['img_date']              = 'Dato:';
+$lang['img_fname']             = 'Dosiernomo:';
+$lang['img_fsize']             = 'Grandeco:';
+$lang['img_artist']            = 'Fotisto:';
+$lang['img_copyr']             = 'Kopirajtoj:';
+$lang['img_format']            = 'Formato:';
+$lang['img_camera']            = 'Kamerao:';
+$lang['img_keywords']          = 'Ŝlosilvortoj:';
+$lang['img_width']             = 'Larĝeco:';
+$lang['img_height']            = 'Alteco:';
+$lang['subscr_subscribe_success'] = 'Aldonis %s al la abonlisto por %s';
+$lang['subscr_subscribe_error'] = 'Eraro dum aldono de %s al la abonlisto por %s';
+$lang['subscr_subscribe_noaddress'] = 'Ne estas adreso ligita al via ensaluto, ne eblas aldoni vin al la abonlisto';
+$lang['subscr_unsubscribe_success'] = 'Forigis %s de la abonlisto por %s';
+$lang['subscr_unsubscribe_error'] = 'Eraro dum forigo de %s de la abonlisto por %s';
+$lang['subscr_already_subscribed'] = '%s jam estas abonanta al %s';
+$lang['subscr_not_subscribed'] = '%s ne abonas al %s';
+$lang['subscr_m_not_subscribed'] = 'Momente vi ne abonas la aktualan paĝon aŭ nomspacon.';
+$lang['subscr_m_new_header']   = 'Aldoni abonon';
+$lang['subscr_m_current_header'] = 'Momentaj abonoj';
+$lang['subscr_m_unsubscribe']  = 'Malaboni';
+$lang['subscr_m_subscribe']    = 'Aboni';
+$lang['subscr_m_receive']      = 'Ricevi';
+$lang['subscr_style_every']    = 'retpoŝtaĵo pro ĉiu ŝanĝo';
+$lang['subscr_style_digest']   = 'resuma retpoŝtaĵo de ŝanĝoj por ĉiu paĝo (je %.2f tagoj)';
+$lang['subscr_style_list']     = 'listo de ŝanĝitaj paĝoj ekde la lasta retpoŝtaĵo (je %.2f tagoj)';
+$lang['authtempfail']          = 'La identigo de via uzantonomo estas intertempe maldisponebla. Se tiu ĉi situacio daŭros, bonvolu informi la adminstranton de la vikio.';
+$lang['i_chooselang']          = 'Elektu vian lingvon';
+$lang['i_installer']           = 'Instalilo de DokuWiki';
+$lang['i_wikiname']            = 'Nomo de la vikio';
+$lang['i_enableacl']           = 'Ebligi "ACL" (alirkontrolo, rekomendinde)';
+$lang['i_superuser']           = 'Superuzanto';
+$lang['i_problems']            = 'La instalilo trovis kelkajn problemojn, indikitaj sube. Vi ne povas pluiri ĝis ili estos iel korektitaj.';
+$lang['i_modified']            = 'Pro sekureco tiu ĉi instalilo nur funkcias por nova kaj nemodifita DokuWiki-pakaĵo.
+Vi devas aŭ redemeti la dosierojn el la elŝutita pakaĵo aŭ plibone informiĝi pri la instalada procezo.';
+$lang['i_funcna']              = 'La PHP-a funkcio <code>%s</code> ne estas uzebla. Eble via retprovizanto ial malpermesis tion?';
+$lang['i_phpver']              = 'La versio de la PHP <code>%s</code> estas pli malnova ol la bezonata <code>%s</code>. Vi bezonas ĝisdatigi la PHP-an instalon.';
+$lang['i_permfail']            = '<code>%s</code> ne estas skribebla por DokuWiki. Vi devas redifini la permes-atributojn de tiu ĉi dosierujo!';
+$lang['i_confexists']          = '<code>%s</code> jam ekzistas';
+$lang['i_writeerr']            = 'Ne eblas krei "<code>%s</code>". Vi bezonas kontroli la permesojn de la dosier(uj)oj kaj mem krej la dosieron.';
+$lang['i_badhash']             = 'dokuwiki.php ne estas rekonebla aŭ ĝi estas modifita (hash=<code>%s</code>)';
+$lang['i_badval']              = '<code>%s</code> - malvalida aŭ malplena valoro';
+$lang['i_success']             = 'La agordado sukcese kompletiĝis. Vi povas forigi la dosieron nun. Pluiru al <a href="doku.php?id=wiki:welcome">via nova DokuWiki</a>.';
+$lang['i_failure']             = 'Kelkaj eraroj okazis dum la konservo de la agordaj dosieroj. Vi devas senpere korekti ilin antaŭ ol vi povos uzi <a href="doku.php?id=wiki:welcome">vian novan DokuWiki-on</a>.                       ';
+$lang['i_policy']              = 'Komenca ACL-a agordo';
+$lang['i_pol0']                = 'Malferma Vikio (legi, skribi, alŝuti povas ĉiuj)';
+$lang['i_pol1']                = 'Publika Vikio (legi povas ĉiuj, skribi kaj alŝuti povas registritaj uzantoj)';
+$lang['i_pol2']                = 'Ferma Vikio (legi, skribi, alŝuti nur povas registritaj uzantoj)';
+$lang['i_allowreg']            = 'Permesi al uzantoj registri sin mem';
+$lang['i_retry']               = 'Reprovi';
+$lang['i_license']             = 'Bonvolu elekti la permesilon, sub kiun vi volas meti vian enhavon:';
+$lang['i_license_none']        = 'Ne montri licencinformojn';
+$lang['i_pop_field']           = 'Bonvolu helpi nin plibonigi la DokuWiki-sperton:';
+$lang['i_pop_label']           = 'Sendi unufoje monate anonimajn datumojn pri la uzo al la DokuWiki-evoluigantoj';
+$lang['recent_global']         = 'Vi nun rigardas la ŝanĝojn ene de la nomspaco <b>%s</b>. Vi povas ankaŭ <a href="%s">vidi la freŝajn ŝanĝojn de la tuta vikio</a>.';
+$lang['years']                 = 'antaŭ %d jaroj';
+$lang['months']                = 'antaŭ %d monatoj';
+$lang['weeks']                 = 'antaŭ %d semajnoj';
+$lang['days']                  = 'antaŭ %d tagoj';
+$lang['hours']                 = 'antaŭ %d horoj';
+$lang['minutes']               = 'antaŭ %d minutoj';
+$lang['seconds']               = 'antaŭ %d sekundoj';
+$lang['wordblock']             = 'Via ŝanĝo ne konserviĝis, ĉar ĝi enhavas blokitan tekston (spamon).';
+$lang['media_uploadtab']       = 'Alŝuto';
+$lang['media_searchtab']       = 'Serĉo';
+$lang['media_file']            = 'Dosiero';
+$lang['media_viewtab']         = 'Rigardi';
+$lang['media_edittab']         = 'Modifi';
+$lang['media_historytab']      = 'Historio';
+$lang['media_list_thumbs']     = 'Bildeto';
+$lang['media_list_rows']       = 'Kolumnoj';
+$lang['media_sort_name']       = 'per nomo';
+$lang['media_sort_date']       = 'per dato';
+$lang['media_namespaces']      = 'Elektu nomspacon';
+$lang['media_files']           = 'Dosieroj en %s';
+$lang['media_upload']          = 'Alŝuti al la nomspaco <strong>%s</strong>.';
+$lang['media_search']          = 'Serĉi en la nomspaco <strong>%s</strong>.';
+$lang['media_view']            = '%s';
+$lang['media_viewold']         = '%s ĉe %s';
+$lang['media_edit']            = 'Modifi %s';
+$lang['media_history']         = 'Protokolo de %s';
+$lang['media_meta_edited']     = 'metadatumoj ŝanĝitaj';
+$lang['media_perm_read']       = 'Bedaûrinde viaj rajtoj ne sufiĉas por legi dosierojn.';
+$lang['media_perm_upload']     = 'Bedaûrinde viaj rajtoj ne sufiĉas por alŝuti dosierojn.';
+$lang['media_update']          = 'Alŝuti novan version';
+$lang['media_restore']         = 'Restarigi ĉi tiun version';
+$lang['currentns']             = 'Aktuala nomspaco';
+$lang['searchresult']          = 'Serĉrezulto';
+$lang['plainhtml']             = 'Plena HTML';
+$lang['wikimarkup']            = 'Vikiteksto';
+$lang['email_signature_text']  = 'Tiu ĉi mesaĝo kreiĝis de DokuWiki ĉe
+@DOKUWIKIURL@';
diff --git a/wiki/inc/lang/eo/locked.txt b/wiki/inc/lang/eo/locked.txt
new file mode 100644
index 0000000..abdc059
--- /dev/null
+++ b/wiki/inc/lang/eo/locked.txt
@@ -0,0 +1,3 @@
+====== La paĝo estas ŝlosita ======
+
+Tiu ĉi paĝo nun blokiĝis pro redaktado de iu alia uzanto. Bonvolu atendi ke ŝi/li finu redakti aŭ ke la ŝlosada tempolimo finiĝu.
diff --git a/wiki/inc/lang/eo/login.txt b/wiki/inc/lang/eo/login.txt
new file mode 100644
index 0000000..2b9b343
--- /dev/null
+++ b/wiki/inc/lang/eo/login.txt
@@ -0,0 +1,3 @@
+====== Enirejo ======
+
+Vi ankoraŭ ne identiĝis! Entajpu necesajn informojn sube por identiĝi. Kuketoj (cookies) devas esti ŝaltitaj.
\ No newline at end of file
diff --git a/wiki/inc/lang/eo/mailtext.txt b/wiki/inc/lang/eo/mailtext.txt
new file mode 100644
index 0000000..6c5b80c
--- /dev/null
+++ b/wiki/inc/lang/eo/mailtext.txt
@@ -0,0 +1,12 @@
+Paĝo en via DokuVikio ŝanĝiĝis aŭ aldoniĝis. Jen detaloj:
+
+Dato: @DATE@
+Foliumilo: @BROWSER@
+IP-adreso: @IPADDRESS@
+RetNodo: @HOSTNAME@
+Antaŭa revizio: @OLDPAGE@
+Nova revizio: @NEWPAGE@
+Bulteno de ŝanĝoj: @SUMMARY@
+Uzanto: @USER@
+
+@DIFF@
diff --git a/wiki/inc/lang/eo/mailwrap.html b/wiki/inc/lang/eo/mailwrap.html
new file mode 100644
index 0000000..d257190
--- /dev/null
+++ b/wiki/inc/lang/eo/mailwrap.html
@@ -0,0 +1,13 @@
+<html>
+<head>
+<title>@TITLE@</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+</head>
+<body>
+
+@HTMLBODY@
+
+<br /><hr />
+<small>@EMAILSIGNATURE@</small>
+</body>
+</html>
\ No newline at end of file
diff --git a/wiki/inc/lang/eo/newpage.txt b/wiki/inc/lang/eo/newpage.txt
new file mode 100644
index 0000000..53ab620
--- /dev/null
+++ b/wiki/inc/lang/eo/newpage.txt
@@ -0,0 +1,4 @@
+====== Ĉi tiu paĝo ankoraŭ ne ekzistas ======
+
+Vi sekvis ligilon, kiu kondukas al artikolo ankoraŭ ne ekzistanta. Se vi rajtas, tiam vi povas krei tiun ĉi paĝon premante la butonon "Krei paĝon".
+
diff --git a/wiki/inc/lang/eo/norev.txt b/wiki/inc/lang/eo/norev.txt
new file mode 100644
index 0000000..e951a55
--- /dev/null
+++ b/wiki/inc/lang/eo/norev.txt
@@ -0,0 +1,3 @@
+====== Tiu revizio ne ekzistas ======
+
+La elektita revizio ne ekzistas. Premu butonon "Malnovaj revizioj" por vidi liston de malnovaj revizioj de la dokumento.
diff --git a/wiki/inc/lang/eo/password.txt b/wiki/inc/lang/eo/password.txt
new file mode 100644
index 0000000..6995ec5
--- /dev/null
+++ b/wiki/inc/lang/eo/password.txt
@@ -0,0 +1,6 @@
+Saluton, @FULLNAME@!
+
+Jen viaj uzantodatumoj por @TITLE@ ĉe @DOKUWIKIURL@
+
+Ensalutnomo: @LOGIN@
+Pasvorto: @PASSWORD@
diff --git a/wiki/inc/lang/eo/preview.txt b/wiki/inc/lang/eo/preview.txt
new file mode 100644
index 0000000..b3faef6
--- /dev/null
+++ b/wiki/inc/lang/eo/preview.txt
@@ -0,0 +1,3 @@
+====== Antaŭrigardo ======
+
+Tiu ĉi estas antaŭrigardo de redaktita teksto. Memoru: ĝi ankoraŭ **ne konserviĝis**!
diff --git a/wiki/inc/lang/eo/pwconfirm.txt b/wiki/inc/lang/eo/pwconfirm.txt
new file mode 100644
index 0000000..d6cde8d
--- /dev/null
+++ b/wiki/inc/lang/eo/pwconfirm.txt
@@ -0,0 +1,10 @@
+Saluton, @FULLNAME@!
+
+Iu petis novan pasvorton por via @TITLE@
+ensalutnomo ĉe @DOKUWIKIURL@
+
+Se ne vi petis tion, ignoru tiun ĉi mesaĝon.
+
+Por konfirmi, ke la peto estis vere via, bonvolu musklaki jenan ligilon:
+
+@CONFIRM@
diff --git a/wiki/inc/lang/eo/read.txt b/wiki/inc/lang/eo/read.txt
new file mode 100644
index 0000000..b8c642f
--- /dev/null
+++ b/wiki/inc/lang/eo/read.txt
@@ -0,0 +1,2 @@
+Tiu ĉi paĝo disponiĝas nur por legado (vi ne povas redakti ĝin). Sciigu administranton, se vi opinias ke tio estas falsa malpermeso.
+
diff --git a/wiki/inc/lang/eo/recent.txt b/wiki/inc/lang/eo/recent.txt
new file mode 100644
index 0000000..2454ea6
--- /dev/null
+++ b/wiki/inc/lang/eo/recent.txt
@@ -0,0 +1,3 @@
+====== Freŝaj Ŝanĝoj ======
+
+Jenaj paĝoj ŝanĝiĝis antaŭ nelonge:
diff --git a/wiki/inc/lang/eo/register.txt b/wiki/inc/lang/eo/register.txt
new file mode 100644
index 0000000..10b303d
--- /dev/null
+++ b/wiki/inc/lang/eo/register.txt
@@ -0,0 +1,4 @@
+====== Registriĝi ======
+
+Entajpu necesajn informojn por enregistriĝi. Certiĝu ke via retpoŝta adreso estas vera, ĉar ni sendos al ĝi vian pasvorton.
+
diff --git a/wiki/inc/lang/eo/registermail.txt b/wiki/inc/lang/eo/registermail.txt
new file mode 100644
index 0000000..b9c3870
--- /dev/null
+++ b/wiki/inc/lang/eo/registermail.txt
@@ -0,0 +1,10 @@
+Nova uzanto registriĝis. Jen la detaloj:
+
+Uzantonomo: @NEWUSER@
+Kompleta nomo: @NEWNAME@
+Retadreso: @NEWEMAIL@
+
+Dato: @DATE@
+Foliumilo: @BROWSER@
+IP-Adreso: @IPADDRESS@
+Provizanto: @HOSTNAME@
diff --git a/wiki/inc/lang/eo/resendpwd.txt b/wiki/inc/lang/eo/resendpwd.txt
new file mode 100644
index 0000000..556477a
--- /dev/null
+++ b/wiki/inc/lang/eo/resendpwd.txt
@@ -0,0 +1,3 @@
+====== Sendi novan pasvorton ======
+
+Bonvolu meti vian uzantonomon en la suban formularon petante novan pasvorton por via aliĝo en tiu ĉi vikio. Konfirma ligilo sendaiĝos al via registrita retadreso.
diff --git a/wiki/inc/lang/eo/resetpwd.txt b/wiki/inc/lang/eo/resetpwd.txt
new file mode 100644
index 0000000..442a7ac
--- /dev/null
+++ b/wiki/inc/lang/eo/resetpwd.txt
@@ -0,0 +1,4 @@
+====== Difini novan pasvorton ======
+
+
+Bonvolu indiki novan pasvorton por via konto en tiu ĉi vikio.
\ No newline at end of file
diff --git a/wiki/inc/lang/eo/revisions.txt b/wiki/inc/lang/eo/revisions.txt
new file mode 100644
index 0000000..4f37bb1
--- /dev/null
+++ b/wiki/inc/lang/eo/revisions.txt
@@ -0,0 +1,3 @@
+====== Malnovaj revizioj ======
+
+Sube estas listo de malnovaj revizioj de la dokumento. Elektu revizion se vi volas rigardi ĝin aŭ anstataŭigi kurantan paĝon per ĝi.
\ No newline at end of file
diff --git a/wiki/inc/lang/eo/searchpage.txt b/wiki/inc/lang/eo/searchpage.txt
new file mode 100644
index 0000000..20711c2
--- /dev/null
+++ b/wiki/inc/lang/eo/searchpage.txt
@@ -0,0 +1,4 @@
+====== Serĉo ======
+
+Sube estas rezultoj de serĉo en la retejo. @CREATEPAGEINFO@
+
diff --git a/wiki/inc/lang/eo/showrev.txt b/wiki/inc/lang/eo/showrev.txt
new file mode 100644
index 0000000..3ece4f2
--- /dev/null
+++ b/wiki/inc/lang/eo/showrev.txt
@@ -0,0 +1,2 @@
+**Tiu estas malnova revizio de la dokumento**. Klaku sur titolon por ricevi kurantan version.
+----
diff --git a/wiki/inc/lang/eo/stopwords.txt b/wiki/inc/lang/eo/stopwords.txt
new file mode 100644
index 0000000..d27c569
--- /dev/null
+++ b/wiki/inc/lang/eo/stopwords.txt
@@ -0,0 +1,20 @@
+# Jen listo de vortoj, kiujn la indeksilo ignoras, unu vorton po linio
+# Kiam vi modifas la dosieron, estu certa ke vi uzas UNIX-stilajn linifinaĵojn (unuopa novlinio)
+# Ne enmetu vortojn malpli longajn ol 3 literoj - tiuj ĉiukaze ignoriĝas
+pri
+estas
+kaj
+mia
+via
+ili
+ilia
+kun
+por
+kiel
+tiu
+estis
+kio
+kiam
+kie
+kiu
+www
diff --git a/wiki/inc/lang/eo/subscr_digest.txt b/wiki/inc/lang/eo/subscr_digest.txt
new file mode 100644
index 0000000..7e5310a
--- /dev/null
+++ b/wiki/inc/lang/eo/subscr_digest.txt
@@ -0,0 +1,16 @@
+Saluton!
+
+La paĝo @PAGE@ en la vikio @TITLE@ ŝanĝiĝis.
+Jen sekvas la ŝanĝoj:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Malnova versio: @OLDPAGE@
+Nova versio: @NEWPAGE@
+
+Por nuligi la paĝinformojn, ensalutu la vikion ĉe
+@DOKUWIKIURL@, poste iru al
+@SUBSCRIBE@
+kaj malabonu la paĝajn kaj/aŭ nomspacajn ŝanĝojn.
diff --git a/wiki/inc/lang/eo/subscr_form.txt b/wiki/inc/lang/eo/subscr_form.txt
new file mode 100644
index 0000000..259b210
--- /dev/null
+++ b/wiki/inc/lang/eo/subscr_form.txt
@@ -0,0 +1,3 @@
+====== Abona administrado ======
+
+Tiu paĝo lasas vin administri viajn abonojn por la aktualaj paĝo kaj nomspaco.
\ No newline at end of file
diff --git a/wiki/inc/lang/eo/subscr_list.txt b/wiki/inc/lang/eo/subscr_list.txt
new file mode 100644
index 0000000..ed0c809
--- /dev/null
+++ b/wiki/inc/lang/eo/subscr_list.txt
@@ -0,0 +1,13 @@
+Saluton!
+
+Paĝoj en la nomspaco @PAGE@ en la vikio @TITLE@ ŝanĝiĝis.
+Jen sekvas la ŝanĝitaj paĝoj:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Por nuligi la paĝinformojn, ensalutu la vikion ĉe
+@DOKUWIKIURL@, poste iru al
+@SUBSCRIBE@
+kaj malabonu la paĝajn kaj/aŭ nomspacajn ŝanĝojn.
diff --git a/wiki/inc/lang/eo/subscr_single.txt b/wiki/inc/lang/eo/subscr_single.txt
new file mode 100644
index 0000000..56d489c
--- /dev/null
+++ b/wiki/inc/lang/eo/subscr_single.txt
@@ -0,0 +1,19 @@
+Saluton!
+
+La paĝo @PAGE@ en la vikio @TITLE@ ŝanĝiĝis.
+Jen sekvas la ŝanĝoj:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Dato: @DATE@
+Uzanto: @USER@
+Modifa resumo: @SUMMARY@
+Malnova versio: @OLDPAGE@
+Nova versio: @NEWPAGE@
+
+Por nuligi la paĝinformojn, ensalutu la vikion ĉe
+@DOKUWIKIURL@, poste iru al
+@SUBSCRIBE@
+kaj malabonu la paĝajn kaj/aŭ nomspacajn ŝanĝojn.
diff --git a/wiki/inc/lang/eo/updateprofile.txt b/wiki/inc/lang/eo/updateprofile.txt
new file mode 100644
index 0000000..4b52ff2
--- /dev/null
+++ b/wiki/inc/lang/eo/updateprofile.txt
@@ -0,0 +1,3 @@
+====== Ĝisdatigi vian profilon ======
+
+Vi nur kompletigu tiujn kampojn, kiujn vi deziras ŝanĝi. Vi ne povas ŝanĝi vian uzantonomon.
diff --git a/wiki/inc/lang/eo/uploadmail.txt b/wiki/inc/lang/eo/uploadmail.txt
new file mode 100644
index 0000000..6268824
--- /dev/null
+++ b/wiki/inc/lang/eo/uploadmail.txt
@@ -0,0 +1,10 @@
+Dosiero alŝutiĝis al via DokuVikio. Jen detaloj:
+
+Dosiero: @MEDIA@
+Dato: @DATE@
+Foliumilo: @BROWSER@
+IP-Adreso: @IPADDRESS@
+Ret-nodo: @HOSTNAME@
+Grandeco: @SIZE@
+Dosier-tipo: @MIME@
+Uzanto: @USER@
diff --git a/wiki/inc/lang/es/admin.txt b/wiki/inc/lang/es/admin.txt
new file mode 100644
index 0000000..320b1c5
--- /dev/null
+++ b/wiki/inc/lang/es/admin.txt
@@ -0,0 +1,3 @@
+====== Administración ======
+
+Abajo puedes encontrar una lista de las tareas de administración disponibles en Dokuwiki.
diff --git a/wiki/inc/lang/es/adminplugins.txt b/wiki/inc/lang/es/adminplugins.txt
new file mode 100644
index 0000000..8e1b0f8
--- /dev/null
+++ b/wiki/inc/lang/es/adminplugins.txt
@@ -0,0 +1 @@
+===== Plugins Adicionales =====
\ No newline at end of file
diff --git a/wiki/inc/lang/es/backlinks.txt b/wiki/inc/lang/es/backlinks.txt
new file mode 100644
index 0000000..4de93ef
--- /dev/null
+++ b/wiki/inc/lang/es/backlinks.txt
@@ -0,0 +1,4 @@
+====== Referencias ======
+
+Esta es una lista de páginas que parecen hacer referencia a la página actual.
+
diff --git a/wiki/inc/lang/es/conflict.txt b/wiki/inc/lang/es/conflict.txt
new file mode 100644
index 0000000..265ac1e
--- /dev/null
+++ b/wiki/inc/lang/es/conflict.txt
@@ -0,0 +1,5 @@
+====== Existe una versión más reciente ======
+
+Existe una versión más reciente del documento que has editado. Esto sucede cuando otro usuario ha modificado el documento mientras lo estabas editando.
+
+Examina las diferencias mostradas abajo a fondo, y decide entonces cual conservar. Si eliges ''Guardar'', tu versión será guardada. Si eliges ''Cancelar'' se guardará la actual versión.
\ No newline at end of file
diff --git a/wiki/inc/lang/es/denied.txt b/wiki/inc/lang/es/denied.txt
new file mode 100644
index 0000000..02a76a8
--- /dev/null
+++ b/wiki/inc/lang/es/denied.txt
@@ -0,0 +1,4 @@
+====== Permiso Denegado ======
+
+Lo siento, no tienes suficientes permisos para continuar.
+
diff --git a/wiki/inc/lang/es/diff.txt b/wiki/inc/lang/es/diff.txt
new file mode 100644
index 0000000..e0e9e08
--- /dev/null
+++ b/wiki/inc/lang/es/diff.txt
@@ -0,0 +1,4 @@
+====== Diferencias ======
+
+Muestra las diferencias entre dos versiones de la página.
+
diff --git a/wiki/inc/lang/es/draft.txt b/wiki/inc/lang/es/draft.txt
new file mode 100644
index 0000000..054d618
--- /dev/null
+++ b/wiki/inc/lang/es/draft.txt
@@ -0,0 +1,6 @@
+====== Fichero borrador encontrado ======
+
+Su última sesión de edición en esta página no se completó correctamente. DokuWiki guardó automáticamente un borrador mientras usted trabajaba; puede utilizar el borrador para continuar editándolo. Abajo se ven los datos que fueron guardados en su última sesión.
+
+Por favor decida si desea //recuperar// su sesión perdida, //eliminar// el borrador guardado automáticamente o //cancelar// el proceso de edición.
+
diff --git a/wiki/inc/lang/es/edit.txt b/wiki/inc/lang/es/edit.txt
new file mode 100644
index 0000000..4ed253b
--- /dev/null
+++ b/wiki/inc/lang/es/edit.txt
@@ -0,0 +1,2 @@
+Edita la página y pulsa ''Guardar''. Vaya a [[wiki:syntax]] para ver la sintaxis del Wiki. Por favor edite la página solo si puedes **mejorarla**. Si quieres probar algo relacionado a la sintaxis, aprende a dar tus primeros pasos en el [[playground:playground]].
+
diff --git a/wiki/inc/lang/es/editrev.txt b/wiki/inc/lang/es/editrev.txt
new file mode 100644
index 0000000..4b587b7
--- /dev/null
+++ b/wiki/inc/lang/es/editrev.txt
@@ -0,0 +1,2 @@
+**Has cargado una revisión vieja del documento!** Si la guardas crearás una versión nueva con estos datos.
+----
\ No newline at end of file
diff --git a/wiki/inc/lang/es/index.txt b/wiki/inc/lang/es/index.txt
new file mode 100644
index 0000000..148e5f4
--- /dev/null
+++ b/wiki/inc/lang/es/index.txt
@@ -0,0 +1,4 @@
+====== Índice ======
+
+Este es un índice de todas las páginas disponibles ordenado por [[doku>namespaces|espacios de nombres]].
+
diff --git a/wiki/inc/lang/es/install.html b/wiki/inc/lang/es/install.html
new file mode 100644
index 0000000..94680bb
--- /dev/null
+++ b/wiki/inc/lang/es/install.html
@@ -0,0 +1,14 @@
+<p>Esta página lo asiste en la primera vez que instala y configura
+<a href="http://dokuwiki.org">Dokuwiki</a>.
+Más información sobre este instalador está disponible en la
+<a href="http://dokuwiki.org/installer">página de documentación</a>.
+</p>
+
+<p>DokuWiki usa ficheros comunes para el almacenamiento de las páginas del wiki y otra información asociada a esas páginas (por ejemplo, imágenes, índices de archivos, revisiones viejas, etc). Para funcionar correctamente DokuWiki <strong>debe</strong> tener permisos de escritura en los directorios que contienen esos ficheros. Este instalador no es capaz de establecer permisos en directorios. Normalmente eso debe ser hecho a través de una consola de comandos o si usted usa servicios de hosting a través de FTP o el panel de control brindado por su hosting (e.g. cPanel).</p>
+
+<p>Este instalador configurará una <abbr title="lista de control de acceso">ACL</abbr>, que a su vez permite el acceso al administrador y acceso a los menúes de administración para instalación
+de plugins, administración de usuarios, administración de permisos para las páginas wiki y modificación de la configuración. A pesar que no es necesario para que DokuWiki funcione, hará que sea más fácil la administración.</p>
+
+<p>Usuarios experimentados o usuarios con requerimientos especiales deben usar estos enlaces para detalles concernientes a
+<a href="http://dokuwiki.org/install">instrucciones de instalación</a>
+y <a href="http://dokuwiki.org/config">configuración</a>.</p>
diff --git a/wiki/inc/lang/es/jquery.ui.datepicker.js b/wiki/inc/lang/es/jquery.ui.datepicker.js
new file mode 100644
index 0000000..ea7116e
--- /dev/null
+++ b/wiki/inc/lang/es/jquery.ui.datepicker.js
@@ -0,0 +1,37 @@
+/* Inicialización en español para la extensión 'UI date picker' para jQuery. */
+/* Traducido por Vester (xvester@gmail.com). */
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "../widgets/datepicker" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery.datepicker );
+	}
+}( function( datepicker ) {
+
+datepicker.regional.es = {
+	closeText: "Cerrar",
+	prevText: "&#x3C;Ant",
+	nextText: "Sig&#x3E;",
+	currentText: "Hoy",
+	monthNames: [ "enero","febrero","marzo","abril","mayo","junio",
+	"julio","agosto","septiembre","octubre","noviembre","diciembre" ],
+	monthNamesShort: [ "ene","feb","mar","abr","may","jun",
+	"jul","ago","sep","oct","nov","dic" ],
+	dayNames: [ "domingo","lunes","martes","miércoles","jueves","viernes","sábado" ],
+	dayNamesShort: [ "dom","lun","mar","mié","jue","vie","sáb" ],
+	dayNamesMin: [ "D","L","M","X","J","V","S" ],
+	weekHeader: "Sm",
+	dateFormat: "dd/mm/yy",
+	firstDay: 1,
+	isRTL: false,
+	showMonthAfterYear: false,
+	yearSuffix: "" };
+datepicker.setDefaults( datepicker.regional.es );
+
+return datepicker.regional.es;
+
+} ) );
diff --git a/wiki/inc/lang/es/lang.php b/wiki/inc/lang/es/lang.php
new file mode 100644
index 0000000..41b6cf8
--- /dev/null
+++ b/wiki/inc/lang/es/lang.php
@@ -0,0 +1,395 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Domingo Redal <docxml@gmail.com>
+ * @author Zigor Astarbe <zigor@astarbe.com>
+ * @author Adrián Ariza <adrian_ariza.ciudad.com.ar>
+ * @author Gabiel Molina <gabriel191@gmail.com>
+ * @author Paco Avila <monkiki@gmail.com>
+ * @author Bernardo Arlandis Mañó <bernardo@tsolucio.com>
+ * @author Miguel Pagano <miguel.pagano@gmail.com>
+ * @author Oscar M. Lage <r0sk10@gmail.com>
+ * @author Gabriel Castillo <gch@pumas.ii.unam.mx>
+ * @author oliver <oliver@samera.com.py>
+ * @author Enrico Nicoletto <liverig@gmail.com>
+ * @author Manuel Meco <manuel.meco@gmail.com>
+ * @author Jordan Mero <hack.jord@gmail.com>
+ * @author Felipe Martinez <metalmartinez@gmail.com>
+ * @author Javier Aranda <internet@javierav.com>
+ * @author Zerial <fernando@zerial.org>
+ * @author Marvin Ortega <maty1206@maryanlinux.com>
+ * @author Daniel Castro Alvarado <dancas2@gmail.com>
+ * @author Fernando J. Gómez <fjgomez@gmail.com>
+ * @author Victor Castelan <victorcastelan@gmail.com>
+ * @author Mauro Javier Giamberardino <mgiamberardino@gmail.com>
+ * @author emezeta <emezeta@infoprimo.com>
+ * @author Oscar Ciudad <oscar@jacho.net>
+ * @author Ruben Figols <ruben.figols@gmail.com>
+ * @author Gerardo Zamudio <gerardo@gerardozamudio.net>
+ * @author Mercè López <mercelz@gmail.com>
+ * @author monica <may.dorado@gmail.com>
+ * @author Antonio Bueno <atnbueno@gmail.com>
+ * @author Juan De La Cruz <juann.dlc@gmail.com>
+ * @author Fernando <fdiezala@gmail.com>
+ * @author Eloy <ej.perezgomez@gmail.com>
+ * @author Antonio Castilla <antoniocastilla@trazoide.com>
+ * @author Jonathan Hernández <me@jhalicea.com>
+ * @author pokesakura <pokesakura@gmail.com>
+ * @author Álvaro Iradier <airadier@gmail.com>
+ * @author Alejandro Nunez <nunez.alejandro@gmail.com>
+ * @author Mauricio Segura <maose38@yahoo.es>
+ * @author solohazlo <solohhazlo@gmail.com>
+ * @author Romano <romanocl@outlook.com>
+ * @author David Roy <davidroyapp@gmail.com>
+ * @author Enny Rodriguez <aquilez.4@gmail.com>
+ */
+$lang['encoding']              = 'utf-8';
+$lang['direction']             = 'ltr';
+$lang['doublequoteopening']    = '“';
+$lang['doublequoteclosing']    = '”';
+$lang['singlequoteopening']    = '‘';
+$lang['singlequoteclosing']    = '’';
+$lang['apostrophe']            = '’';
+$lang['btn_edit']              = 'Editar esta página';
+$lang['btn_source']            = 'Ver la fuente de esta página';
+$lang['btn_show']              = 'Ver página';
+$lang['btn_create']            = 'Crear esta página';
+$lang['btn_search']            = 'Buscar';
+$lang['btn_save']              = 'Guardar';
+$lang['btn_preview']           = 'Previsualización';
+$lang['btn_top']               = 'Volver arriba';
+$lang['btn_newer']             = '<< más reciente';
+$lang['btn_older']             = 'menos reciente >>';
+$lang['btn_revs']              = 'Revisiones antiguas';
+$lang['btn_recent']            = 'Cambios recientes';
+$lang['btn_upload']            = 'Cargar';
+$lang['btn_cancel']            = 'Cancelar';
+$lang['btn_index']             = 'Índice';
+$lang['btn_secedit']           = 'Editar';
+$lang['btn_login']             = 'Conectarse';
+$lang['btn_logout']            = 'Desconectarse';
+$lang['btn_admin']             = 'Administrar';
+$lang['btn_update']            = 'Actualizar';
+$lang['btn_delete']            = 'Borrar';
+$lang['btn_back']              = 'Atrás';
+$lang['btn_backlink']          = 'Enlaces a esta página';
+$lang['btn_subscribe']         = 'Suscribirse a cambios de la página';
+$lang['btn_profile']           = 'Actualizar perfil';
+$lang['btn_reset']             = 'Restablecer';
+$lang['btn_resendpwd']         = 'Establecer nueva contraseña';
+$lang['btn_draft']             = 'Editar borrador';
+$lang['btn_recover']           = 'Recuperar borrador';
+$lang['btn_draftdel']          = 'Eliminar borrador';
+$lang['btn_revert']            = 'Restaurar';
+$lang['btn_register']          = 'Registrarse';
+$lang['btn_apply']             = 'Aplicar';
+$lang['btn_media']             = 'Administrador de Ficheros';
+$lang['btn_deleteuser']        = 'Elimina Mi Cuenta';
+$lang['btn_img_backto']        = 'Volver a %s';
+$lang['btn_mediaManager']      = 'Ver en el administrador de ficheros';
+$lang['loggedinas']            = 'Conectado como:';
+$lang['user']                  = 'Usuario';
+$lang['pass']                  = 'Contraseña';
+$lang['newpass']               = 'Nueva contraseña';
+$lang['oldpass']               = 'Confirma tu contraseña actual';
+$lang['passchk']               = 'otra vez';
+$lang['remember']              = 'Recordarme';
+$lang['fullname']              = 'Nombre real';
+$lang['email']                 = 'E-Mail';
+$lang['profile']               = 'Perfil del usuario';
+$lang['badlogin']              = 'Lo siento, el usuario o la contraseña es incorrecto.';
+$lang['badpassconfirm']        = 'Lo siento, la contraseña es errónea';
+$lang['minoredit']             = 'Cambios menores';
+$lang['draftdate']             = 'Borrador guardado automáticamente:';
+$lang['nosecedit']             = 'La página ha cambiado en el lapso, la información de sección estaba anticuada, en su lugar se cargó la página completa.';
+$lang['searchcreatepage']      = 'Si no encontró lo que estaba buscando, puede crear o editar la página %s, nombrada después de su consulta.';
+$lang['search_fullresults']    = 'Resultados de texto completo';
+$lang['js']['search_toggle_tools'] = 'Alternar herramientas de búsqueda';
+$lang['js']['willexpire']      = 'El bloqueo para la edición de esta página expira en un minuto.\nPAra prevenir conflictos uso el botón Previsualizar para restaurar el contador de bloqueo.';
+$lang['js']['notsavedyet']     = 'Los cambios que no se han guardado se perderán.
+¿Realmente quieres continuar?';
+$lang['js']['searchmedia']     = 'Buscar archivos';
+$lang['js']['keepopen']        = 'Mantener la ventana abierta luego de seleccionar';
+$lang['js']['hidedetails']     = 'Ocultar detalles';
+$lang['js']['mediatitle']      = 'Configuración del vínculo';
+$lang['js']['mediadisplay']    = 'Tipo de vínculo';
+$lang['js']['mediaalign']      = 'Alineación';
+$lang['js']['mediasize']       = 'Tamaño de la imagen';
+$lang['js']['mediatarget']     = 'Destino del vínculo';
+$lang['js']['mediaclose']      = 'Cerrar';
+$lang['js']['mediainsert']     = 'Insertar';
+$lang['js']['mediadisplayimg'] = 'Mostrar la imagen.';
+$lang['js']['mediadisplaylnk'] = 'Mostrar solo el vínculo.';
+$lang['js']['mediasmall']      = 'Versión en tamaño pequeño';
+$lang['js']['mediamedium']     = 'Versión en tamaño medio';
+$lang['js']['medialarge']      = 'Versión en tamaño grande';
+$lang['js']['mediaoriginal']   = 'Versión original';
+$lang['js']['medialnk']        = 'Vínculo a la pagina de descripción';
+$lang['js']['mediadirect']     = 'Vínculo al original';
+$lang['js']['medianolnk']      = 'Sin vínculo';
+$lang['js']['medianolink']     = 'No vincular la imagen';
+$lang['js']['medialeft']       = 'Alinear imagen a la izquierda';
+$lang['js']['mediaright']      = 'Alinear imagen a la derecha.';
+$lang['js']['mediacenter']     = 'Alinear imagen en el centro.';
+$lang['js']['medianoalign']    = 'No use alineación.';
+$lang['js']['nosmblinks']      = 'El enlace a recursos compartidos de Windows sólo funciona en Microsoft Internet Explorer.
+Lo que sí puedes hacer es copiar y pegar el enlace.';
+$lang['js']['linkwiz']         = 'Asistente de enlaces';
+$lang['js']['linkto']          = 'Enlazar a:';
+$lang['js']['del_confirm']     = '¿Quieres realmente borrar lo seleccionado?';
+$lang['js']['restore_confirm'] = '¿Estás seguro de querer restaurar esta versión?';
+$lang['js']['media_diff']      = 'Ver diferencias:';
+$lang['js']['media_diff_both'] = 'Lado por lado';
+$lang['js']['media_diff_opacity'] = 'A través de Shine';
+$lang['js']['media_diff_portions'] = 'Pasar';
+$lang['js']['media_select']    = 'Seleccionar ficheros';
+$lang['js']['media_upload_btn'] = 'Cargar';
+$lang['js']['media_done_btn']  = 'Hecho';
+$lang['js']['media_drop']      = 'Arrastra los ficheros aquí para cargar';
+$lang['js']['media_cancel']    = 'Eliminar';
+$lang['js']['media_overwrt']   = 'Sobreescribir ficheros exitentes';
+$lang['search_exact_match']    = 'Coincidencia exacta';
+$lang['search_starts_with']    = 'Comienza con';
+$lang['search_ends_with']      = 'Termina con';
+$lang['search_contains']       = 'Contiene';
+$lang['search_custom_match']   = 'Personalizado';
+$lang['search_any_ns']         = 'Cualquier espacio de nombres';
+$lang['search_any_time']       = 'En cualquier momento';
+$lang['search_past_7_days']    = 'La semana pasada';
+$lang['search_past_month']     = 'El mes pasado';
+$lang['search_past_year']      = 'El año pasado';
+$lang['search_sort_by_hits']   = 'Ordenar por relevancia';
+$lang['search_sort_by_mtime']  = 'Ordenar por la última modificación';
+$lang['regmissing']            = 'Lo siento, tienes que completar todos los campos.';
+$lang['reguexists']            = 'Lo siento, ya existe un usuario con este nombre.';
+$lang['regsuccess']            = 'El usuario ha sido creado y la contraseña se ha enviado por correo.';
+$lang['regsuccess2']           = 'El usuario ha sido creado.';
+$lang['regfail']               = 'No se pudo crear el usuario.';
+$lang['regmailfail']           = 'Parece que ha habido un error al enviar el correo con la contraseña. ¡Por favor, contacta al administrador!';
+$lang['regbadmail']            = 'La dirección de correo no parece válida. Si piensas que esto es un error, contacta al administrador';
+$lang['regbadpass']            = 'Las dos contraseñas no son iguales, por favor inténtalo de nuevo.';
+$lang['regpwmail']             = 'Tu contraseña de DokuWiki';
+$lang['reghere']               = '¿No tienes una cuenta todavía? Consigue una';
+$lang['profna']                = 'Este wiki no permite la modificación del perfil';
+$lang['profnochange']          = 'Sin cambios, nada que hacer.';
+$lang['profnoempty']           = 'No se permite que el nombre o la dirección de correo electrónico estén vacíos.';
+$lang['profchanged']           = 'Se actualizó correctamente el perfil del usuario.';
+$lang['profnodelete']          = 'Este wiki no soporta el borrado de usuarios';
+$lang['profdeleteuser']        = 'Eliminar Cuenta';
+$lang['profdeleted']           = 'Tu cuenta de usuario ha sido eliminada de este wiki';
+$lang['profconfdelete']        = 'Deseo eliminar mi cuenta de este wiki. <br /> Esta acción es irreversible.';
+$lang['profconfdeletemissing'] = 'Casilla de verificación no activada.';
+$lang['proffail']              = 'No se ha actualizado el perfil del usuario.';
+$lang['pwdforget']             = '¿Has olvidado tu contraseña? Consigue una nueva';
+$lang['resendna']              = 'Este wiki no brinda la posibilidad de reenvío de contraseña.';
+$lang['resendpwd']             = 'Establecer nueva contraseña para';
+$lang['resendpwdmissing']      = 'Lo siento, debes completar todos los campos.';
+$lang['resendpwdnouser']       = 'Lo siento, no se encuentra este usuario en nuestra base de datos.';
+$lang['resendpwdbadauth']      = 'Lo siento, este código de autenticación no es válido. Asegúrate de haber usado el enlace de confirmación entero.';
+$lang['resendpwdconfirm']      = 'Un enlace para confirmación ha sido enviado por correo electrónico.';
+$lang['resendpwdsuccess']      = 'Tu nueva contraseña ha sido enviada por correo electrónico.';
+$lang['license']               = 'Excepto donde se indique lo contrario, el contenido de este wiki esta bajo la siguiente licencia:';
+$lang['licenseok']             = 'Nota: Al editar esta página, estás de acuerdo en autorizar su contenido bajo la siguiente licencia:';
+$lang['searchmedia']           = 'Buscar archivo:';
+$lang['searchmedia_in']        = 'Buscar en %s';
+$lang['txt_upload']            = 'Selecciona el archivo a subir:';
+$lang['txt_filename']          = 'Subir como (opcional):';
+$lang['txt_overwrt']           = 'Sobreescribir archivo existente';
+$lang['maxuploadsize']         = 'Peso máximo de %s por archivo';
+$lang['lockedby']              = 'Actualmente bloqueado por:';
+$lang['lockexpire']            = 'El bloqueo expira en:';
+$lang['rssfailed']             = 'Se ha producido un error mientras se leían los datos de este feed: ';
+$lang['nothingfound']          = 'No se ha encontrado nada.';
+$lang['mediaselect']           = 'Archivos Multimedia';
+$lang['uploadsucc']            = 'El archivo se ha subido satisfactoriamente';
+$lang['uploadfail']            = 'La subida del fichero ha fallado. ¿Permisos equivocados?';
+$lang['uploadwrong']           = 'Subida de fichero denegada. ¡Los ficheros con esta extensión están prohibidos!';
+$lang['uploadexist']           = 'El fichero ya existe. No se ha hecho nada.';
+$lang['uploadbadcontent']      = 'El contenido de la subida no coincide con la extensión de fichero %s';
+$lang['uploadspam']            = 'La subida ha sido bloqueada por una lista negra de spam';
+$lang['uploadxss']             = 'La subida ha sido bloqueada por contenido posiblemente malicioso';
+$lang['uploadsize']            = 'El fichero subido es demasiado grande. (max. %s)';
+$lang['deletesucc']            = 'El fichero "%s" ha sido borrado.';
+$lang['deletefail']            = '"%s" no pudo ser borrado; verifique los permisos.';
+$lang['mediainuse']            = 'El fichero "%s" no ha sido borrado, aún está en uso.';
+$lang['namespaces']            = 'Espacios de nombres';
+$lang['mediafiles']            = 'Ficheros disponibles en';
+$lang['accessdenied']          = 'No tiene permisos para ver esta página.';
+$lang['mediausage']            = 'Use la siguiente sintaxis para hacer referencia a este fichero:';
+$lang['mediaview']             = 'Ver el fichero original';
+$lang['mediaroot']             = 'root';
+$lang['mediaupload']           = 'Subir aquí un fichero al espacio de nombres actual. Para crear sub-espacios de nombres, antepóngalos al nombre de fichero separándolos por dos puntos (:) en "Subir como".';
+$lang['mediaextchange']        = 'Extensión del fichero cambiada de .%s a .%s!';
+$lang['reference']             = 'Referencias para';
+$lang['ref_inuse']             = 'El fichero no puede ser borrado, porque todavía se está usando en las siguientes páginas:';
+$lang['ref_hidden']            = 'Algunas referencias están en páginas sobre las que no tienes permiso de lectura';
+$lang['hits']                  = 'Entradas';
+$lang['quickhits']             = 'Páginas que coinciden';
+$lang['toc']                   = 'Tabla de Contenidos';
+$lang['current']               = 'actual';
+$lang['yours']                 = 'Tu versión';
+$lang['diff']                  = 'Muestra diferencias a la versión actual';
+$lang['diff2']                 = 'Muestra las diferencias entre las revisiones seleccionadas';
+$lang['difflink']              = 'Enlace a la vista de comparación';
+$lang['diff_type']             = 'Ver diferencias';
+$lang['diff_inline']           = 'En línea';
+$lang['diff_side']             = 'Lado a lado';
+$lang['diffprevrev']           = 'Revisión previa';
+$lang['diffnextrev']           = 'Próxima revisión';
+$lang['difflastrev']           = 'Última revisión';
+$lang['diffbothprevrev']       = 'Ambos lados, revisión anterior';
+$lang['diffbothnextrev']       = 'Ambos lados, revisión siguiente';
+$lang['line']                  = 'Línea';
+$lang['breadcrumb']            = 'Traza:';
+$lang['youarehere']            = 'Estás aquí:';
+$lang['lastmod']               = 'Última modificación:';
+$lang['by']                    = 'por';
+$lang['deleted']               = 'borrado';
+$lang['created']               = 'creado';
+$lang['restored']              = 'se ha restaurado la vieja versión (%s)';
+$lang['external_edit']         = 'editor externo';
+$lang['summary']               = 'Resumen de la edición';
+$lang['noflash']               = 'Para mostrar este contenido es necesario el <a href="http://www.adobe.com/products/flashplayer/">Plugin Adobe Flash</a>.';
+$lang['download']              = 'Descargar trozo de código fuente';
+$lang['tools']                 = 'Herramientas';
+$lang['user_tools']            = 'Herramientas de usuario';
+$lang['site_tools']            = 'Herramientas del sitio';
+$lang['page_tools']            = 'Herramientas de la página';
+$lang['skip_to_content']       = 'Saltar a contenido';
+$lang['sidebar']               = 'Barra lateral';
+$lang['mail_newpage']          = 'página añadida:';
+$lang['mail_changed']          = 'página cambiada:';
+$lang['mail_subscribe_list']   = 'páginas cambiadas en el espacio de nombre:';
+$lang['mail_new_user']         = 'nuevo usuario:';
+$lang['mail_upload']           = 'archivo subido:';
+$lang['changes_type']          = 'Ver cambios de';
+$lang['pages_changes']         = 'Páginas';
+$lang['media_changes']         = 'Archivos multimedia';
+$lang['both_changes']          = 'Ambas páginas y archivos multimedia';
+$lang['qb_bold']               = 'Negrita';
+$lang['qb_italic']             = 'Itálica';
+$lang['qb_underl']             = 'Subrayado';
+$lang['qb_code']               = 'Código';
+$lang['qb_strike']             = 'Tachado';
+$lang['qb_h1']                 = 'Título 1';
+$lang['qb_h2']                 = 'Título 2';
+$lang['qb_h3']                 = 'Título 3';
+$lang['qb_h4']                 = 'Título 4';
+$lang['qb_h5']                 = 'Título 5';
+$lang['qb_h']                  = 'Título';
+$lang['qb_hs']                 = 'Selecciona el título';
+$lang['qb_hplus']              = 'Título alto';
+$lang['qb_hminus']             = 'Título bajo';
+$lang['qb_hequal']             = 'Título del mismo nivel';
+$lang['qb_link']               = 'Enlace interno';
+$lang['qb_extlink']            = 'Enlace externo';
+$lang['qb_hr']                 = 'Línea horizontal';
+$lang['qb_ol']                 = 'Ítem de lista ordenada';
+$lang['qb_ul']                 = 'Ítem de lista desordenada';
+$lang['qb_media']              = 'Añadir Imágenes u otros ficheros';
+$lang['qb_sig']                = 'Insertar firma';
+$lang['qb_smileys']            = 'Sonrisas';
+$lang['qb_chars']              = 'Caracteres especiales';
+$lang['upperns']               = 'Saltar al espacio de nombres superior';
+$lang['metaedit']              = 'Editar metadatos';
+$lang['metasaveerr']           = 'La escritura de los metadatos ha fallado';
+$lang['metasaveok']            = 'Los metadatos han sido guardados';
+$lang['img_title']             = 'Título:';
+$lang['img_caption']           = 'Información: ';
+$lang['img_date']              = 'Fecha:';
+$lang['img_fname']             = 'Nombre del archivo:';
+$lang['img_fsize']             = 'Tamaño:';
+$lang['img_artist']            = 'Fotógrafo:';
+$lang['img_copyr']             = 'Copyright:';
+$lang['img_format']            = 'Formato:';
+$lang['img_camera']            = 'Cámara:';
+$lang['img_keywords']          = 'Palabras claves:';
+$lang['img_width']             = 'Ancho:';
+$lang['img_height']            = 'Alto:';
+$lang['subscr_subscribe_success'] = 'Se agregó %s a las listas de suscripción para %s';
+$lang['subscr_subscribe_error'] = 'Error al agregar %s a las listas de suscripción para %s';
+$lang['subscr_subscribe_noaddress'] = 'No hay dirección asociada con tu registro, no se puede agregarte a la lista de suscripción';
+$lang['subscr_unsubscribe_success'] = 'Removido %s de la lista de suscripción para %s';
+$lang['subscr_unsubscribe_error'] = 'Error al remover %s de la lista de suscripción para %s';
+$lang['subscr_already_subscribed'] = '%s ya está suscrito a %s';
+$lang['subscr_not_subscribed'] = '%s no está suscrito a %s';
+$lang['subscr_m_not_subscribed'] = 'Actualmente no te encuentras suscrito a esta página o espacio de nombres';
+$lang['subscr_m_new_header']   = 'Agregar suscripción';
+$lang['subscr_m_current_header'] = 'Suscripciones actuales';
+$lang['subscr_m_unsubscribe']  = 'Darse de baja';
+$lang['subscr_m_subscribe']    = 'Suscribirse';
+$lang['subscr_m_receive']      = 'Recibir';
+$lang['subscr_style_every']    = 'enviar correo en cada cambio';
+$lang['subscr_style_digest']   = 'Resumen de correo electrónico de cambios por cada página (cada %.2f días)';
+$lang['subscr_style_list']     = 'lista de páginas modificadas desde el último correo electrónico (cada %.2f días)';
+$lang['authtempfail']          = 'La autenticación de usuarios no está disponible temporalmente. Si esta situación persiste, por favor avisa al administrador del wiki.';
+$lang['i_chooselang']          = 'Elija su idioma';
+$lang['i_installer']           = 'Instalador de DokuWiki';
+$lang['i_wikiname']            = 'Nombre del wiki';
+$lang['i_enableacl']           = 'Habilitar ACL (recomendado) (ACL: lista de control de acceso)';
+$lang['i_superuser']           = 'Super-usuario';
+$lang['i_problems']            = 'El instalador encontró algunos problemas, se muestran abajo. No se puede continuar la instalación hasta que usted no los corrija.';
+$lang['i_modified']            = 'Por razones de seguridad este script sólo funcionará con una instalación nueva y no modificada de Dokuwiki. Usted debe extraer nuevamente los ficheros del paquete bajado, o bien consultar las <a href="http://dokuwiki.org/install">instrucciones de instalación de Dokuwiki</a> completas.';
+$lang['i_funcna']              = 'La función de PHP <code>%s</code> no está disponible. ¿Tal vez su proveedor de hosting la ha deshabilitado por alguna razón?';
+$lang['i_phpver']              = 'Su versión de PHP <code>%s</code> es menor que la necesaria <code>%s</code>. Es necesario que actualice su instalación de PHP.';
+$lang['i_mbfuncoverload']      = 'mbstring.func_overload se debe deshabilitar en php.ini para que funcione DokuWiki.';
+$lang['i_permfail']            = 'DokuWili no puede escribir <code>%s</code>. ¡Es necesario establecer  correctamente los permisos de este directorio!';
+$lang['i_confexists']          = '<code>%s</code> ya existe';
+$lang['i_writeerr']            = 'Imposible crear <code>%s</code>. Se necesita que usted controle los permisos del fichero/directorio y que cree el fichero manualmente.';
+$lang['i_badhash']             = 'dokuwiki.php no reconocido o modificado (hash=<code>%s</code>)';
+$lang['i_badval']              = '<code>%s</code> - valor ilegal o vacío';
+$lang['i_success']             = 'La configuración ha concluido correctamente. Ahora puede eliminar el archivo install.php. Visite <a href="doku.php?id=wiki:welcome">su nuevo DokuWiki</a>.';
+$lang['i_failure']             = 'Han ocurrido algunos errores durante la escritura de los ficheros de configuración. Puede ser que necesite corregirlos manualmente antes de poder usar <a href="doku.php?id=wiki:welcome">su nuevo DokuWiki</a>.';
+$lang['i_policy']              = 'Política de ACL inicial';
+$lang['i_pol0']                = 'Wiki abierto (leer, escribir y subir archivos para todos)';
+$lang['i_pol1']                = 'Wiki público (leer para todos, escribir y subir archivos para usuarios registrados únicamente)';
+$lang['i_pol2']                = 'Wiki cerrado (leer, escribir y subir archivos para usuarios registrados únicamente)';
+$lang['i_allowreg']            = 'Permitir que los usuarios se registren a sí mismos';
+$lang['i_retry']               = 'Reintentar';
+$lang['i_license']             = 'Por favor escoja una licencia bajo la que publicar su contenido:';
+$lang['i_license_none']        = 'No mostrar ninguna información sobre licencias';
+$lang['i_pop_field']           = 'Por favor, ayúdanos a mejorar la experiencia de DokuWiki:';
+$lang['i_pop_label']           = 'Una vez al mes, enviar información anónima de uso de datos a los desarrolladores de DokuWiki';
+$lang['recent_global']         = 'Actualmente estás viendo los cambios dentro del namespace <b>%s</b>. También puedes <a href="%s">ver los cambios recientes en el wiki completo</a>.';
+$lang['years']                 = 'hace %d años';
+$lang['months']                = 'hace %d meses';
+$lang['weeks']                 = 'hace %d semanas';
+$lang['days']                  = 'hace %d días';
+$lang['hours']                 = 'hace %d horas';
+$lang['minutes']               = 'hace %d minutos';
+$lang['seconds']               = 'hace %d segundos';
+$lang['wordblock']             = 'Sus cambios no se han guardado porque contienen textos bloqueados (spam).';
+$lang['media_uploadtab']       = 'Cargar';
+$lang['media_searchtab']       = 'Buscar';
+$lang['media_file']            = 'Fichero';
+$lang['media_viewtab']         = 'Ver';
+$lang['media_edittab']         = 'Editar';
+$lang['media_historytab']      = 'Historial';
+$lang['media_list_thumbs']     = 'Miniaturas';
+$lang['media_list_rows']       = 'Celdas';
+$lang['media_sort_name']       = 'Nombre';
+$lang['media_sort_date']       = 'Fecha';
+$lang['media_namespaces']      = 'Escoge "espacio de nombre"';
+$lang['media_files']           = 'Ficheros en %s';
+$lang['media_upload']          = 'Cargar a %s';
+$lang['media_search']          = 'Buscar en %s';
+$lang['media_view']            = '%s';
+$lang['media_viewold']         = '%s en %s';
+$lang['media_edit']            = 'Editar %s';
+$lang['media_history']         = 'Historial de %s';
+$lang['media_meta_edited']     = 'Metadatos editados';
+$lang['media_perm_read']       = 'Disculpa, no tienes los permisos necesarios para leer ficheros.';
+$lang['media_perm_upload']     = 'Disculpa, no tienes los permisos necesarios para cargar ficheros.';
+$lang['media_update']          = 'Actualizar nueva versión';
+$lang['media_restore']         = 'Restaurar esta versión';
+$lang['media_acl_warning']     = 'Puede que esta lista no esté completa debido a restricciones de la ACL y a las páginas ocultas.';
+$lang['currentns']             = 'Espacio de nombres actual';
+$lang['searchresult']          = 'Resultado de la búsqueda';
+$lang['plainhtml']             = 'HTML sencillo';
+$lang['wikimarkup']            = 'Etiquetado Wiki';
+$lang['page_nonexist_rev']     = 'La página no existía en %s. Por tanto fue creada en <a href="%s">%s</a>.';
+$lang['unable_to_parse_date']  = 'Incapaz de evaluar el parámetro "%s".';
+$lang['email_signature_text']  = 'Este mail ha sido generado por DokuWiki en
+@DOKUWIKIURL@';
diff --git a/wiki/inc/lang/es/locked.txt b/wiki/inc/lang/es/locked.txt
new file mode 100644
index 0000000..e151bf7
--- /dev/null
+++ b/wiki/inc/lang/es/locked.txt
@@ -0,0 +1,3 @@
+====== Página bloqueada ======
+
+Esta página está actualmente bloqueada porque la está editando otro usuario. Tienes que esperar a que  termine de editarla o el bloqueo expire.
\ No newline at end of file
diff --git a/wiki/inc/lang/es/login.txt b/wiki/inc/lang/es/login.txt
new file mode 100644
index 0000000..a8d9be7
--- /dev/null
+++ b/wiki/inc/lang/es/login.txt
@@ -0,0 +1,3 @@
+====== Login ======
+
+¡Actualmente no estás identificado! Introduce abajo tus datos de identificación para abrir una sesión. Necesitas tener las cookies activadas para identificarte.
diff --git a/wiki/inc/lang/es/mailtext.txt b/wiki/inc/lang/es/mailtext.txt
new file mode 100644
index 0000000..e74d3eb
--- /dev/null
+++ b/wiki/inc/lang/es/mailtext.txt
@@ -0,0 +1,12 @@
+Se ha cambiado o añadido una página en tu DokuWiki. Aquí están los detalles:
+
+Fecha : @DATE@
+Navegador : @BROWSER@
+Dirección-IP : @IPADDRESS@
+Nombre de Host : @HOSTNAME@
+Revisión Vieja: @OLDPAGE@
+Revisión Nueva : @NEWPAGE@
+Resumen de la edición: @SUMMARY@
+Usuario : @USER@
+
+@DIFF@
diff --git a/wiki/inc/lang/es/mailwrap.html b/wiki/inc/lang/es/mailwrap.html
new file mode 100644
index 0000000..d257190
--- /dev/null
+++ b/wiki/inc/lang/es/mailwrap.html
@@ -0,0 +1,13 @@
+<html>
+<head>
+<title>@TITLE@</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+</head>
+<body>
+
+@HTMLBODY@
+
+<br /><hr />
+<small>@EMAILSIGNATURE@</small>
+</body>
+</html>
\ No newline at end of file
diff --git a/wiki/inc/lang/es/newpage.txt b/wiki/inc/lang/es/newpage.txt
new file mode 100644
index 0000000..d119ca2
--- /dev/null
+++ b/wiki/inc/lang/es/newpage.txt
@@ -0,0 +1,3 @@
+====== Este tema no existe todavía ======
+
+Has seguido un enlace a un tema que no existe todavía. Puedes crearlo usando el botón ''Crea esta página''.
diff --git a/wiki/inc/lang/es/norev.txt b/wiki/inc/lang/es/norev.txt
new file mode 100644
index 0000000..42ee6b5
--- /dev/null
+++ b/wiki/inc/lang/es/norev.txt
@@ -0,0 +1,4 @@
+====== No existe esta revision ======
+
+La revisión especificada no existe. Usa el botón ''Revisiones antiguas'' para una lista de revisiones antiguas de este documento.
+
diff --git a/wiki/inc/lang/es/password.txt b/wiki/inc/lang/es/password.txt
new file mode 100644
index 0000000..64bded4
--- /dev/null
+++ b/wiki/inc/lang/es/password.txt
@@ -0,0 +1,6 @@
+Hola @FULLNAME@!
+
+Estos son los datos de usuario para @TITLE@ en @DOKUWIKIURL@
+
+Usuario : @LOGIN@
+Contraseña : @PASSWORD@
diff --git a/wiki/inc/lang/es/preview.txt b/wiki/inc/lang/es/preview.txt
new file mode 100644
index 0000000..b4d5a2e
--- /dev/null
+++ b/wiki/inc/lang/es/preview.txt
@@ -0,0 +1,4 @@
+====== Previsualización ======
+
+Esto es una previsualización de cómo aparecerá tu texto. Recuerda: **no está guardado** todavía!
+
diff --git a/wiki/inc/lang/es/pwconfirm.txt b/wiki/inc/lang/es/pwconfirm.txt
new file mode 100644
index 0000000..b03d309
--- /dev/null
+++ b/wiki/inc/lang/es/pwconfirm.txt
@@ -0,0 +1,11 @@
+Hola @FULLNAME@!
+
+Alguien solicitó una nueva contraseña para su nombre de
+usuario @TITLE@ en @DOKUWIKIURL@
+
+Si usted no solicitó una nueva contraseña, simplemente ignore este email.
+
+Para confirmar que la solicitud fue realizada realmente por usted,
+por favor use el siguiente enlace.
+
+@CONFIRM@
diff --git a/wiki/inc/lang/es/read.txt b/wiki/inc/lang/es/read.txt
new file mode 100644
index 0000000..461b745
--- /dev/null
+++ b/wiki/inc/lang/es/read.txt
@@ -0,0 +1 @@
+Esta página es de solo lectura. Puedes ver la fuente pero no puedes cambiarla. Pregunta a tu administrador si crees que esto es incorrecto.
diff --git a/wiki/inc/lang/es/recent.txt b/wiki/inc/lang/es/recent.txt
new file mode 100644
index 0000000..432def2
--- /dev/null
+++ b/wiki/inc/lang/es/recent.txt
@@ -0,0 +1,5 @@
+====== Cambios Recientes ======
+
+Las siguientes páginas han sido modificadas recientemente.
+
+
diff --git a/wiki/inc/lang/es/register.txt b/wiki/inc/lang/es/register.txt
new file mode 100644
index 0000000..9824826
--- /dev/null
+++ b/wiki/inc/lang/es/register.txt
@@ -0,0 +1,3 @@
+====== Registro como nuevo usuario ======
+
+Completa toda la información del formulario para crear un nuevo usuario en este wiki. Asegúrate que escribes una **dirección de e-mail válida** puesto que allí se enviará tu contraseña. El nombre de usuario ha de ser un nombre válido según [[doku>pagename|pagename]].
diff --git a/wiki/inc/lang/es/registermail.txt b/wiki/inc/lang/es/registermail.txt
new file mode 100644
index 0000000..b9208a1
--- /dev/null
+++ b/wiki/inc/lang/es/registermail.txt
@@ -0,0 +1,10 @@
+Un nuevo usuario ha sido registrado. Aquí están los detalles:
+
+Usuario         : @NEWUSER@
+Nombre completo : @NEWNAME@
+E-Mail          : @NEWEMAIL@
+
+Fecha : @DATE@
+Navegador : @BROWSER@
+Dirección-IP : @IPADDRESS@
+Nombre del host : @HOSTNAME@
diff --git a/wiki/inc/lang/es/resendpwd.txt b/wiki/inc/lang/es/resendpwd.txt
new file mode 100644
index 0000000..1d74e79
--- /dev/null
+++ b/wiki/inc/lang/es/resendpwd.txt
@@ -0,0 +1,3 @@
+====== Enviar nueva contraseña ======
+
+Completa la información requerida abajo para obtener una nueva contraseña para tu cuenta de usuario en este wiki. La nueva contraseña te será enviada a la dirección de mail que está registrada.
diff --git a/wiki/inc/lang/es/resetpwd.txt b/wiki/inc/lang/es/resetpwd.txt
new file mode 100644
index 0000000..6fade95
--- /dev/null
+++ b/wiki/inc/lang/es/resetpwd.txt
@@ -0,0 +1,3 @@
+====== Establecer nueva contraseña ======
+
+Favor de introducir una nueva contraseña para su cuenta en este wiki
\ No newline at end of file
diff --git a/wiki/inc/lang/es/revisions.txt b/wiki/inc/lang/es/revisions.txt
new file mode 100644
index 0000000..b093e85
--- /dev/null
+++ b/wiki/inc/lang/es/revisions.txt
@@ -0,0 +1,4 @@
+====== Revisiones Antiguas ======
+
+Estas son revisiones más antiguas del documento actual. Para volver a una revisión antigua selecciónala de abajo, pulsa ''Edita esta página'' y guárdala.
+
diff --git a/wiki/inc/lang/es/searchpage.txt b/wiki/inc/lang/es/searchpage.txt
new file mode 100644
index 0000000..9bc3161
--- /dev/null
+++ b/wiki/inc/lang/es/searchpage.txt
@@ -0,0 +1,4 @@
+====== Búsqueda ======
+
+Puedes encontrar los resultados de tu búsqueda abajo. @CREATEPAGEINFO@
+
diff --git a/wiki/inc/lang/es/showrev.txt b/wiki/inc/lang/es/showrev.txt
new file mode 100644
index 0000000..c84bbc0
--- /dev/null
+++ b/wiki/inc/lang/es/showrev.txt
@@ -0,0 +1,2 @@
+**¡Esta es una revisión vieja del documento!**
+----
diff --git a/wiki/inc/lang/es/stopwords.txt b/wiki/inc/lang/es/stopwords.txt
new file mode 100644
index 0000000..2569089
--- /dev/null
+++ b/wiki/inc/lang/es/stopwords.txt
@@ -0,0 +1,171 @@
+# Esta es una lista de palabras que estan ignoradas por el indexador, una palabra por línea
+# Cuando se edita este archivo, asegúrese de usar la línea de terminaciones UNIX  (una sola nueva línea)
+# No necesita incluir palabras cortas con 3 caracteres - estas son ignoradas de todos modos
+#Esta lista esta basada en las que encontramos en la siguiente url http://www.ranks.nl/stopwords/
+una
+unas
+unos
+uno
+sobre
+todo
+también
+tras
+otro
+algún
+alguno
+alguna
+algunos
+algunas
+ser
+soy
+eres
+somos
+sois
+estoy
+esta
+estamos
+estais
+estan
+como
+para
+atras
+porque
+por
+qué
+estado
+estaba
+ante
+antes
+siendo
+ambos
+pero
+poder
+puede
+puedo
+podemos
+podeis
+pueden
+fui
+fue
+fuimos
+fueron
+hacer
+hago
+hace
+hacemos
+haceis
+hacen
+cada
+fin
+incluso
+primero
+desde
+conseguir
+consigo
+consigue
+consigues
+conseguimos
+consiguen
+voy
+va
+vamos
+vais
+van
+vaya
+gueno
+tener
+tengo
+tiene
+tenemos
+teneis
+tienen
+las
+los
+aqui
+mio
+tuyo
+ellos
+ellas
+nos
+nosotros
+vosotros
+vosotras
+dentro
+solo
+solamente
+saber
+sabes
+sabe
+sabemos
+sabeis
+saben
+ultimo
+largo
+bastante
+haces
+muchos
+aquellos
+aquellas
+sus
+entonces
+tiempo
+verdad
+verdadero
+verdadera
+cierto
+ciertos
+cierta
+ciertas
+intentar
+intento
+intenta
+intentas
+intentamos
+intentais
+intentan
+dos
+bajo
+arriba
+encima
+usar
+uso
+usas
+usa
+usamos
+usais
+usan
+emplear
+empleo
+empleas
+emplean
+ampleamos
+empleais
+valor
+muy
+era
+eras
+eramos
+eran
+modo
+bien
+cual
+cuando
+donde
+mientras
+quien
+con
+entre
+sin
+trabajo
+trabajar
+trabajas
+trabaja
+trabajamos
+trabajais
+trabajan
+podria
+podrias
+podriamos
+podrian
+podriais
+aquel
diff --git a/wiki/inc/lang/es/subscr_digest.txt b/wiki/inc/lang/es/subscr_digest.txt
new file mode 100644
index 0000000..5bb5012
--- /dev/null
+++ b/wiki/inc/lang/es/subscr_digest.txt
@@ -0,0 +1,16 @@
+Hola!
+
+La página @PAGE@ en @TITLE@ wiki ha cambiado.
+Estos son los cambios:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Revisión Anterior: @OLDPAGE@
+Revisión Nueva: @NEWPAGE@
+
+Para cancelar la página de notificaciones, entra a la wiki en
+@DOKUWIKIURL@ luego visita
+@SUBSCRIBE@
+y date de baja en la página y/o cambios en el espacio de nombre.
diff --git a/wiki/inc/lang/es/subscr_form.txt b/wiki/inc/lang/es/subscr_form.txt
new file mode 100644
index 0000000..3a8143c
--- /dev/null
+++ b/wiki/inc/lang/es/subscr_form.txt
@@ -0,0 +1,3 @@
+====== Administrador de Suscripciones ======
+
+Esta página te permite administrar tus suscripciones para la página actual y espacio de nombres.
\ No newline at end of file
diff --git a/wiki/inc/lang/es/subscr_list.txt b/wiki/inc/lang/es/subscr_list.txt
new file mode 100644
index 0000000..4c58a2d
--- /dev/null
+++ b/wiki/inc/lang/es/subscr_list.txt
@@ -0,0 +1,13 @@
+Hola!
+
+Las páginas en el espacio de nombres @PAGE@ en @TITLE@ wiki ha cambiado.
+Estos son los cambios:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Para cancelar la página de notificaciones, entra a la wiki en
+@DOKUWIKIURL@ luego visita
+@SUBSCRIBE@
+y date de baja en la página y/o cambios en el espacio de nombre.
diff --git a/wiki/inc/lang/es/subscr_single.txt b/wiki/inc/lang/es/subscr_single.txt
new file mode 100644
index 0000000..a974cc9
--- /dev/null
+++ b/wiki/inc/lang/es/subscr_single.txt
@@ -0,0 +1,19 @@
+Hola!
+
+La página @PAGE@ en @TITLE@ wiki ha cambiado.
+Estos son los cambios:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Fecha : @DATE@
+Usuario : @USER@
+Resumen de edición: @SUMMARY@
+Revisión Anterior: @OLDPAGE@
+Nueva Revisión: @NEWPAGE@
+
+Para cancelar la página de notificaciones, entra a la wiki en
+@DOKUWIKIURL@ luego visita
+@SUBSCRIBE@
+y date de baja en la página y/o cambios en el espacio de nombre.
diff --git a/wiki/inc/lang/es/updateprofile.txt b/wiki/inc/lang/es/updateprofile.txt
new file mode 100644
index 0000000..822e558
--- /dev/null
+++ b/wiki/inc/lang/es/updateprofile.txt
@@ -0,0 +1,3 @@
+====== Actualiza el perfil de tu cuenta de usuario ======
+
+Sólo necesitas completar aquellos campos que quieres cambiar. No puedes cambiar tu nombre de usuario.
diff --git a/wiki/inc/lang/es/uploadmail.txt b/wiki/inc/lang/es/uploadmail.txt
new file mode 100644
index 0000000..eb1c5df
--- /dev/null
+++ b/wiki/inc/lang/es/uploadmail.txt
@@ -0,0 +1,11 @@
+Se ha subido un fichero a tu DokuWiki. Estos son los detalles:
+
+Archivo : @MEDIA@
+Ultima revisión: @OLD@
+Fecha : @DATE@
+Navegador : @BROWSER@
+Dirección IP : @IPADDRESS@
+Hostname : @HOSTNAME@
+Tamaño : @SIZE@
+MIME Type : @MIME@
+Usuario : @USER@
diff --git a/wiki/inc/lang/et/admin.txt b/wiki/inc/lang/et/admin.txt
new file mode 100644
index 0000000..1934f48
--- /dev/null
+++ b/wiki/inc/lang/et/admin.txt
@@ -0,0 +1,4 @@
+====== Administreerimine ======
+
+Alljärgnevalt leiate nimekirja administratiivsetest tegevustest, mida DokuWiki võimaldab.
+
diff --git a/wiki/inc/lang/et/adminplugins.txt b/wiki/inc/lang/et/adminplugins.txt
new file mode 100644
index 0000000..ee3ffb0
--- /dev/null
+++ b/wiki/inc/lang/et/adminplugins.txt
@@ -0,0 +1 @@
+===== Täiendavad laiendused =====
\ No newline at end of file
diff --git a/wiki/inc/lang/et/backlinks.txt b/wiki/inc/lang/et/backlinks.txt
new file mode 100644
index 0000000..4b405cd
--- /dev/null
+++ b/wiki/inc/lang/et/backlinks.txt
@@ -0,0 +1,4 @@
+====== Siia lehele lingiga haagitud lehed ======
+
+Nimekiri nendest lehtedest, kuskohalt Sa lingi abil siia lehele saad.
+
diff --git a/wiki/inc/lang/et/conflict.txt b/wiki/inc/lang/et/conflict.txt
new file mode 100644
index 0000000..cf9f571
--- /dev/null
+++ b/wiki/inc/lang/et/conflict.txt
@@ -0,0 +1,6 @@
+====== Uus versioon täitsa olemas ======
+
+Sellest dokumendist, mis Sa toimetasid on tegelikult juba olemas ka uuem versioon. Selline asi juhtub siis kui sel ajal kui Sina vaikselt oma dokumendi kallal nokitsesid tegi keegi juba kähku omad Muutused sealsamas dokumendis ära.
+
+Vaata hoolikalt allpool näidatud erinevusi ja siis otsusta millise versiooni alles jätad. Kui Sa peaks valima ''salvesta'', siis juhtubki selline lugu, et Sinu versioon salvestatakse. kui Sa aga peaks klõpsama ''katkesta'' säilib hetkel kehtiv versioon.
+
diff --git a/wiki/inc/lang/et/denied.txt b/wiki/inc/lang/et/denied.txt
new file mode 100644
index 0000000..093ccf4
--- /dev/null
+++ b/wiki/inc/lang/et/denied.txt
@@ -0,0 +1,4 @@
+====== Sul pole ligipääsuluba ======
+
+Kahju küll, aga sinu tublidusest ei piisa, et edasi liikuda.
+
diff --git a/wiki/inc/lang/et/diff.txt b/wiki/inc/lang/et/diff.txt
new file mode 100644
index 0000000..d10a93b
--- /dev/null
+++ b/wiki/inc/lang/et/diff.txt
@@ -0,0 +1,4 @@
+====== Erinevused ======
+
+Siin näed erinevusi valitud versiooni ja hetkel kehtiva lehekülje vahel.
+
diff --git a/wiki/inc/lang/et/draft.txt b/wiki/inc/lang/et/draft.txt
new file mode 100644
index 0000000..6669f3b
--- /dev/null
+++ b/wiki/inc/lang/et/draft.txt
@@ -0,0 +1,6 @@
+====== Leidsin katkenud toimetamise ======
+
+Sinu viimane toimetamissessioon ei lõppenud eelmine kord korrapäraselt. DokuWiki automaatselt salvestas Sinu pooliku töö, mida võid nüüd kasutada töö jätkamiseks. Allpool näed teksti, mis suudeti päästa.
+
+Kas tahad //taastada// kaotused, //kustutada// poolik töö või //üldse mitte midagi teha//?
+
diff --git a/wiki/inc/lang/et/edit.txt b/wiki/inc/lang/et/edit.txt
new file mode 100644
index 0000000..6167c85
--- /dev/null
+++ b/wiki/inc/lang/et/edit.txt
@@ -0,0 +1,2 @@
+Toimeta seda lehte ja klõpsa ''Salvesta'' peal. Wikis teksti kujundamise vahenditega tutvumiseks, st. kuidas teha rasvast ja kaldkirja jne., vaata [[wiki:syntax|süntaksitutvustus lehelt]]. Kui Sa tahad midagi testida, saad seda teha [[playground:playground|mängualal]].
+
diff --git a/wiki/inc/lang/et/editrev.txt b/wiki/inc/lang/et/editrev.txt
new file mode 100644
index 0000000..3ab6d71
--- /dev/null
+++ b/wiki/inc/lang/et/editrev.txt
@@ -0,0 +1,3 @@
+**Sa oled omale tõmmanud selle dokumendi vana versiooni!** Kui Sa selle salvestad sünnib nende andmetega uus versioon.
+----
+
diff --git a/wiki/inc/lang/et/index.txt b/wiki/inc/lang/et/index.txt
new file mode 100644
index 0000000..fec211d
--- /dev/null
+++ b/wiki/inc/lang/et/index.txt
@@ -0,0 +1,3 @@
+====== Sisukord ======
+
+Alloleavs on loetletud kõik saada olevaist leheküljed, mis on järjestatud [[doku>namespaces|nimeruumi]]de alusel.
diff --git a/wiki/inc/lang/et/jquery.ui.datepicker.js b/wiki/inc/lang/et/jquery.ui.datepicker.js
new file mode 100644
index 0000000..b2e226a
--- /dev/null
+++ b/wiki/inc/lang/et/jquery.ui.datepicker.js
@@ -0,0 +1,45 @@
+/* Estonian initialisation for the jQuery UI date picker plugin. */
+/* Written by Mart Sõmermaa (mrts.pydev at gmail com). */
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "../widgets/datepicker" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery.datepicker );
+	}
+}( function( datepicker ) {
+
+datepicker.regional.et = {
+	closeText: "Sulge",
+	prevText: "Eelnev",
+	nextText: "Järgnev",
+	currentText: "Täna",
+	monthNames: [ "Jaanuar","Veebruar","Märts","Aprill","Mai","Juuni",
+	"Juuli","August","September","Oktoober","November","Detsember" ],
+	monthNamesShort: [ "Jaan", "Veebr", "Märts", "Apr", "Mai", "Juuni",
+	"Juuli", "Aug", "Sept", "Okt", "Nov", "Dets" ],
+	dayNames: [
+		"Pühapäev",
+		"Esmaspäev",
+		"Teisipäev",
+		"Kolmapäev",
+		"Neljapäev",
+		"Reede",
+		"Laupäev"
+	],
+	dayNamesShort: [ "Pühap", "Esmasp", "Teisip", "Kolmap", "Neljap", "Reede", "Laup" ],
+	dayNamesMin: [ "P","E","T","K","N","R","L" ],
+	weekHeader: "näd",
+	dateFormat: "dd.mm.yy",
+	firstDay: 1,
+	isRTL: false,
+	showMonthAfterYear: false,
+	yearSuffix: "" };
+datepicker.setDefaults( datepicker.regional.et );
+
+return datepicker.regional.et;
+
+} ) );
diff --git a/wiki/inc/lang/et/lang.php b/wiki/inc/lang/et/lang.php
new file mode 100644
index 0000000..0320812
--- /dev/null
+++ b/wiki/inc/lang/et/lang.php
@@ -0,0 +1,336 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Oliver S6ro <seem.iges@mail.ee>
+ * @author Aari Juhanson <aari@vmg.vil.ee>
+ * @author Kaiko Kaur <kaiko@kultuur.edu.ee>
+ * @author kristian.kankainen@kuu.la
+ * @author Rivo Zängov <eraser@eraser.ee>
+ * @author Janar Leas <janarleas@gmail.com>
+ * @author Janar Leas <janar.leas@eesti.ee>
+ */
+$lang['encoding']              = 'utf-8';
+$lang['direction']             = 'ltr';
+$lang['doublequoteopening']    = '„';
+$lang['doublequoteclosing']    = '“';
+$lang['singlequoteopening']    = '‚';
+$lang['singlequoteclosing']    = '‘';
+$lang['apostrophe']            = '\'';
+$lang['btn_edit']              = 'Toimeta seda lehte';
+$lang['btn_source']            = 'Näita lehepõhja';
+$lang['btn_show']              = 'Näita lehte';
+$lang['btn_create']            = 'Tekita selle lingi alla leht';
+$lang['btn_search']            = 'Otsi';
+$lang['btn_save']              = 'Salvesta';
+$lang['btn_preview']           = 'Eelvaade';
+$lang['btn_top']               = 'Tagasi lehe algusesse';
+$lang['btn_newer']             = '<< varajasemad';
+$lang['btn_older']             = '>> hilisemad';
+$lang['btn_revs']              = 'Eelmised versioonid';
+$lang['btn_recent']            = 'Viimased muudatused';
+$lang['btn_upload']            = 'Lae üles';
+$lang['btn_cancel']            = 'Katkesta';
+$lang['btn_index']             = 'Sisukord';
+$lang['btn_secedit']           = 'Toimeta';
+$lang['btn_login']             = 'Logi sisse';
+$lang['btn_logout']            = 'Logi välja';
+$lang['btn_admin']             = 'Administreeri';
+$lang['btn_update']            = 'Uuenda';
+$lang['btn_delete']            = 'Kustuta';
+$lang['btn_back']              = 'Tagasi';
+$lang['btn_backlink']          = 'Tagasilingid';
+$lang['btn_subscribe']         = 'Jälgi seda lehte (teated meilile)';
+$lang['btn_profile']           = 'Minu info';
+$lang['btn_reset']             = 'Taasta';
+$lang['btn_resendpwd']         = 'Sea uus salasõna';
+$lang['btn_draft']             = 'Toimeta mustandit';
+$lang['btn_recover']           = 'Taata mustand';
+$lang['btn_draftdel']          = 'Kustuta mustand';
+$lang['btn_revert']            = 'Taasta';
+$lang['btn_register']          = 'Registreeri uus kasutaja';
+$lang['btn_apply']             = 'Kinnita';
+$lang['btn_media']             = 'Meedia haldur';
+$lang['btn_deleteuser']        = 'Eemalda minu konto';
+$lang['loggedinas']            = 'Logis sisse kui:';
+$lang['user']                  = 'Kasutaja';
+$lang['pass']                  = 'Parool';
+$lang['newpass']               = 'Uus parool';
+$lang['oldpass']               = 'Vana parool';
+$lang['passchk']               = 'Korda uut parooli';
+$lang['remember']              = 'Pea mind meeles';
+$lang['fullname']              = 'Täielik nimi';
+$lang['email']                 = 'E-post';
+$lang['profile']               = 'Kasutaja info';
+$lang['badlogin']              = 'Oops, Sinu kasutajanimi või parool oli vale.';
+$lang['badpassconfirm']        = 'Väär salasõna';
+$lang['minoredit']             = 'Ebaolulised muudatused';
+$lang['draftdate']             = 'Mustand automaatselt salvestatud';
+$lang['nosecedit']             = 'Leht on vahepeal muutunud, jaotiste teave osutus aegunuks sestap laeti tervelehekülg.';
+$lang['regmissing']            = 'Kõik väljad tuleb ära täita.';
+$lang['reguexists']            = 'Tegelikult on sellise nimega kasutaja juba olemas.';
+$lang['regsuccess']            = 'Kasutaja sai tehtud. Parool saadeti Sulle e-posti aadressil.';
+$lang['regsuccess2']           = 'Kasutaja sai tehtud.';
+$lang['regmailfail']           = 'Ilmselt tekkis e-posti teel parooli saatmisel mingi tõrge. Palun suhtle sel teemal
+oma serveri administraatoriga!';
+$lang['regbadmail']            = 'Tundub, et Sinu antud e-posti aadress ei toimi - kui Sa arvad, et tegemist on
+ekstitusega, suhtle oma serveri administraatoriga';
+$lang['regbadpass']            = 'Uus parool on kirjutatud erinevalt. Proovi uuesti.';
+$lang['regpwmail']             = 'Sinu DokuWiki parool';
+$lang['reghere']               = 'Sul ei olegi veel kasutajakontot? No aga tekita see siis endale!';
+$lang['profna']                = 'Viki ei toeta profiili muudatusi';
+$lang['profnochange']          = 'Muutused puuduvad.';
+$lang['profnoempty']           = 'Tühi nimi ega meiliaadress pole lubatud.';
+$lang['profchanged']           = 'Kasutaja info edukalt muudetud';
+$lang['profnodelete']          = 'See wiki ei toeta kasutajate kustutamist';
+$lang['profdeleteuser']        = 'Kustuta konto';
+$lang['profdeleted']           = 'Sinu kasutajakonto on sellest wikist kustutatud';
+$lang['profconfdelete']        = 'Soovin sellest wikist oma konnto eemaldada. <br/> See tegevus on taastamatu.';
+$lang['profconfdeletemissing'] = 'Kinnituse valikkast märkimata.';
+$lang['pwdforget']             = 'Unustasid parooli? Tee uus';
+$lang['resendna']              = 'See wiki ei toeta parooli taassaatmist.';
+$lang['resendpwd']             = 'Sea uus salasõna';
+$lang['resendpwdmissing']      = 'Khmm... Sa pead täitma kõik väljad.';
+$lang['resendpwdnouser']       = 'Aga sellist kasutajat ei ole.';
+$lang['resendpwdbadauth']      = 'See autentimiskood ei ole õige. Kontrolli, et kopeerisid terve lingi.';
+$lang['resendpwdconfirm']      = 'Kinnituslink saadeti meilile.';
+$lang['resendpwdsuccess']      = 'Uus parool saadeti Sinu meilile.';
+$lang['license']               = 'Kus pole öeldud teisiti, kehtib selle wiki sisule järgmine leping:';
+$lang['licenseok']             = 'Teadmiseks: Toimetades seda lehte, nõustud avaldama oma sisu järgmise lepingu alusel:';
+$lang['searchmedia']           = 'Otsi failinime:';
+$lang['searchmedia_in']        = 'Otsi %s';
+$lang['txt_upload']            = 'Vali fail, mida üles laadida:';
+$lang['txt_filename']          = 'Siseta oma Wikinimi (soovituslik):';
+$lang['txt_overwrt']           = 'Kirjutan olemasoleva faili üle';
+$lang['maxuploadsize']         = 'Üleslaadimiseks lubatu enim %s faili kohta.';
+$lang['lockedby']              = 'Praegu on selle lukustanud:';
+$lang['lockexpire']            = 'Lukustus aegub:';
+$lang['js']['willexpire']      = 'Teie lukustus selle lehe toimetamisele aegub umbes minuti pärast.\nIgasugu  probleemide vältimiseks kasuta eelvaate nuppu, et lukustusarvesti taas tööle panna.';
+$lang['js']['notsavedyet']     = 'Sul on seal salvestamata muudatusi, mis kohe kõige kaduva teed lähevad.
+Kas Sa ikka tahad edasi liikuda?';
+$lang['js']['searchmedia']     = 'Otsi faile';
+$lang['js']['keepopen']        = 'Jäta aken peale valiku sooritamist avatuks';
+$lang['js']['hidedetails']     = 'Peida detailid';
+$lang['js']['mediatitle']      = 'Lingi sätted';
+$lang['js']['mediadisplay']    = 'Lingi liik';
+$lang['js']['mediaalign']      = 'Joondus';
+$lang['js']['mediasize']       = 'Pildi mõõtmed';
+$lang['js']['mediatarget']     = 'Lingi siht';
+$lang['js']['mediaclose']      = 'Sulge';
+$lang['js']['mediainsert']     = 'Sisesta';
+$lang['js']['mediadisplayimg'] = 'Näita pilti.';
+$lang['js']['mediadisplaylnk'] = 'Näita ainult linki.';
+$lang['js']['mediasmall']      = 'Väiksem suurus';
+$lang['js']['mediamedium']     = 'Keskmine suurus';
+$lang['js']['medialarge']      = 'Suurem suurus';
+$lang['js']['mediaoriginal']   = 'Originaali suurus';
+$lang['js']['medialnk']        = 'Link üksikasjadele';
+$lang['js']['mediadirect']     = 'Otselink originaalile';
+$lang['js']['medianolnk']      = 'Ilma lingita';
+$lang['js']['medianolink']     = 'Ära lingi pilti';
+$lang['js']['medialeft']       = 'Joonda pilt vasakule.';
+$lang['js']['mediaright']      = 'Joonda pilt paremale.';
+$lang['js']['mediacenter']     = 'Joonda pilt keskele.';
+$lang['js']['medianoalign']    = 'Ära joonda.';
+$lang['js']['nosmblinks']      = 'Lingid \'Windows shares\'ile töötab ainult Microsoft Internet Exploreriga.
+Siiski võid kopeerida ja asetada lingi.';
+$lang['js']['linkwiz']         = 'Lingi nõustaja';
+$lang['js']['linkto']          = 'Lingi:';
+$lang['js']['del_confirm']     = 'Kas kustutame selle kirje?';
+$lang['js']['restore_confirm'] = 'Tõesti taastad selle järgu?';
+$lang['js']['media_diff']      = 'Vaatle erisusi:';
+$lang['js']['media_diff_both'] = 'Kõrvuti';
+$lang['js']['media_diff_opacity'] = 'Kuma läbi';
+$lang['js']['media_diff_portions'] = 'Puhasta';
+$lang['js']['media_select']    = 'Vali failid…';
+$lang['js']['media_upload_btn'] = 'Lae üles';
+$lang['js']['media_done_btn']  = 'Valmis';
+$lang['js']['media_drop']      = 'Üleslaadimiseks viska failid siia';
+$lang['js']['media_cancel']    = 'eemalda';
+$lang['js']['media_overwrt']   = 'Asenda olemasolevad failid';
+$lang['rssfailed']             = 'Sinu soovitud info ammutamisel tekkis viga: ';
+$lang['nothingfound']          = 'Oops, aga mitte muhvigi ei leitud.';
+$lang['mediaselect']           = 'Hunnik faile';
+$lang['uploadsucc']            = 'Üleslaadimine läks ootuspäraselt hästi';
+$lang['uploadfail']            = 'Üleslaadimine läks nässu. Äkki pole Sa selleks lihtsalt piisavalt võimukas tegija?';
+$lang['uploadwrong']           = 'Ei saa Sa midagi üles laadida. Oops, aga seda tüüpi faili sul lihtsalt ei lubata üles laadida';
+$lang['uploadexist']           = 'Fail on juba olemas. Midagi ei muudetud.';
+$lang['uploadbadcontent']      = 'Üles laaditu ei sobinud %s faililaiendiga.';
+$lang['uploadspam']            = 'Üleslaadimine tõrjuti rämpssisu vältija poolt.';
+$lang['uploadxss']             = 'Üleslaadimine tõrjuti kahtlase sisu võimaluse tõttu';
+$lang['uploadsize']            = 'Üles laaditud fail on liiga suur (maksimaalne suurus on %s).';
+$lang['deletesucc']            = 'Fail nimega "%s" sai kustutatud.';
+$lang['deletefail']            = 'Faili nimega "%s" ei kustutatud (kontrolli õigusi).';
+$lang['mediainuse']            = 'Faili nimega "%s" ei kustutatud, sest see on kasutuses.';
+$lang['namespaces']            = 'Alajaotus';
+$lang['mediafiles']            = 'Failid on Sulle kättesaadavad';
+$lang['accessdenied']          = 'Ligipääs keelatud.';
+$lang['mediausage']            = 'Kasuta järgmist kirjapilti sellele failile viitamaks:';
+$lang['mediaview']             = 'Vaata faili algsel kujul.';
+$lang['mediaroot']             = 'juur';
+$lang['mediaupload']           = 'Lae fail sellesse nimeruumi (kataloogi). Loomaks täiendavaid alam-nimeruume, kasuta wiki-nime ja nimeruumide eraldamiseks koolonit.';
+$lang['mediaextchange']        = 'Faili laiend .%s-st %s-ks!';
+$lang['reference']             = 'Viited';
+$lang['ref_inuse']             = 'Seda faili ei saa kustutada, sest teda kasutavad järgmised lehed:';
+$lang['ref_hidden']            = 'Mõned viidad failile on lehtedel, millele sul ei ole ligipääsu';
+$lang['hits']                  = 'Päringu tabamused';
+$lang['quickhits']             = 'Päringule vastavad lehed';
+$lang['toc']                   = 'Sisujuht';
+$lang['current']               = 'Hetkel kehtiv';
+$lang['yours']                 = 'Sinu versioon';
+$lang['diff']                  = 'Näita erinevusi hetkel kehtiva versiooniga';
+$lang['diff2']                 = 'Näita valitud versioonide erinevusi';
+$lang['difflink']              = 'Lõlita võrdlemise vaatele';
+$lang['diff_type']             = 'Vaata erinevusi:';
+$lang['diff_inline']           = 'Jooksvalt';
+$lang['diff_side']             = 'Kõrvuti';
+$lang['line']                  = 'Rida';
+$lang['breadcrumb']            = 'Käidud rada:';
+$lang['youarehere']            = 'Sa oled siin:';
+$lang['lastmod']               = 'Viimati muutnud:';
+$lang['by']                    = 'persoon';
+$lang['deleted']               = 'eemaldatud';
+$lang['created']               = 'tekitatud';
+$lang['restored']              = 'vana versioon taastatud (%s)';
+$lang['external_edit']         = 'väline muutmine';
+$lang['summary']               = 'kokkuvõte muudatustest';
+$lang['noflash']               = 'Sele sisu vaatamisesks on vajalik <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Laiendus</a>.';
+$lang['tools']                 = 'Tööriistad';
+$lang['user_tools']            = 'Kasutaja tarvikud';
+$lang['site_tools']            = 'Lehe tööriistad';
+$lang['page_tools']            = 'Lehekülje tarvikud';
+$lang['skip_to_content']       = 'mine sisule';
+$lang['sidebar']               = 'Külgriba';
+$lang['mail_newpage']          = 'leht lisatud:';
+$lang['mail_changed']          = 'leht muudetud';
+$lang['mail_subscribe_list']   = 'muutunud leheküljed nimeruumis:';
+$lang['mail_new_user']         = 'Uus kasutaja:';
+$lang['mail_upload']           = 'üles laetud fail:';
+$lang['changes_type']          = 'Näita mmutuseid';
+$lang['pages_changes']         = 'Leheküljed';
+$lang['media_changes']         = 'Meedia failid';
+$lang['both_changes']          = 'Mõlemid, leheküljed ja meedia failid';
+$lang['qb_bold']               = 'Rasvane kiri';
+$lang['qb_italic']             = 'Kaldkiri';
+$lang['qb_underl']             = 'Alajoonega kiri';
+$lang['qb_code']               = 'Koodi tekst';
+$lang['qb_strike']             = 'Läbijoonitud tekst';
+$lang['qb_h1']                 = '1. astme pealkiri';
+$lang['qb_h2']                 = '2. astme pealkiri';
+$lang['qb_h3']                 = '3. astme pealkiri';
+$lang['qb_h4']                 = '4. astme pealkiri';
+$lang['qb_h5']                 = '5. astme pealkiri';
+$lang['qb_h']                  = 'Pealkiri';
+$lang['qb_hs']                 = 'Vali pealkiri';
+$lang['qb_hplus']              = 'Kõrgem pealkiri';
+$lang['qb_hminus']             = 'Madalam pealkiri';
+$lang['qb_hequal']             = 'Sama taseme pealkiri';
+$lang['qb_link']               = 'Siselink';
+$lang['qb_extlink']            = 'Välislink';
+$lang['qb_hr']                 = 'Horisontaalne vahejoon';
+$lang['qb_ol']                 = 'Nummerdatud nimikiri';
+$lang['qb_ul']                 = 'Mummuga nimekiri';
+$lang['qb_media']              = 'Lisa pilte ja muid faile';
+$lang['qb_sig']                = 'Lisa allkiri!';
+$lang['qb_smileys']            = 'Emotikonid';
+$lang['qb_chars']              = 'Erisümbolid';
+$lang['upperns']               = 'mine ülemisse nimeruumi';
+$lang['metaedit']              = 'Muuda lisainfot';
+$lang['metasaveerr']           = 'Lisainfo salvestamine läks untsu.';
+$lang['metasaveok']            = 'Lisainfo salvestatud';
+$lang['btn_img_backto']            = 'Tagasi %s';
+$lang['img_title']             = 'Tiitel:';
+$lang['img_caption']           = 'Kirjeldus:';
+$lang['img_date']              = 'Kuupäev:';
+$lang['img_fname']             = 'Faili nimi:';
+$lang['img_fsize']             = 'Suurus:';
+$lang['img_artist']            = 'Autor:';
+$lang['img_copyr']             = 'Autoriõigused:';
+$lang['img_format']            = 'Formaat:';
+$lang['img_camera']            = 'Kaamera:';
+$lang['img_keywords']          = 'Võtmesõnad:';
+$lang['img_width']             = 'Laius:';
+$lang['img_height']            = 'Kõrgus:';
+$lang['btn_mediaManager']           = 'Näita meediahalduris';
+$lang['subscr_subscribe_success'] = '%s lisati %s tellijaks';
+$lang['subscr_subscribe_error'] = 'Viga %s lisamisel %s tellijaks';
+$lang['subscr_subscribe_noaddress'] = 'Sinu kasutajaga pole seotud ühtegi aadressi, seega ei saa sind tellijaks lisada';
+$lang['subscr_unsubscribe_success'] = '%s eemaldati %s tellijatest';
+$lang['subscr_unsubscribe_error'] = 'Viga %s eemaldamisel %s tellijatest';
+$lang['subscr_already_subscribed'] = '%s on juba %s tellija';
+$lang['subscr_not_subscribed'] = '%s pole %s tellija';
+$lang['subscr_m_not_subscribed'] = 'Sina pole hetkel selle lehekülje ega nimeruumi tellija.';
+$lang['subscr_m_new_header']   = 'Lisa tellimus';
+$lang['subscr_m_current_header'] = 'Hetkel tellitud';
+$lang['subscr_m_unsubscribe']  = 'Eemalda tellimus';
+$lang['subscr_m_subscribe']    = 'Telli';
+$lang['subscr_style_every']    = 'igast toimetamisest teavitab ekiri';
+$lang['subscr_style_digest']   = 'kokkuvõte ekirjaga toimetamistest igal leheküljel (iga %.2f päeva järel)';
+$lang['subscr_style_list']     = 'Peale viimast ekirja (iga %.2f päeva järel) toimetaud lehekülgede loend.';
+$lang['authtempfail']          = 'Kasutajate autentimine on ajutiselt rivist väljas. Kui see olukord mõne aja jooksul ei parane, siis teavita sellest serveri haldajat.';
+$lang['i_chooselang']          = 'Vali keel';
+$lang['i_installer']           = 'DokuWiki paigaldaja';
+$lang['i_wikiname']            = 'Wiki nimi';
+$lang['i_enableacl']           = 'Kas lubada kasutajate haldus (soovitatav)';
+$lang['i_superuser']           = 'Superkasutaja';
+$lang['i_problems']            = 'Paigaldaja leidis mõned vead, mis on allpool välja toodud. Enne vigade eemaldamist ei saa jätkata.';
+$lang['i_modified']            = 'Õnnetuste vältimiseks läheb see skript käima ainult värskelt paigaldatud ja muutmata Dokuwiki peal.
+                       Sa peaksid ilmselt kogu koodi uuesti lahti pakkima. Vaata ka <a href="http://dokuwiki.org/install">Dokuwiki installeerimis juhendit</a>';
+$lang['i_funcna']              = 'PHP funktsiooni <code>%s</code> ei ole olemas.võibolla sinu serveri hooldaja on selle mingil põhjusel keelanud?';
+$lang['i_phpver']              = 'Sinu PHP versioon <code>%s</code> on vanem nõutavast <code>%s</code>. Pead oma paigaldatud PHP-d uuendama.';
+$lang['i_permfail']            = 'Dokuwiki ei saa kirjutada faili <code>%s</code>. Kontrolli serveris failide õigused üle.';
+$lang['i_confexists']          = '<code>%s</code> on juba olemas';
+$lang['i_writeerr']            = 'Faili <code>%s</code> ei lubata tekitada. Kontrolli kataloogi ja faili õigusi.';
+$lang['i_badhash']             = 'Tundmatu või muutunud dokuwiki.php (hash=<code>%s</code>)';
+$lang['i_badval']              = '<code>%s</code> - lubamatu või tühi väärtus';
+$lang['i_success']             = 'Seadistamine on õnnelikult lõpule viidud. Sa võid nüüd kustutada faili install.php. Alusta oma <a href="doku.php?id=wiki:welcome">uue DokuWiki</a> täitmist.';
+$lang['i_failure']             = 'Konfiguratsiooni faili kirjutamisel esines vigu. Võimalik, et pead need käsitsi parandama enne <a href="doku.php?id=wiki:welcome">uue DokuWiki</a> täitma asumist.';
+$lang['i_policy']              = 'Wiki õiguste algne poliitika';
+$lang['i_pol0']                = 'Avatud (lugemine, kirjutamine ja üleslaadimine kõigile lubatud)';
+$lang['i_pol1']                = 'Avalikuks lugemiseks (lugeda saavad kõik, kirjutada ja üles laadida vaid registreeritud kasutajad)';
+$lang['i_pol2']                = 'Suletud (kõik õigused, kaasaarvatud lugemine on lubatud vaid registreeritud kasutajatele)';
+$lang['i_allowreg']            = 'Luba kasutajail endid ise arvele võtta';
+$lang['i_retry']               = 'Proovi uuesti';
+$lang['i_license']             = 'Vali leping, mille alusel wiki sisu avaldatakse:';
+$lang['i_license_none']        = 'Ära näita mingit lepingu teavet';
+$lang['i_pop_field']           = 'Aitake meil täiendada DokuWiki kasutuskogemsut:';
+$lang['i_pop_label']           = 'Kord kuus, saada DokuWiki arendajatele anonüümseid kasutus andmeid.';
+$lang['recent_global']         = 'Uurid hetkel nimeruumi <b>%s</b> muudatusi. Võid uurida ka <a href="%s">kogu selle wiki</a> muudatusi.';
+$lang['years']                 = '%d aasta eest';
+$lang['months']                = '%d kuu eest';
+$lang['weeks']                 = '%d nädala eest';
+$lang['days']                  = '%d päeva eest';
+$lang['hours']                 = '%d tunni eest';
+$lang['minutes']               = '%d minuti eest';
+$lang['seconds']               = '%d sekundi eest';
+$lang['wordblock']             = 'Sinu toimetus jäeti muutmata tõrjutud teksti tõttu (rämpspost?).';
+$lang['media_uploadtab']       = 'Lae-↑ ';
+$lang['media_searchtab']       = 'Otsi';
+$lang['media_file']            = 'Fail';
+$lang['media_viewtab']         = 'Vaata';
+$lang['media_edittab']         = 'Toimeta';
+$lang['media_historytab']      = 'Ajalugu';
+$lang['media_list_thumbs']     = 'Pisipildid';
+$lang['media_list_rows']       = 'Ridu';
+$lang['media_sort_name']       = 'Nimi';
+$lang['media_sort_date']       = 'Kuupäev';
+$lang['media_namespaces']      = 'Vali nimeruum';
+$lang['media_files']           = 'Failid %s-is';
+$lang['media_upload']          = 'Lae %s-ssi';
+$lang['media_search']          = 'Leia %s-st';
+$lang['media_view']            = '%s';
+$lang['media_viewold']         = '%s asub %s-s';
+$lang['media_edit']            = 'Muuda %s-i';
+$lang['media_history']         = '%s ajalugu';
+$lang['media_meta_edited']     = 'toimetati päiseteavet';
+$lang['media_perm_read']       = 'Sul pole piisavaid õigusi failide vaatamiseks';
+$lang['media_perm_upload']     = 'Sul pole piisavaid õigusi failide üleslaadimiseks';
+$lang['media_update']          = 'Lea üles uus järk';
+$lang['media_restore']         = 'Ennista sellele järgule';
+$lang['currentns']             = 'Hetke nimeruum';
+$lang['searchresult']          = 'Otsingu tulemus';
+$lang['plainhtml']             = 'Liht-HTML';
+$lang['wikimarkup']            = 'Wiki märgistus';
+$lang['email_signature_text'] = 'See meil on saadetud DokuWiki poolt
+@DOKUWIKIURL@';
diff --git a/wiki/inc/lang/et/locked.txt b/wiki/inc/lang/et/locked.txt
new file mode 100644
index 0000000..0fd2743
--- /dev/null
+++ b/wiki/inc/lang/et/locked.txt
@@ -0,0 +1,3 @@
+====== Leht lukustatud ======
+
+Hetkel on see leht lukustatud kuna teine kasutaja toimetab tema kallal. Sa pead ootama kuni ta kas lõpetab või lukustus aegub.
diff --git a/wiki/inc/lang/et/login.txt b/wiki/inc/lang/et/login.txt
new file mode 100644
index 0000000..3e746cd
--- /dev/null
+++ b/wiki/inc/lang/et/login.txt
@@ -0,0 +1,3 @@
+====== Logi sisse ======
+
+Hetkel pole Sa sisse logitud! Allpool saad sisestada kõik vajaliku, et sisse logida. Kui Sa oled oma arvuti taga ainukasutaja oleks hea kui Su arvutil  oleks lubatud 'cookies', st. järgmine kord kui siia lehele tuled oled automaatselt sisse logitud.
diff --git a/wiki/inc/lang/et/mailtext.txt b/wiki/inc/lang/et/mailtext.txt
new file mode 100644
index 0000000..f1a6202
--- /dev/null
+++ b/wiki/inc/lang/et/mailtext.txt
@@ -0,0 +1,12 @@
+Sinu lehte DokuWiki-s on muudetud. Alljärgnevalt detailid:
+
+Kuupäev           : @DATE@
+Brauser           : @BROWSER@
+IP-Aadress        : @IPADDRESS@
+Arvuti nimi       : @HOSTNAME@
+Eelnev versioon   : @OLDPAGE@
+Uus versioon      : @NEWPAGE@
+Toimeta kokkuvõtet: @SUMMARY@
+Kasutaja          : @USER@
+
+@DIFF@
diff --git a/wiki/inc/lang/et/newpage.txt b/wiki/inc/lang/et/newpage.txt
new file mode 100644
index 0000000..fb78e64
--- /dev/null
+++ b/wiki/inc/lang/et/newpage.txt
@@ -0,0 +1,3 @@
+====== Seda teemat veel ei ole ======
+
+Sa klikkisid lingile, mille all teemat veel pole. Selle saad Sa tekitada kasutades ''Tekita see leht nuppu''.
diff --git a/wiki/inc/lang/et/norev.txt b/wiki/inc/lang/et/norev.txt
new file mode 100644
index 0000000..42d204f
--- /dev/null
+++ b/wiki/inc/lang/et/norev.txt
@@ -0,0 +1,4 @@
+====== Sellist versiooni pole ======
+
+Sellist versiooni ei ole olemas. Selle dokumendi eelmiste versioonide nägemiseks klõpsa ''Eelmised versioonid'' nupul.
+
diff --git a/wiki/inc/lang/et/password.txt b/wiki/inc/lang/et/password.txt
new file mode 100644
index 0000000..9d75bb8
--- /dev/null
+++ b/wiki/inc/lang/et/password.txt
@@ -0,0 +1,6 @@
+Hi @FULLNAME@!
+
+Siin on sinu kasutajaandmed @TITLE@ks @DOKUWIKIURL@s
+
+Sisse logimisnimi : @LOGIN@
+Parool : @PASSWORD@
diff --git a/wiki/inc/lang/et/preview.txt b/wiki/inc/lang/et/preview.txt
new file mode 100644
index 0000000..df45c65
--- /dev/null
+++ b/wiki/inc/lang/et/preview.txt
@@ -0,0 +1,3 @@
+====== Eelvaade ======
+
+Siin saad eelnevalt vaadata, milline su tekst välja näeks. Pea aga meeles, et see **ei ole veel salvestatud** !
diff --git a/wiki/inc/lang/et/pwconfirm.txt b/wiki/inc/lang/et/pwconfirm.txt
new file mode 100644
index 0000000..ee3b313
--- /dev/null
+++ b/wiki/inc/lang/et/pwconfirm.txt
@@ -0,0 +1,8 @@
+Tere @FULLNAME@!
+
+Keegi on Sinu parooli uuendust soovinud kasutajale @TITLE@ (@DOKUWIKIURL@).
+
+Kui see ei olnud Sina, siis võid seda meili lihtsalt ignoreerida.
+Kinnitamaks uue parooli saamise soovi mine aadressile:
+
+@CONFIRM@
diff --git a/wiki/inc/lang/et/read.txt b/wiki/inc/lang/et/read.txt
new file mode 100644
index 0000000..64696f0
--- /dev/null
+++ b/wiki/inc/lang/et/read.txt
@@ -0,0 +1,2 @@
+Seda lehte saad ainult lugeda. Saad küll vaadata lehe põhja aga muuta midagi ei saa. Suhtle oma serveri administraatoriga kui Sa millegagi rahul pole.
+
diff --git a/wiki/inc/lang/et/recent.txt b/wiki/inc/lang/et/recent.txt
new file mode 100644
index 0000000..cf7a854
--- /dev/null
+++ b/wiki/inc/lang/et/recent.txt
@@ -0,0 +1,5 @@
+====== Viimased muutused ======
+
+Viimati muudeti alljärgnevaid lehti.
+
+
diff --git a/wiki/inc/lang/et/register.txt b/wiki/inc/lang/et/register.txt
new file mode 100644
index 0000000..9cd0b91
--- /dev/null
+++ b/wiki/inc/lang/et/register.txt
@@ -0,0 +1,4 @@
+====== Registreeri uus kasutaja ======
+
+Täida alljärgnevad lüngad et me saaks Sulle Wikis kasutajakonto tekitada. Ole nii kena ja kindlasti pane kirja oma **kehtiv e-posti aadress** - Sinu uus parool saadetakse sellele aadressile. Sisselogimise nimi peaks olema kehtiv [[doku>pagename|lehenimi]].
+
diff --git a/wiki/inc/lang/et/registermail.txt b/wiki/inc/lang/et/registermail.txt
new file mode 100644
index 0000000..3b78963
--- /dev/null
+++ b/wiki/inc/lang/et/registermail.txt
@@ -0,0 +1,10 @@
+Uus kasutaja on registreeritud. Tema info:
+
+Kasutaja     : @NEWUSER@
+Täielik nimi : @NEWNAME@
+E-post       : @NEWEMAIL@
+
+Kuupäev      : @DATE@
+Lehitseja    : @BROWSER@
+IP-Aaddress  : @IPADDRESS@
+Hosti nimi   : @HOSTNAME@
diff --git a/wiki/inc/lang/et/resendpwd.txt b/wiki/inc/lang/et/resendpwd.txt
new file mode 100644
index 0000000..cd0ef8d
--- /dev/null
+++ b/wiki/inc/lang/et/resendpwd.txt
@@ -0,0 +1,4 @@
+====== Saada uus parool ======
+
+Palun sisesta oma kasutaja nimi, et saada uut parooli. Soovi kinnitamiseks saadame Sinu meilile lingi.
+
diff --git a/wiki/inc/lang/et/resetpwd.txt b/wiki/inc/lang/et/resetpwd.txt
new file mode 100644
index 0000000..3a80298
--- /dev/null
+++ b/wiki/inc/lang/et/resetpwd.txt
@@ -0,0 +1,3 @@
+====== Sea uus salasõna ======
+
+Sisesta oma selle wiki kasutajale uus salasõna
\ No newline at end of file
diff --git a/wiki/inc/lang/et/revisions.txt b/wiki/inc/lang/et/revisions.txt
new file mode 100644
index 0000000..c546a1f
--- /dev/null
+++ b/wiki/inc/lang/et/revisions.txt
@@ -0,0 +1,4 @@
+====== eelnevad versioonid ======
+
+Need on käesoleva dokumendi eelnevad versioonid. Vana versiooni juurde tagasi pöördumiseks vali sobiv, klõpsa ''Toimeta seda lehte'' peal ja salvesta see.
+
diff --git a/wiki/inc/lang/et/searchpage.txt b/wiki/inc/lang/et/searchpage.txt
new file mode 100644
index 0000000..546ae0e
--- /dev/null
+++ b/wiki/inc/lang/et/searchpage.txt
@@ -0,0 +1,4 @@
+====== Otsi ======
+
+Leiad vasted oma otsingule. @CREATEPAGEINFO@
+
diff --git a/wiki/inc/lang/et/showrev.txt b/wiki/inc/lang/et/showrev.txt
new file mode 100644
index 0000000..ef73d74
--- /dev/null
+++ b/wiki/inc/lang/et/showrev.txt
@@ -0,0 +1,2 @@
+**See on dokumendi vana versioon!**
+----
diff --git a/wiki/inc/lang/et/stopwords.txt b/wiki/inc/lang/et/stopwords.txt
new file mode 100644
index 0000000..5dda5f7
--- /dev/null
+++ b/wiki/inc/lang/et/stopwords.txt
@@ -0,0 +1,15 @@
+# This is a list of words the indexer ignores, one word per line
+# When you edit this file be sure to use UNIX line endings (single newline)
+# No need to include words shorter than 3 chars - these are ignored anyway
+# This list is based upon the ones found at http://www.ranks.nl/stopwords/
+ning
+ega
+see
+mina
+sina
+tema
+meie
+teie
+nemad
+com
+www
diff --git a/wiki/inc/lang/et/subscr_digest.txt b/wiki/inc/lang/et/subscr_digest.txt
new file mode 100644
index 0000000..d382912
--- /dev/null
+++ b/wiki/inc/lang/et/subscr_digest.txt
@@ -0,0 +1,17 @@
+Tere!
+
+Wiki-s @TITLE@ toimetati lehekülge @PAGE@.
+
+Muudatustest lähemalt:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Endine: @OLDPAGE@
+Uus: @NEWPAGE@
+
+Lehekülje teavituste katkestamiseks, sisene wiki-sse aadressil @DOKUWIKIURL@
+ja mine:
+@SUBSCRIBE@
+ning loobu lehekülje ja/või nimeruumi muudatuste teavitustest.
diff --git a/wiki/inc/lang/et/subscr_form.txt b/wiki/inc/lang/et/subscr_form.txt
new file mode 100644
index 0000000..61a005b
--- /dev/null
+++ b/wiki/inc/lang/et/subscr_form.txt
@@ -0,0 +1,3 @@
+====== Tellimuste haldus ======
+
+See lehekülg lubab sul hallata oma tellimusi antud leheküljele ja nimeruumile.
\ No newline at end of file
diff --git a/wiki/inc/lang/et/subscr_list.txt b/wiki/inc/lang/et/subscr_list.txt
new file mode 100644
index 0000000..ec32a6b
--- /dev/null
+++ b/wiki/inc/lang/et/subscr_list.txt
@@ -0,0 +1,15 @@
+Tere!
+
+Wiki-s @TITLE@ toimetati nimeruumi @PAGE@.
+Muudatustest lähemalt:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+Endine: @OLDPAGE@
+Uus: @NEWPAGE@
+
+Lehekülje teavituste katkestamiseks, sisene wiki-sse aadressil @DOKUWIKIURL@
+ja mine:
+@SUBSCRIBE@
+ning loobu lehekülje ja/või nimeruumi muudatuste teavitustest.
diff --git a/wiki/inc/lang/et/subscr_single.txt b/wiki/inc/lang/et/subscr_single.txt
new file mode 100644
index 0000000..02069a6
--- /dev/null
+++ b/wiki/inc/lang/et/subscr_single.txt
@@ -0,0 +1,19 @@
+Tere!
+
+Wiki-s @TITLE@ toimetati lehekülge @PAGE@.
+Muudatustest lähemalt:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Kuupäev : @DATE@
+Kasutaja : @USER@
+Kokkuvõte: @SUMMARY@
+Endine: @OLDPAGE@
+Uus: @NEWPAGE@
+
+Lehekülje teavituste katkestamiseks, sisene wiki-sse aadressil @DOKUWIKIURL@
+ja mine:
+@SUBSCRIBE@
+ning loobu lehekülje ja/või nimeruumi muudatuste teavitustest.
diff --git a/wiki/inc/lang/et/updateprofile.txt b/wiki/inc/lang/et/updateprofile.txt
new file mode 100644
index 0000000..35da128
--- /dev/null
+++ b/wiki/inc/lang/et/updateprofile.txt
@@ -0,0 +1,5 @@
+====== Uuenda oma kasutaja infot ======
+
+Täida ainult need väljad, mida tahad uuendada. Uuendada ei saa kasutajanime.
+
+
diff --git a/wiki/inc/lang/et/uploadmail.txt b/wiki/inc/lang/et/uploadmail.txt
new file mode 100644
index 0000000..2c21926
--- /dev/null
+++ b/wiki/inc/lang/et/uploadmail.txt
@@ -0,0 +1,12 @@
+Sinu DokuWiki-sse lisati fail.
+Lähemalt:
+
+  Fail                 : @MEDIA@
+  Endine            : @OLD@
+  Kuupäev         : @DATE@
+  Veebilehitseja : @BROWSER@
+  IP-aadress      : @IPADDRESS@
+  Hostinimi         : @HOSTNAME@
+  Suurus            : @SIZE@
+  MIME liik         : @MIME@
+  Kasutaja          : @ USER@
diff --git a/wiki/inc/lang/eu/admin.txt b/wiki/inc/lang/eu/admin.txt
new file mode 100644
index 0000000..1367326
--- /dev/null
+++ b/wiki/inc/lang/eu/admin.txt
@@ -0,0 +1,3 @@
+====== Kudeaketa ======
+
+Jarraian wikia kudeatzeko erabilgarri dauden tresnak aurki ditzakezu.
diff --git a/wiki/inc/lang/eu/adminplugins.txt b/wiki/inc/lang/eu/adminplugins.txt
new file mode 100644
index 0000000..20709bf
--- /dev/null
+++ b/wiki/inc/lang/eu/adminplugins.txt
@@ -0,0 +1 @@
+===== Plugin Gehigarriak =====
\ No newline at end of file
diff --git a/wiki/inc/lang/eu/backlinks.txt b/wiki/inc/lang/eu/backlinks.txt
new file mode 100644
index 0000000..8cbb7b6
--- /dev/null
+++ b/wiki/inc/lang/eu/backlinks.txt
@@ -0,0 +1,3 @@
+====== Itzulera Estekak ======
+
+Orri honetara bueltan estekatzen dutela diruditen orrien lista bat da honakoa.
\ No newline at end of file
diff --git a/wiki/inc/lang/eu/conflict.txt b/wiki/inc/lang/eu/conflict.txt
new file mode 100644
index 0000000..d7d0d33
--- /dev/null
+++ b/wiki/inc/lang/eu/conflict.txt
@@ -0,0 +1,5 @@
+====== Bertsio berriago bat existitzen da ======
+
+Editatu duzun dokumentua baino bertsio berriago existitzen da. Editatzen ari zarela beste erabiltzaile batek dokumentua aldatzen duenean gertatzen da hau.
+
+Aztertu arretaz behean erakutsitako desberdintasunak eta erabaki zein bertsio mantendu. Zure aukera "Gorde" bada, zure bertsioa gordeko da. Uneko bertsioa mantentzeko "ezeztatu" sakatu.
\ No newline at end of file
diff --git a/wiki/inc/lang/eu/denied.txt b/wiki/inc/lang/eu/denied.txt
new file mode 100644
index 0000000..869c4c7
--- /dev/null
+++ b/wiki/inc/lang/eu/denied.txt
@@ -0,0 +1,4 @@
+====== Ez duzu baimenik ======
+
+Barkatu, ez duzu baimenik orri hau ikusteko.
+
diff --git a/wiki/inc/lang/eu/diff.txt b/wiki/inc/lang/eu/diff.txt
new file mode 100644
index 0000000..8d335ea
--- /dev/null
+++ b/wiki/inc/lang/eu/diff.txt
@@ -0,0 +1,4 @@
+====== Aldaketak ======
+
+Aukeratutako bertsioaren eta egungo bertsioaren arteko aldaketak aurkezten ditu.
+
diff --git a/wiki/inc/lang/eu/draft.txt b/wiki/inc/lang/eu/draft.txt
new file mode 100644
index 0000000..5d64b0b
--- /dev/null
+++ b/wiki/inc/lang/eu/draft.txt
@@ -0,0 +1,5 @@
+====== Zirriborro fitxategia aurkitu da ======
+
+Zure azken edizio saioa orri honetan ez zen zuzen burutu. DokuWiki-k automatikoki zirriborro bat gorde zuen lanean ari zinen bitartean eta orain zure edizioa jarraitzeko erabili dezakezu. Behean ikusi dezakezu zure asken saioan gorde ziren datuak.
+
+Erabaki mesedez zure edizio saio galdua //berreskuratu// nahi duzun, automatikoki gordetako zirriborroa //ezabatu// nahi duzun edo edizio prozesua //ezeztatu// nahi duzun.
\ No newline at end of file
diff --git a/wiki/inc/lang/eu/edit.txt b/wiki/inc/lang/eu/edit.txt
new file mode 100644
index 0000000..c117731
--- /dev/null
+++ b/wiki/inc/lang/eu/edit.txt
@@ -0,0 +1 @@
+Egin aldaketak eta ''Gorde'' pultsatu. Begiratu [[wiki:syntax]] Wiki-aren sintaxiarentzat. Mesedez aldaketak orrialdea **hobetzeko** bakarrik egin itzazu. Probak egin nahi badituzu, ikas ezazu [[playground:playground]] erabiltzen.
diff --git a/wiki/inc/lang/eu/editrev.txt b/wiki/inc/lang/eu/editrev.txt
new file mode 100644
index 0000000..920cd89
--- /dev/null
+++ b/wiki/inc/lang/eu/editrev.txt
@@ -0,0 +1,2 @@
+**Dokumentuaren bertsio zahar bat ireki duzu!** Gordetzen baduzu bertsio berri bat sortuko duzu datu hauekin.
+----
diff --git a/wiki/inc/lang/eu/index.txt b/wiki/inc/lang/eu/index.txt
new file mode 100644
index 0000000..30f8849
--- /dev/null
+++ b/wiki/inc/lang/eu/index.txt
@@ -0,0 +1,4 @@
+====== Aurkibidea ======
+
+[[doku>namespaces|namespaces]] bitartez ordenatutako aurkibidea da hau.
+
diff --git a/wiki/inc/lang/eu/install.html b/wiki/inc/lang/eu/install.html
new file mode 100644
index 0000000..ce2eeb3
--- /dev/null
+++ b/wiki/inc/lang/eu/install.html
@@ -0,0 +1,9 @@
+<p>Orri honek <a href="http://dokuwiki.org">Dokuwiki-ren</a> lehenengo instalazioan eta konfigurazioan gidatzen du. Instalatzaile honen informazio gehiago eskuragarri dago bere <a href="http://dokuwiki.org/installer">dokumentazio orrian</a>.</p>
+
+<p>DokuWikik fitxategi arruntak erabiltzen ditu wiki orriak eta orri horiekin erlazionatutako informazioa (adb. irudiak, bilaketa indizeak, azken berrikuspenak, etab.) gordetzeko. Modu egokian funtziona dezan, DokuWikik idazketa baimena <strong>behar</strong> du fitxategi horiek gordetzen dituzten direktorioetan. Instalatzaile hau ez da gai direktorio baimenak ezartzeko. Hori normalean komando bidez egin beharra dago, edo hosting bat erabiliz gero, FTP bidez edo hosting-aren kontrol panel bidez (adb. cPanel).</p>
+
+<p>Instalatzaile honek zure DokiWikiren konfigurazioa ezarriko du
+<abbr title="atzipen kontrol lista">AKL</abbr>rentzat, zeinak administratzaileei ahalbidetzen dien saioa hasi eta DokuWikiren administrazio menua atzitzea plugin-ak instalatu, erabiltzaileak kudeatu, wiki orrietara atzipenak kudeatu eta konfigurazio aukerak aldatzeko. Hau ez da beharrezkoa DokuWikirentzat funtziona ahal dezan, baina DokuWiki administratzeko errazagoa egingo du.</p>
+
+<p>Esperientziadun erabiltzaileek edo ezarpen behar bereziak dituzten erabiltzaileek honako estekak erabili beharko lituzkete xehetasun gehiago lortzeko
+<a href="http://dokuwiki.org/install">instalazio azalpenen</a> inguruan eta <a href="http://dokuwiki.org/config">konfigurazio ezarpenen</a> inguruan.</p>
\ No newline at end of file
diff --git a/wiki/inc/lang/eu/jquery.ui.datepicker.js b/wiki/inc/lang/eu/jquery.ui.datepicker.js
new file mode 100644
index 0000000..8ea1ef9
--- /dev/null
+++ b/wiki/inc/lang/eu/jquery.ui.datepicker.js
@@ -0,0 +1,36 @@
+/* Karrikas-ek itzulia (karrikas@karrikas.com) */
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "../widgets/datepicker" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery.datepicker );
+	}
+}( function( datepicker ) {
+
+datepicker.regional.eu = {
+	closeText: "Egina",
+	prevText: "&#x3C;Aur",
+	nextText: "Hur&#x3E;",
+	currentText: "Gaur",
+	monthNames: [ "urtarrila","otsaila","martxoa","apirila","maiatza","ekaina",
+		"uztaila","abuztua","iraila","urria","azaroa","abendua" ],
+	monthNamesShort: [ "urt.","ots.","mar.","api.","mai.","eka.",
+		"uzt.","abu.","ira.","urr.","aza.","abe." ],
+	dayNames: [ "igandea","astelehena","asteartea","asteazkena","osteguna","ostirala","larunbata" ],
+	dayNamesShort: [ "ig.","al.","ar.","az.","og.","ol.","lr." ],
+	dayNamesMin: [ "ig","al","ar","az","og","ol","lr" ],
+	weekHeader: "As",
+	dateFormat: "yy-mm-dd",
+	firstDay: 1,
+	isRTL: false,
+	showMonthAfterYear: false,
+	yearSuffix: "" };
+datepicker.setDefaults( datepicker.regional.eu );
+
+return datepicker.regional.eu;
+
+} ) );
diff --git a/wiki/inc/lang/eu/lang.php b/wiki/inc/lang/eu/lang.php
new file mode 100644
index 0000000..4e074f0
--- /dev/null
+++ b/wiki/inc/lang/eu/lang.php
@@ -0,0 +1,339 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Xabi Ezpeleta <xezpeleta@mendikute.com>
+ * @author Inko Illarramendi <inko.i.a@gmail.com>
+ * @author Zigor Astarbe <astarbe@gmail.com>
+ * @author Yadav Gowda <yadav.gowda@gmail.com>
+ * @author Osoitz <oelkoro@gmail.com>
+ */
+$lang['encoding']              = 'utf-8';
+$lang['direction']             = 'ltr';
+$lang['doublequoteopening']    = '“';
+$lang['doublequoteclosing']    = '”';
+$lang['singlequoteopening']    = '‘';
+$lang['singlequoteclosing']    = '’';
+$lang['apostrophe']            = '’';
+$lang['btn_edit']              = 'Aldatu orri hau';
+$lang['btn_source']            = 'Kodea ikusi';
+$lang['btn_show']              = 'Orria ikusi';
+$lang['btn_create']            = 'Sortu orri hau';
+$lang['btn_search']            = 'Bilatu';
+$lang['btn_save']              = 'Gorde';
+$lang['btn_preview']           = 'Aurrebista';
+$lang['btn_top']               = 'Itzuli gora';
+$lang['btn_newer']             = '<< berriagoa';
+$lang['btn_older']             = 'zaharragoa >>';
+$lang['btn_revs']              = 'Berrikuspen zaharrak';
+$lang['btn_recent']            = 'Azken aldaketak';
+$lang['btn_upload']            = 'Ireki';
+$lang['btn_cancel']            = 'Ezeztatu';
+$lang['btn_index']             = 'Aurkibidea';
+$lang['btn_secedit']           = 'Aldatu';
+$lang['btn_login']             = 'Sartu';
+$lang['btn_logout']            = 'Irten';
+$lang['btn_admin']             = 'Admin';
+$lang['btn_update']            = 'Eguneratu';
+$lang['btn_delete']            = 'Ezabatu';
+$lang['btn_back']              = 'Atzera';
+$lang['btn_backlink']          = 'Itzulera estekak';
+$lang['btn_subscribe']         = 'Harpidetu Orri Aldaketetara';
+$lang['btn_profile']           = 'Eguneratu Profila ';
+$lang['btn_reset']             = 'Aldaketak Desegin';
+$lang['btn_resendpwd']         = 'Pasahitza berria ezarri';
+$lang['btn_draft']             = 'Editatu zirriborroa';
+$lang['btn_recover']           = 'Berreskuratu zirriborroa';
+$lang['btn_draftdel']          = 'Ezabatu zirriborroa';
+$lang['btn_revert']            = 'Berrezarri';
+$lang['btn_register']          = 'Erregistratu';
+$lang['btn_apply']             = 'Baieztatu';
+$lang['btn_media']             = 'Media Kudeatzailea';
+$lang['btn_deleteuser']        = 'Nire kontua kendu';
+$lang['btn_img_backto']        = 'Atzera hona %s';
+$lang['btn_mediaManager']      = 'Media kudeatzailean ikusi';
+$lang['loggedinas']            = 'Erabiltzailea:';
+$lang['user']                  = 'Erabiltzailea';
+$lang['pass']                  = 'Pasahitza';
+$lang['newpass']               = 'Pasahitz berria';
+$lang['oldpass']               = 'Baieztatu oraingo pasahitza';
+$lang['passchk']               = 'berriz';
+$lang['remember']              = 'Gogoratu';
+$lang['fullname']              = 'Izen Deiturak';
+$lang['email']                 = 'E-Maila';
+$lang['profile']               = 'Erabiltzaile Profila';
+$lang['badlogin']              = 'Barkatu, prozesuak huts egin du; saiatu berriz';
+$lang['badpassconfirm']        = 'Pasahitz okerra';
+$lang['minoredit']             = 'Aldaketa Txikiak';
+$lang['draftdate']             = 'Zirriborroa automatikoki gorde da hemen:';
+$lang['nosecedit']             = 'Orria aldatua izan da bitartean, info atala zaharkituta geratu da, orri osoa kargatu da horren ordez.';
+$lang['regmissing']            = 'Barkatu, hutsune guztiak bete behar dituzu.';
+$lang['reguexists']            = 'Barkatu, izen bereko erabiltzailea existitzen da.';
+$lang['regsuccess']            = 'Erabiltzailea sortu da. Pasahitza mailez bidaliko zaizu.';
+$lang['regsuccess2']           = 'Erabiltzailea sortua izan da.';
+$lang['regfail']               = 'Ezin izan da erabiltzailea sortu';
+$lang['regmailfail']           = 'Badirudi arazoren bat egon dela pasahitza mailez bidaltzeko orduan. Administratzailearekin harremanetan jarri!';
+$lang['regbadmail']            = 'Emandako helbidea ez da zuzena - jarri harremanetan administratzailearekin hau akats bat dela uste baduzu';
+$lang['regbadpass']            = 'Idatzitako bi pasahitzak ez dira berdinak, berriz saiatu.';
+$lang['regpwmail']             = 'Zure DokuWiki pasahitza';
+$lang['reghere']               = 'Oraindik ez duzu konturik? Eginzazu bat!';
+$lang['profna']                = 'Wiki honek ez du profilaren aldaketa ahalbidetzen';
+$lang['profnochange']          = 'Aldaketarik ez, ez dago egiteko ezer.';
+$lang['profnoempty']           = 'Izen edota e-posta hutsa ez dago onartua.';
+$lang['profchanged']           = 'Erabiltzaile profila arrakastaz eguneratua.';
+$lang['profnodelete']          = 'Wiki honek ez du erabiltzaileak ezabatzea onartzen';
+$lang['profdeleteuser']        = 'Kontua ezabatu';
+$lang['profdeleted']           = 'Zure erabiltzaile kontua wiki honetatik ezabatu da';
+$lang['profconfdelete']        = 'Nire kontua kendu nahi dut wiki honetatik. <br/>Ekintza hau ezin da desegin.';
+$lang['profconfdeletemissing'] = 'Ez da egiaztaketa-kutxa markatu';
+$lang['proffail']              = 'Erabiltzailearen perfila ez da eguneratu';
+$lang['pwdforget']             = 'Pasahitza ahaztu duzu? Eskuratu berri bat';
+$lang['resendna']              = 'Wiki honek ez du pasahitz berbidalketa onartzen.';
+$lang['resendpwd']             = '-entzat pasahitza berria ezarri';
+$lang['resendpwdmissing']      = 'Barkatu, eremu guztiak bete behar dituzu.';
+$lang['resendpwdnouser']       = 'Barkatu, ez dugu erabiltzaile hori datu-basean aurkitzen';
+$lang['resendpwdbadauth']      = 'Barkatu, kautotze kodea ez da baliozkoa. Ziurtatu baieztapen esteka osoa erabili duzula.';
+$lang['resendpwdconfirm']      = 'Baieztapen esteka bat e-postaz bidali da.';
+$lang['resendpwdsuccess']      = 'Zure pasahitz berria e-postaz bidali da.';
+$lang['license']               = 'Besterik esan ezean, wiki hontako edukia ondorengo lizentziapean argitaratzen da:';
+$lang['licenseok']             = 'Oharra: Orri hau editatzean, zure edukia ondorengo lizentziapean argitaratzea onartzen duzu: ';
+$lang['searchmedia']           = 'Bilatu fitxategi izena:';
+$lang['searchmedia_in']        = 'Bilatu %s-n';
+$lang['txt_upload']            = 'Ireki nahi den fitxategia aukeratu:';
+$lang['txt_filename']          = 'Idatzi wikiname-a (aukerazkoa):';
+$lang['txt_overwrt']           = 'Oraingo fitxategiaren gainean idatzi';
+$lang['maxuploadsize']         = 'Igo gehienez %s fitxategiko';
+$lang['lockedby']              = 'Momentu honetan blokeatzen:';
+$lang['lockexpire']            = 'Blokeaketa iraungitzen da:';
+$lang['js']['willexpire']      = 'Zure blokeaketa orri hau aldatzeko minutu batean iraungitzen da.\nGatazkak saihesteko, aurreikusi botoia erabili blokeaketa denboragailua berrabiarazteko.';
+$lang['js']['notsavedyet']     = 'Gorde gabeko aldaketak galdu egingo dira.
+Benetan jarraitu nahi duzu?';
+$lang['js']['searchmedia']     = 'Bilatu fitxategiak';
+$lang['js']['keepopen']        = 'Mantendu leihoa irekita aukeraketan';
+$lang['js']['hidedetails']     = 'Xehetasunak Ezkutatu';
+$lang['js']['mediatitle']      = 'Esteken ezarpenak';
+$lang['js']['mediadisplay']    = 'Esteka mota';
+$lang['js']['mediaalign']      = 'Lerrokatzea';
+$lang['js']['mediasize']       = 'Irudi tamaina';
+$lang['js']['mediatarget']     = 'Estekaren helburua';
+$lang['js']['mediaclose']      = 'Itxi';
+$lang['js']['mediainsert']     = 'Txertatu';
+$lang['js']['mediadisplayimg'] = 'Irudia erakutsi';
+$lang['js']['mediadisplaylnk'] = 'Esteka bakarrik erakutsi';
+$lang['js']['mediasmall']      = 'Bertsio txikia';
+$lang['js']['mediamedium']     = 'Bertsio ertaina';
+$lang['js']['medialarge']      = 'Bertsio handia';
+$lang['js']['mediaoriginal']   = 'Jatorrizko bertsioa';
+$lang['js']['medialnk']        = 'Esteka xehetasunen orrira';
+$lang['js']['mediadirect']     = 'Jatorrizkora esteka zuzena';
+$lang['js']['medianolnk']      = 'Estekarik ez';
+$lang['js']['medianolink']     = 'Ez estekatu irudia';
+$lang['js']['medialeft']       = 'Irudia ezkerrean lerrokatu';
+$lang['js']['mediaright']      = 'Irudia eskuinean lerrokatu';
+$lang['js']['mediacenter']     = 'Irudia erdian lerrokatu';
+$lang['js']['medianoalign']    = 'Ez erabili lerrokatzerik';
+$lang['js']['nosmblinks']      = 'Window baliabide konpartituetara estekek Microsoft Internet Explorer-en bakarrik balio dute.
+Esteka kopiatu eta itsatsi dezakezu dena den.';
+$lang['js']['linkwiz']         = 'Estekatze Laguntzailea';
+$lang['js']['linkto']          = 'Estekatu hona:';
+$lang['js']['del_confirm']     = 'Benetan ezabatu aukeratutako fitxategia(k)?';
+$lang['js']['restore_confirm'] = 'Benetan bertsio hau berrezarri?';
+$lang['js']['media_diff']      = 'Diferentziak ikusi:';
+$lang['js']['media_diff_both'] = 'Ondoz ondo';
+$lang['js']['media_diff_portions'] = 'Pasatu hatza';
+$lang['js']['media_select']    = 'Fitxategiak hautatu';
+$lang['js']['media_upload_btn'] = 'Igo';
+$lang['js']['media_done_btn']  = 'Egina';
+$lang['js']['media_drop']      = 'Fitxategiak igotzeko hona bota';
+$lang['js']['media_cancel']    = 'ezabatu';
+$lang['js']['media_overwrt']   = 'Dauden fitxategiak berridatzi';
+$lang['rssfailed']             = 'Errorea gertatu da feed hau irakurtzean:';
+$lang['nothingfound']          = 'Ez da ezer aurkitu.';
+$lang['mediaselect']           = 'Aukeratu Multimedia fitxategia';
+$lang['uploadsucc']            = 'Igoera arrakastatsua';
+$lang['uploadfail']            = 'Igoerak huts egin du. Baimen arazoengatik agian?';
+$lang['uploadwrong']           = 'Fitxategi igoera ukatua. Fitxategi-luzapen hau debekatua dago!';
+$lang['uploadexist']           = 'Fitxategia lehenagotik existitzen da. Ez da ezer egin.';
+$lang['uploadbadcontent']      = 'Igotako edukia ez dator bat %s fitxategi-luzapenarekin.';
+$lang['uploadspam']            = 'Igoera spam zerrenda beltzak blokeatu du.';
+$lang['uploadxss']             = 'Igoera blokeatua izan da eduki maltzurra edukitzeko susmoagatik.';
+$lang['uploadsize']            = 'Igotako fitxategia handiegia zen. (max. %s)';
+$lang['deletesucc']            = 'Ezabatua izan da "%s" fitxategia.';
+$lang['deletefail']            = 'Ezin izan da "%s" ezabatu - egiaztatu baimenak.';
+$lang['mediainuse']            = 'Ez da "%s" fitxategia ezabatu - oraindik erabilia izaten ari da.';
+$lang['namespaces']            = 'Izen-espazioak';
+$lang['mediafiles']            = 'Fitxategiak eskuragarri hemen:';
+$lang['accessdenied']          = 'Ez zaude orri hau ikusteko baimendua';
+$lang['mediausage']            = 'Erabili ondoko sintaxia fitxategi honi erreferentzia egiteko:';
+$lang['mediaview']             = 'Ikusi jatorrizko fitxategia';
+$lang['mediaroot']             = 'root';
+$lang['mediaupload']           = 'Igo fitxategi bat uneko izen-espaziora. Azpi-izen-espazioak sortzeko, zure "Honela igo" fitxategi izenaren aurretik ezarri, bi puntuz (:) bananduta.';
+$lang['mediaextchange']        = 'Fitxategi-luzapena aldatua .%s -tik .%s! -ra';
+$lang['reference']             = 'Erreferentziak honentzat:';
+$lang['ref_inuse']             = 'Fitxategia ezin da ezabatu, honako orri hauek erabiltzen dutelako:';
+$lang['ref_hidden']            = 'Erreferentzi batzuk irakurtzeko baimenik ez duzun orrietan daude';
+$lang['hits']                  = 'Hits';
+$lang['quickhits']             = 'Matching pagenames';
+$lang['toc']                   = 'Eduki Taula';
+$lang['current']               = 'egungoa';
+$lang['yours']                 = 'Zure Bertsioa';
+$lang['diff']                  = 'egungo bertsioarekin dituen aldaketak aurkezten ditu';
+$lang['diff2']                 = 'Erakutsi desberdintasunak aukeratutako bertsioen artean';
+$lang['difflink']              = 'Estekatu konparaketa bista honetara';
+$lang['diff_type']             = 'Ikusi diferentziak:';
+$lang['diff_inline']           = 'Lerro tartean';
+$lang['diff_side']             = 'Ondoz ondo';
+$lang['diffprevrev']           = 'Aurreko errebisioa';
+$lang['diffnextrev']           = 'Hurrengo errebisioa';
+$lang['difflastrev']           = 'Azken errebisioa';
+$lang['diffbothprevrev']       = 'Alde biak aurreko errebisioa';
+$lang['diffbothnextrev']       = 'Alde biak hurrengo errebisioa';
+$lang['line']                  = 'Marra';
+$lang['breadcrumb']            = 'Traza:';
+$lang['youarehere']            = 'Hemen zaude:';
+$lang['lastmod']               = 'Azken aldaketa:';
+$lang['by']                    = 'egilea:';
+$lang['deleted']               = 'ezabatua';
+$lang['created']               = 'sortua';
+$lang['restored']              = 'bertsio zaharra berrezarria (%s)';
+$lang['external_edit']         = 'kanpoko aldaketa';
+$lang['summary']               = 'Aldatu laburpena';
+$lang['noflash']               = '<a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> beharrezkoa da eduki hau bistaratzeko.';
+$lang['download']              = 'Deskarga Snippet-a';
+$lang['tools']                 = 'Tresnak';
+$lang['user_tools']            = 'Erabiltzaile Tresnak';
+$lang['site_tools']            = 'Gune Tresnak';
+$lang['page_tools']            = 'Orri Tresnak';
+$lang['skip_to_content']       = 'edukira sahiestu';
+$lang['sidebar']               = 'Alboko-barra';
+$lang['mail_newpage']          = '[DokuWiki] gehitutako orria:';
+$lang['mail_changed']          = '[DokuWiki] aldatutako orria:';
+$lang['mail_subscribe_list']   = 'izen-espazioan aldatutako orriak:';
+$lang['mail_new_user']         = 'erabiltzaile berria:';
+$lang['mail_upload']           = 'fitxategia igota:';
+$lang['changes_type']          = '-ren aldaketak ikusi';
+$lang['pages_changes']         = 'Orriak';
+$lang['media_changes']         = 'Media fitxategiak';
+$lang['both_changes']          = 'Bai orriak nahiz media fitxategiak';
+$lang['qb_bold']               = 'Letra beltzez';
+$lang['qb_italic']             = 'Letra italiarrez';
+$lang['qb_underl']             = 'Azpimarratua';
+$lang['qb_code']               = 'Kodea';
+$lang['qb_strike']             = 'Marratu Testua';
+$lang['qb_h1']                 = 'Izenburua 1';
+$lang['qb_h2']                 = 'Izenburua 2';
+$lang['qb_h3']                 = 'Izenburua 3';
+$lang['qb_h4']                 = 'Izenburua 4';
+$lang['qb_h5']                 = 'Izenburua 5';
+$lang['qb_h']                  = 'Izenburua';
+$lang['qb_hs']                 = 'Izenburua Aukeratu';
+$lang['qb_hplus']              = 'Izenburu Handiagoa';
+$lang['qb_hminus']             = 'Izenburu Txikiagoa';
+$lang['qb_hequal']             = 'Maila Berdineko Izenburua';
+$lang['qb_link']               = 'Barruko Lotura';
+$lang['qb_extlink']            = 'Kanpoko Lotura';
+$lang['qb_hr']                 = 'Horizontal Marra';
+$lang['qb_ol']                 = 'Zerrenda ordenatuko gaia';
+$lang['qb_ul']                 = 'Zerrenda desordenatuko gaia';
+$lang['qb_media']              = 'Irudiak eta beste fitxategiak gehitu';
+$lang['qb_sig']                = 'Gehitu sinadura';
+$lang['qb_smileys']            = 'Irrifartxoak';
+$lang['qb_chars']              = 'Karaktere Bereziak';
+$lang['upperns']               = 'Jauzi izen-espazio gurasora';
+$lang['metaedit']              = 'Metadatua Aldatu';
+$lang['metasaveerr']           = 'Metadatuaren idazketak huts egin du';
+$lang['metasaveok']            = 'Metadatua gordea';
+$lang['img_title']             = 'Izenburua:';
+$lang['img_caption']           = 'Epigrafea:';
+$lang['img_date']              = 'Data:';
+$lang['img_fname']             = 'Fitxategi izena:';
+$lang['img_fsize']             = 'Tamaina:';
+$lang['img_artist']            = 'Artista:';
+$lang['img_copyr']             = 'Copyright:';
+$lang['img_format']            = 'Formatua:';
+$lang['img_camera']            = 'Kamera:';
+$lang['img_keywords']          = 'Hitz-gakoak:';
+$lang['img_width']             = 'Zabalera:';
+$lang['img_height']            = 'Altuera:';
+$lang['subscr_subscribe_success'] = '%s gehitua %s-ren harpidetza zerrendara';
+$lang['subscr_subscribe_error'] = 'Errorea %s gehitzen %s-ren harpidetza zerrendara';
+$lang['subscr_subscribe_noaddress'] = 'Ez dago helbiderik zure login-arekin lotuta, ezin zara harpidetza zerrendara gehitua izan.';
+$lang['subscr_unsubscribe_success'] = '%s ezabatua %s-ren harpidetza zerrendatik';
+$lang['subscr_unsubscribe_error'] = 'Errorea %s ezabatzen %s-ren harpidetza zerrendatik';
+$lang['subscr_already_subscribed'] = '%s lehendik harpidetua dago %s-n';
+$lang['subscr_not_subscribed'] = '%s ez dago %s-n harpidetua';
+$lang['subscr_m_not_subscribed'] = 'Momentu honetan ez zaude orri honetara edo izen-espazio honetara harpidetua.';
+$lang['subscr_m_new_header']   = 'Gehitu harpidetza';
+$lang['subscr_m_current_header'] = 'Uneko harpidetzak';
+$lang['subscr_m_unsubscribe']  = 'Kendu harpidetza';
+$lang['subscr_m_subscribe']    = 'Harpidetu';
+$lang['subscr_m_receive']      = 'Jaso';
+$lang['subscr_style_every']    = 'e-posta aldaketa bakoitzean';
+$lang['subscr_style_digest']   = 'e-posta laburbildua orri bakoitzeko aldaketentzat (%.2f egunero)';
+$lang['subscr_style_list']     = 'aldatutako orrien zerrenda azken e-postatik (%.2f egunero)';
+$lang['authtempfail']          = 'Erabiltzaile kautotzea denboraldi batez ez dago erabilgarri. Egoerak hala jarraitzen badu, mesedez, eman honen berri Wiki administratzaileari';
+$lang['i_chooselang']          = 'Hautatu zure hizkuntza';
+$lang['i_installer']           = 'DokuWiki instalatzailea';
+$lang['i_wikiname']            = 'Wiki Izena';
+$lang['i_enableacl']           = 'Gaitu ACL (gomendatua) (ACL: Atzipen Kontrol Lista)';
+$lang['i_superuser']           = 'Supererabiltzailea';
+$lang['i_problems']            = 'Instalatzaileak arazo batzuk aurkitu ditu, behean azalduak. Ezin duzu horiek konpondu arte jarraitu.';
+$lang['i_modified']            = 'Segurtasun arrazoiengatik, script hau DokuWikiren instalazio berri eta aldatu gabeko batekin bakarrik dabil. Deskargatutako paketetik fitxategiak berriz atera edo <a href="http://dokuwiki.org/install">DokuWikiren instalazio azalpenak</a> osorik irakurri beharko zenituzke.';
+$lang['i_funcna']              = 'PHP <code>%s</code> funtzioa ez dago erabilgarri. Agian zure hosting hornitzaileak arrazoiren batengatik ezgaituko zuen?';
+$lang['i_phpver']              = 'Zure PHP <code>%s</code> bertsioa behar den <code>%s</code> bertsioa baino zaharragoa da. PHP instalazioa eguneratu beharra daukazu.';
+$lang['i_permfail']            = 'DokuWiki ez da   <code>%s</code> idazteko gai. Direktorio honen baimenen konfigurazioa konpondu behar duzu!';
+$lang['i_confexists']          = '<code>%s</code> lehendik existitzen da';
+$lang['i_writeerr']            = 'Ezin da <code>%s</code> sortu. Direktorioaren/fitxategiaren baimenak egiaztatu eta sortu fitxategia eskuz.';
+$lang['i_badhash']             = 'aldatutakoa edo ezezaguna den dokuwiki.php (hash=<code>%s</code>)';
+$lang['i_badval']              = '<code>%s</code> - balioa arauen aurka edo hutsa';
+$lang['i_success']             = 'Konfigurazioa arrakastaz amaitu da. Orain, install.php fitxategia ezabatu dezakezu. Jarraitu ezazu <a href="doku.php?id=wiki:welcome">zure DokuWiki berrian</a>.';
+$lang['i_failure']             = 'Akats batzuk gertatu dira konfigurazio fitxategiak idazterakoan. Hauek eskuz konpondu beharra izan dezakezu <a href="doku.php?id=wiki:welcome">zure DokuWiki berria</a> erabili ahal izan aurretik.';
+$lang['i_policy']              = 'Hasierako ACL politika';
+$lang['i_pol0']                = 'Wiki Irekia (irakurri, idatzi, fitxategiak igo edonorentzat)';
+$lang['i_pol1']                = 'Wiki Publikoa (irakurri edonorentzat, idatzi eta fitxategiak igo erregistratutako erabiltzaileentzat)';
+$lang['i_pol2']                = 'Wiki Itxia (irakurri, idatzi, fitxategiak igo erregistratutako erabiltzaileentzat soilik)';
+$lang['i_allowreg']            = 'Baimendu erabiltzaileei bere burua erregistratzea';
+$lang['i_retry']               = 'Berriz saiatu';
+$lang['i_license']             = 'Mesedez, aukeratu zein lizentzipean ezarri nahi duzun zure edukia:';
+$lang['i_license_none']        = 'Ez erakutsi lizentzia informaziorik';
+$lang['i_pop_field']           = 'Lagundu gaitzazu Dokuwiki esperientzia hobetzen:';
+$lang['i_pop_label']           = 'Hilean behin bidali erabilera datu anonimoak Dokuwiki garatzaileei';
+$lang['recent_global']         = 'Une honetan <b>%s</b> izen-espazioaren barneko aldaketak ikusten ari zara.<a href="%s"> Wiki osoaren azken aldaketak</a> ere ikusi ditzakezu.';
+$lang['years']                 = 'duela %d urte';
+$lang['months']                = 'duela %d hilabete';
+$lang['weeks']                 = 'duela %d aste';
+$lang['days']                  = 'duela %d egun';
+$lang['hours']                 = 'duela %d ordu';
+$lang['minutes']               = 'duela %d minutu';
+$lang['seconds']               = 'duela %d segundu';
+$lang['wordblock']             = 'Zure aldaketa ez da aldatua izan blokeatutako testua (spam) daukalako.';
+$lang['media_uploadtab']       = 'Igo';
+$lang['media_searchtab']       = 'Bilatu';
+$lang['media_file']            = 'Fitxategia';
+$lang['media_viewtab']         = 'Begiratu';
+$lang['media_edittab']         = 'Editatu';
+$lang['media_historytab']      = 'Historia';
+$lang['media_list_thumbs']     = 'Iruditxoak';
+$lang['media_list_rows']       = 'Errenkadak';
+$lang['media_sort_name']       = 'Izena';
+$lang['media_sort_date']       = 'Data';
+$lang['media_files']           = '%s -n fitxategiak';
+$lang['media_upload']          = 'Igo %s -ra';
+$lang['media_search']          = 'Bilatu %s -n';
+$lang['media_view']            = '%s';
+$lang['media_viewold']         = '%s -n %s';
+$lang['media_edit']            = '%s editatu';
+$lang['media_history']         = '%s(a)ren historiala';
+$lang['media_meta_edited']     = 'metadatuak editatua';
+$lang['media_perm_read']       = 'Ez duzu fitxategiak irakurtzeko behar beste baimen.';
+$lang['media_perm_upload']     = 'Ez duzu fitxategiak igotzeko behar beste baimen.';
+$lang['media_update']          = 'Bertsio berria igo';
+$lang['media_restore']         = 'Bertsio hau berrezarri';
+$lang['media_acl_warning']     = 'Hau agian ez dago osorik SCL murrizketak eta ezkutuko orriak direla eta.';
+$lang['searchresult']          = 'Bilaketaren emaitza';
+$lang['plainhtml']             = 'HTML hutsa';
+$lang['wikimarkup']            = 'Wiki kodea';
+$lang['page_nonexist_rev']     = 'Ez zegoen %s izeneko orririk. Sortu egin da <a href="%s">%s</a> helbidean.';
+$lang['email_signature_text']  = 'Email hau DokuWiki erabiliz sortu da
+@DOKUWIKIURL@';
diff --git a/wiki/inc/lang/eu/locked.txt b/wiki/inc/lang/eu/locked.txt
new file mode 100644
index 0000000..dc29e51
--- /dev/null
+++ b/wiki/inc/lang/eu/locked.txt
@@ -0,0 +1,3 @@
+====== Orria blokeatua ======
+
+Orrialde hau blokeatua dago beste erabiltzaile batengatik. Berak aldaketak bukatu arte itxaron beharko duzu.
diff --git a/wiki/inc/lang/eu/login.txt b/wiki/inc/lang/eu/login.txt
new file mode 100644
index 0000000..ebb1607
--- /dev/null
+++ b/wiki/inc/lang/eu/login.txt
@@ -0,0 +1,4 @@
+====== Login ======
+
+Ez duzu sesiorik hasi! Sar ezazu zure erabiltzaile izena eta pasahitza. Gogoratu coockie-ak baimenduta izan behar dituzula.
+
diff --git a/wiki/inc/lang/eu/mailtext.txt b/wiki/inc/lang/eu/mailtext.txt
new file mode 100644
index 0000000..ad0ff2f
--- /dev/null
+++ b/wiki/inc/lang/eu/mailtext.txt
@@ -0,0 +1,12 @@
+DokuWiki-Eskuliburuetan orriren bat aldatu edo gehitu da. Hemen dituzu xehetasunak
+
+Data                : @DATE@
+Nabigatzailea       : @BROWSER@
+IP-Helbidea         : @IPADDRESS@
+Host izena          : @HOSTNAME@
+Bertsio zaharra : @OLDPAGE@
+Bertsio berria  : @NEWPAGE@
+Aldatu laburpena    : @SUMMARY@
+Erabiltzailea       : @USER@
+
+@DIFF@
diff --git a/wiki/inc/lang/eu/mailwrap.html b/wiki/inc/lang/eu/mailwrap.html
new file mode 100644
index 0000000..d257190
--- /dev/null
+++ b/wiki/inc/lang/eu/mailwrap.html
@@ -0,0 +1,13 @@
+<html>
+<head>
+<title>@TITLE@</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+</head>
+<body>
+
+@HTMLBODY@
+
+<br /><hr />
+<small>@EMAILSIGNATURE@</small>
+</body>
+</html>
\ No newline at end of file
diff --git a/wiki/inc/lang/eu/newpage.txt b/wiki/inc/lang/eu/newpage.txt
new file mode 100644
index 0000000..cac872c
--- /dev/null
+++ b/wiki/inc/lang/eu/newpage.txt
@@ -0,0 +1,3 @@
+====== Gai hau ez da existitzen oraindik ======
+
+Existitzen ez den gai batera doan lotura bat jarraitu duzu. Zuk zeuk sortu dezakezu ''Sortu orri hau'' erabiliz.
diff --git a/wiki/inc/lang/eu/norev.txt b/wiki/inc/lang/eu/norev.txt
new file mode 100644
index 0000000..7d9cc60
--- /dev/null
+++ b/wiki/inc/lang/eu/norev.txt
@@ -0,0 +1,3 @@
+====== Berrikuspen hau ez da existitzen ======
+
+Zehaztutako bertsioa ez da existitzen. Erabili ''Bertsio zaharrak'' dokumentu honen aurreko bertsioen zerrenda bat ikusi ahal izateko.
diff --git a/wiki/inc/lang/eu/password.txt b/wiki/inc/lang/eu/password.txt
new file mode 100644
index 0000000..a9c079f
--- /dev/null
+++ b/wiki/inc/lang/eu/password.txt
@@ -0,0 +1,6 @@
+Kaixo @FULLNAME@!
+
+Hau da zure erabiltzailea @TITLE@ -rentzako @DOKUWIKIURL@
+
+Erabiltzailea    : @LOGIN@
+Pasahitza : @PASSWORD@
diff --git a/wiki/inc/lang/eu/preview.txt b/wiki/inc/lang/eu/preview.txt
new file mode 100644
index 0000000..1f0d14f
--- /dev/null
+++ b/wiki/inc/lang/eu/preview.txt
@@ -0,0 +1,3 @@
+====== Aurreikuspena ======
+
+Hau zure testuaren aurrebista bat besterik ez da. Gogoratu: **ez da gorde** oraindik!
diff --git a/wiki/inc/lang/eu/pwconfirm.txt b/wiki/inc/lang/eu/pwconfirm.txt
new file mode 100644
index 0000000..ee4e4f8
--- /dev/null
+++ b/wiki/inc/lang/eu/pwconfirm.txt
@@ -0,0 +1,9 @@
+Kaixo @FULLNAME@!
+
+Norbaitek zure @TITLE@ erabiltzailearentzat pasahitz berria eskatu du @DOKUWIKIURL@ gunean.
+
+Ez baduzu zuk eskatu pasahitz berria, ez kasurik egin posta honi.
+
+Eskakizuna zuk bidalia dela egiaztatzeko, mesedez, ondorengo esteka erabili.
+
+@CONFIRM@
diff --git a/wiki/inc/lang/eu/read.txt b/wiki/inc/lang/eu/read.txt
new file mode 100644
index 0000000..f7ed7b0
--- /dev/null
+++ b/wiki/inc/lang/eu/read.txt
@@ -0,0 +1 @@
+Orri hau irakurtzeko bakarrik da. Jatorria ikusi dezakezu baina ezin duzu aldatu. Administratzailearekin kontaktuan jarri  gaizki dagoela uste baduzu.
diff --git a/wiki/inc/lang/eu/recent.txt b/wiki/inc/lang/eu/recent.txt
new file mode 100644
index 0000000..4ab5482
--- /dev/null
+++ b/wiki/inc/lang/eu/recent.txt
@@ -0,0 +1,3 @@
+====== Azken Aldaketak ======
+
+Ondorengo orriak aldatu berriak izan dira:
diff --git a/wiki/inc/lang/eu/register.txt b/wiki/inc/lang/eu/register.txt
new file mode 100644
index 0000000..4a8a49b
--- /dev/null
+++ b/wiki/inc/lang/eu/register.txt
@@ -0,0 +1,3 @@
+====== Erregistratu erabiltzaile berri bezala ======
+
+Bete beheko informazio guztia wiki honetan kontu berri bat sortzeko. Ziurtatu **baliozko posta-e helbide** bat ematen duzula - ez bazaizu hemen eskatzen pasahitzik sartzeko, berri bat bidaliko zaizu helbide horretara. Saioa hasteko izenak baliozko [[doku>pagename|orri izena]] izan behar du.
\ No newline at end of file
diff --git a/wiki/inc/lang/eu/registermail.txt b/wiki/inc/lang/eu/registermail.txt
new file mode 100644
index 0000000..a2897e6
--- /dev/null
+++ b/wiki/inc/lang/eu/registermail.txt
@@ -0,0 +1,10 @@
+Erabiltzaile berri bat erregistratu da. Hona hemen xehetasunak:
+
+Erabiltzaile izena : @NEWUSER@
+Izen osoa : @NEWNAME@
+Posta-e : @NEWEMAIL@
+
+Data : @DATE@
+Nabigatzailea : @BROWSER@
+IP-Helbidea : @IPADDRESS@
+Hostalari izena : @HOSTNAME@
diff --git a/wiki/inc/lang/eu/resendpwd.txt b/wiki/inc/lang/eu/resendpwd.txt
new file mode 100644
index 0000000..98f261c
--- /dev/null
+++ b/wiki/inc/lang/eu/resendpwd.txt
@@ -0,0 +1,3 @@
+====== Bidali pasahitz berria ======
+
+Mesedez, sartu zure erabiltzaile izena beheko formularioan zure wiki honetako kontuarentzat pasahitz berria eskatzeko. Baieztapen esteka bat bidaliko zaizu erregistratutako  zure posta-e helbidera.
\ No newline at end of file
diff --git a/wiki/inc/lang/eu/resetpwd.txt b/wiki/inc/lang/eu/resetpwd.txt
new file mode 100644
index 0000000..9bb6e3a
--- /dev/null
+++ b/wiki/inc/lang/eu/resetpwd.txt
@@ -0,0 +1,3 @@
+	====== Pasahitza berria ezarri ======
+
+Mesedez wiki honetako zure pasahitza berria sartu.
\ No newline at end of file
diff --git a/wiki/inc/lang/eu/revisions.txt b/wiki/inc/lang/eu/revisions.txt
new file mode 100644
index 0000000..203cb7e
--- /dev/null
+++ b/wiki/inc/lang/eu/revisions.txt
@@ -0,0 +1,3 @@
+====== Bertsio zaharrak ======
+
+Hauek egungo dokumentua baino zaharragoak diren bertsioak dira. Hauetako bertsio batetara itzultzeko aukera ezazu behetik, pultsatu ''Sortu orri hau'' eta gorde.
diff --git a/wiki/inc/lang/eu/searchpage.txt b/wiki/inc/lang/eu/searchpage.txt
new file mode 100644
index 0000000..ebd31d0
--- /dev/null
+++ b/wiki/inc/lang/eu/searchpage.txt
@@ -0,0 +1,4 @@
+====== Bilaketa ======
+
+Emaitzak ondorengo aurkiketan bilatu ditzakezu. @CREATEPAGEINFO@
+
diff --git a/wiki/inc/lang/eu/showrev.txt b/wiki/inc/lang/eu/showrev.txt
new file mode 100644
index 0000000..ad1b360
--- /dev/null
+++ b/wiki/inc/lang/eu/showrev.txt
@@ -0,0 +1,2 @@
+**Hau dokumentuaren bertsio zahar bat da!**
+----
diff --git a/wiki/inc/lang/eu/stopwords.txt b/wiki/inc/lang/eu/stopwords.txt
new file mode 100644
index 0000000..1aeb868
--- /dev/null
+++ b/wiki/inc/lang/eu/stopwords.txt
@@ -0,0 +1,26 @@
+# Lista hau, indexatzaileak alde batera uzten dituen hitzen zerrenda da, hitz bat lerroko
+# Fitxategi hau editatzean, ziurtatu UNIX lerro bukaerak (lerro berri bakarra) erabiltzen duzula
+# Ez dago 3 letra baino motzagoak diren hitzik sartu beharrik - bestela ere baztertuak dira
+# This list is based upon the ones found at http://www.ranks.nl/stopwords/
+# FITXATEGI HONEK BEGIRATU BAT BEHAR DU!
+buruz
+dira
+da
+eta
+zure
+haiek
+haien
+com
+nondik
+nora
+nola
+zer
+hau
+zen
+noiz
+non
+nor
+nork
+und
+the
+www
\ No newline at end of file
diff --git a/wiki/inc/lang/eu/subscr_digest.txt b/wiki/inc/lang/eu/subscr_digest.txt
new file mode 100644
index 0000000..d4c32d7
--- /dev/null
+++ b/wiki/inc/lang/eu/subscr_digest.txt
@@ -0,0 +1,16 @@
+Kaixo!
+
+@TITLE@ wikiko @PAGE@ orria aldatu egin da.
+Hemen aldaketak:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Berrikuste zaharra: @OLDPAGE@
+Berrikuste berria: @NEWPAGE@
+
+Orri jakinarazpenak ezeztatzeko, sartu wikian
+@DOKUWIKIURL@ helbidean, bisitatu
+@SUBSCRIBE@
+eta ezabatu orri eta/edo izen-espazio aldaketen harpidetza.
diff --git a/wiki/inc/lang/eu/subscr_form.txt b/wiki/inc/lang/eu/subscr_form.txt
new file mode 100644
index 0000000..02a1178
--- /dev/null
+++ b/wiki/inc/lang/eu/subscr_form.txt
@@ -0,0 +1,3 @@
+====== Harpidetza Kudeaketa ======
+
+Orri honek, oraingo orriko eta izen-espazioko harpidetzak kudeatzeko aukera ematen dizu.
\ No newline at end of file
diff --git a/wiki/inc/lang/eu/subscr_list.txt b/wiki/inc/lang/eu/subscr_list.txt
new file mode 100644
index 0000000..10037c3
--- /dev/null
+++ b/wiki/inc/lang/eu/subscr_list.txt
@@ -0,0 +1,13 @@
+Kaixo!
+
+@TITLE@ wikiko @PAGE@ izen-espazioko orri batzuk aldatu egin dira.
+Hemen aldatutako orriak:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Orri jakinarazpenak ezeztatzeko, sartu wikian
+@DOKUWIKIURL@ helbidean, bisitatu
+@SUBSCRIBE@
+eta ezabatu orri eta/edo izen-espazio aldaketen harpidetza.
diff --git a/wiki/inc/lang/eu/subscr_single.txt b/wiki/inc/lang/eu/subscr_single.txt
new file mode 100644
index 0000000..13b1787
--- /dev/null
+++ b/wiki/inc/lang/eu/subscr_single.txt
@@ -0,0 +1,19 @@
+Kaixo!
+
+@TITLE@ wikiko @PAGE@ orria aldatu egin da.
+Hemen aldaketak:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Data : @DATE@
+Erabiltzailea : @USER@
+Aldaketaren Laburpena: @SUMMARY@
+Berrikuste Zaharra: @OLDPAGE@
+Berrikuste Berria: @NEWPAGE@
+
+Orri jakinarazpenak ezeztatzeko, sartu wikian
+@DOKUWIKIURL@ helbidean, bisitatu
+@SUBSCRIBE@
+eta ezabatu orri eta/edo izen-espazio aldaketen harpidetza.
diff --git a/wiki/inc/lang/eu/updateprofile.txt b/wiki/inc/lang/eu/updateprofile.txt
new file mode 100644
index 0000000..233bfec
--- /dev/null
+++ b/wiki/inc/lang/eu/updateprofile.txt
@@ -0,0 +1,3 @@
+====== Eguneratu zure kontuaren profila ======
+
+Aldatu nahi dituzun atalak bakarrik bete behar dituzu. Ezin duzu zure erabiltzaile izena aldatu.
\ No newline at end of file
diff --git a/wiki/inc/lang/eu/uploadmail.txt b/wiki/inc/lang/eu/uploadmail.txt
new file mode 100644
index 0000000..7b685e0
--- /dev/null
+++ b/wiki/inc/lang/eu/uploadmail.txt
@@ -0,0 +1,10 @@
+Fitxategi bat igo da zure DokuWikira. Hona hemen xehetasunak:
+
+Fitxategia : @MEDIA@
+Data : @DATE@
+Nabigatzailea : @BROWSER@
+IP-Helbide : @IPADDRESS@
+Hostalari izena : @HOSTNAME@
+Tamaina : @SIZE@
+MIME Mota : @MIME@
+Erabiltzailea : @USER@
diff --git a/wiki/inc/lang/fa/admin.txt b/wiki/inc/lang/fa/admin.txt
new file mode 100644
index 0000000..e445b3b
--- /dev/null
+++ b/wiki/inc/lang/fa/admin.txt
@@ -0,0 +1,3 @@
+====== مدیریت ======
+
+در اینجا فهرستی از وظیفه‌های مدیریتی موجود در داکو ویکی را مشاهده می‌کنید.
\ No newline at end of file
diff --git a/wiki/inc/lang/fa/adminplugins.txt b/wiki/inc/lang/fa/adminplugins.txt
new file mode 100644
index 0000000..dab0251
--- /dev/null
+++ b/wiki/inc/lang/fa/adminplugins.txt
@@ -0,0 +1 @@
+===== برنامه‌های جانبی دیگر =====
\ No newline at end of file
diff --git a/wiki/inc/lang/fa/backlinks.txt b/wiki/inc/lang/fa/backlinks.txt
new file mode 100644
index 0000000..774d3d6
--- /dev/null
+++ b/wiki/inc/lang/fa/backlinks.txt
@@ -0,0 +1,3 @@
+====== پیوندهای بازگشتی ======
+
+در این‌جا فهرستی از صفحاتی که به این صفحه پیوند داده‌اند را مشاهده می‌کنید.
\ No newline at end of file
diff --git a/wiki/inc/lang/fa/conflict.txt b/wiki/inc/lang/fa/conflict.txt
new file mode 100644
index 0000000..9de0370
--- /dev/null
+++ b/wiki/inc/lang/fa/conflict.txt
@@ -0,0 +1,5 @@
+====== یک نگارش جدید وجود دارد ======
+
+این نگارش جدید از مطلبی که ویرایش کرده‌اید وجود دارد. این اتفاق زمانی رخ می‌دهد که یک کاربر دیگر زمانی که شما ویرایش می‌کرده‌اید، ان را تغییر داده است.
+
+تفاوت‌های زیر را بررسی کنید، و تصمیم بگیرید که کدام نگارش حفظ شود. اگر دکمه‌ی «ذخیره» را بفشارید، نسخه‌ی شما ذخیره می‌شود و اگر دکمه‌ی «لغو» را بفشارید، نسخه‌ی کنونی حفظ خواهد شد.
\ No newline at end of file
diff --git a/wiki/inc/lang/fa/denied.txt b/wiki/inc/lang/fa/denied.txt
new file mode 100644
index 0000000..b3cb41c
--- /dev/null
+++ b/wiki/inc/lang/fa/denied.txt
@@ -0,0 +1,4 @@
+====== دسترسی ممکن نیست ======
+
+متاسفم، شما اجازهٔ دسترسی به این صفحه را ندارید.
+
diff --git a/wiki/inc/lang/fa/diff.txt b/wiki/inc/lang/fa/diff.txt
new file mode 100644
index 0000000..80e1ce7
--- /dev/null
+++ b/wiki/inc/lang/fa/diff.txt
@@ -0,0 +1,3 @@
+====== تفاوت‌ها ======
+
+تفاوت دو نسخهٔ متفاوت از صفحه را مشاهده می‌کنید.
\ No newline at end of file
diff --git a/wiki/inc/lang/fa/draft.txt b/wiki/inc/lang/fa/draft.txt
new file mode 100644
index 0000000..6ad1121
--- /dev/null
+++ b/wiki/inc/lang/fa/draft.txt
@@ -0,0 +1,5 @@
+====== فایل چرک‌نویس یافت شد ======
+
+آخرین سشن ویرایش شما با موفقیت به پایان نرسیده. دوکوویکی به طور خودکار چرک‌نویسی از صفحه‌ی شما ذخیره می‌کند که شما می‌توانید آن را کامل کنید. در زیر مقادیر موجود در چرک‌نویس را مشاهده می‌کنید.
+
+خواهشمندیم تصمیم بگیرید که می‌خواهید چرک‌نویس را //بازیابی//، یا آن را //حذف// کنید و یا ویرایش را //لغو// نمایید.
\ No newline at end of file
diff --git a/wiki/inc/lang/fa/edit.txt b/wiki/inc/lang/fa/edit.txt
new file mode 100644
index 0000000..7c3873a
--- /dev/null
+++ b/wiki/inc/lang/fa/edit.txt
@@ -0,0 +1 @@
+این صفحه را ویرایش کنید و کلید «ذخیره» را فشار دهید. صفحه [[wiki:syntax|قوانین نگارشی]] را برای روش نگارش ویکی مشاهده کنید. خواهشمندیم فقط در صورتی این صفحه را ویرایش کنید که توانایی **بهبود بخشیدن** به آن را دارید. اگر تصمیم دارید چیزی را تست کنید یا اولین قدم‌های‌تان را در نگارش ویکی بردارید، به [[playground:playground|زمین بازی]] بروید.
\ No newline at end of file
diff --git a/wiki/inc/lang/fa/editrev.txt b/wiki/inc/lang/fa/editrev.txt
new file mode 100644
index 0000000..eae5394
--- /dev/null
+++ b/wiki/inc/lang/fa/editrev.txt
@@ -0,0 +1,2 @@
+**شما یک نگارش قدیمی را مشاهده می‌کنید!** اگر این نگارش را ذخیره کنید، شما یک نگارش جدید ایجاد کرده‌اید!
+----
\ No newline at end of file
diff --git a/wiki/inc/lang/fa/index.txt b/wiki/inc/lang/fa/index.txt
new file mode 100644
index 0000000..993c8d1
--- /dev/null
+++ b/wiki/inc/lang/fa/index.txt
@@ -0,0 +1,3 @@
+====== نقشه‌ی سایت ======
+
+این صفحه حاوی فهرست تمامی صفحات موجود به ترتیب [[doku>namespaces|فضای‌نام‌ها]] است.
\ No newline at end of file
diff --git a/wiki/inc/lang/fa/install.html b/wiki/inc/lang/fa/install.html
new file mode 100644
index 0000000..7960f9c
--- /dev/null
+++ b/wiki/inc/lang/fa/install.html
@@ -0,0 +1,12 @@
+<p>این صفحه به شما در نصب و تنظیم
+<a href="http://dokuwiki.org">Dokuwiki</a> کمک می‌کند. اطلاعات بیشتری در این مورد را می‌توانید در <a href="http://dokuwiki.org/installer">بخش راهنما</a> مشاهده کنید.</p>
+
+<p>DokuWiki از فایل‌های معمولی برای ذخیره‌ی صفحات ویکی و اطلاعات مربوط به آن‌ها استفاده می‌کند (مثل تصاویر، فهرست‌های جستجو، نگارش‌های پیشین و غیره). برای نصب موفقیت آمیز DokuWiki
+<strong>باید</strong> دسترسی نوشتن برای شاخه‌های این فایل‌ها داشته باشید. این کار باید توسط دستورات خط فرمان و یا دسترسی FTP و یا از طریق کنترل پنل خدمات میزبانی‌تون انجام شود. </p>
+
+<p>این برنامه دسترسی‌های DokuWiki را برای شما تنظیم خواهد کرد،
+به این معنی که مدیر سیستم می‌تواند به صفحه‌ی مدیران وارد شود، افزونه نصب کنید، کاربران را مدیریت کند، دسترسی به صفحات ویکی را مدیریت کند و یا تنظیمات را تغییر دهد.</p>
+
+<p>برای اطلاعات بیشتر در مورد نصب می‌توانید از این پیوند‌ها استفاده کنید
+<a href="http://dokuwiki.org/install">روش نصب</a>
+و  <a href="http://dokuwiki.org/config">تنظیمات پیکربندی</a>.</p>
\ No newline at end of file
diff --git a/wiki/inc/lang/fa/jquery.ui.datepicker.js b/wiki/inc/lang/fa/jquery.ui.datepicker.js
new file mode 100644
index 0000000..71da498
--- /dev/null
+++ b/wiki/inc/lang/fa/jquery.ui.datepicker.js
@@ -0,0 +1,73 @@
+/* Persian (Farsi) Translation for the jQuery UI date picker plugin. */
+/* Javad Mowlanezhad -- jmowla@gmail.com */
+/* Jalali calendar should supported soon! (Its implemented but I have to test it) */
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "../widgets/datepicker" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery.datepicker );
+	}
+}( function( datepicker ) {
+
+datepicker.regional.fa = {
+	closeText: "بستن",
+	prevText: "&#x3C;قبلی",
+	nextText: "بعدی&#x3E;",
+	currentText: "امروز",
+	monthNames: [
+		"ژانویه",
+		"فوریه",
+		"مارس",
+		"آوریل",
+		"مه",
+		"ژوئن",
+		"ژوئیه",
+		"اوت",
+		"سپتامبر",
+		"اکتبر",
+		"نوامبر",
+		"دسامبر"
+	],
+	monthNamesShort: [ "1","2","3","4","5","6","7","8","9","10","11","12" ],
+	dayNames: [
+		"يکشنبه",
+		"دوشنبه",
+		"سه‌شنبه",
+		"چهارشنبه",
+		"پنجشنبه",
+		"جمعه",
+		"شنبه"
+	],
+	dayNamesShort: [
+		"ی",
+		"د",
+		"س",
+		"چ",
+		"پ",
+		"ج",
+		"ش"
+	],
+	dayNamesMin: [
+		"ی",
+		"د",
+		"س",
+		"چ",
+		"پ",
+		"ج",
+		"ش"
+	],
+	weekHeader: "هف",
+	dateFormat: "yy/mm/dd",
+	firstDay: 6,
+	isRTL: true,
+	showMonthAfterYear: false,
+	yearSuffix: "" };
+datepicker.setDefaults( datepicker.regional.fa );
+
+return datepicker.regional.fa;
+
+} ) );
diff --git a/wiki/inc/lang/fa/lang.php b/wiki/inc/lang/fa/lang.php
new file mode 100644
index 0000000..d1e16e7
--- /dev/null
+++ b/wiki/inc/lang/fa/lang.php
@@ -0,0 +1,353 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author behrad eslamifar <behrad_es@yahoo.com)
+ * @author Mohsen Firoozmandan <info@mambolearn.com>
+ * @author Omid Mottaghi <omidmr@gmail.com>
+ * @author Mohammad Reza Shoaei <shoaei@gmail.com>
+ * @author Milad DZand <M.DastanZand@gmail.com>
+ * @author AmirH Hassaneini <mytechmix@gmail.com>
+ * @author mehrdad <mehrdad.jafari.bojd@gmail.com>
+ * @author reza_khn <reza_khn@yahoo.com>
+ * @author Hamid <zarrabi@sharif.edu>
+ * @author Mohamad Mehdi Habibi <habibi.esf@gmail.com>
+ * @author Mohammad Sadegh <msdn2013@gmail.com>
+ * @author Omid Hezaveh <hezpublic@gmail.com>
+ * @author Mohmmad Razavi <sepent@gmail.com>
+ * @author Masoud Sadrnezhaad <masoud@sadrnezhaad.ir>
+ * @author sam01 <m.sajad079@gmail.com>
+ */
+$lang['encoding']              = 'utf-8';
+$lang['direction']             = 'rtl';
+$lang['doublequoteopening']    = '«';
+$lang['doublequoteclosing']    = '»';
+$lang['singlequoteopening']    = '‘';
+$lang['singlequoteclosing']    = '’';
+$lang['apostrophe']            = '’';
+$lang['btn_edit']              = 'ویرایش این صفحه';
+$lang['btn_source']            = 'نمایش کد صفحه';
+$lang['btn_show']              = 'نمایش صفحه';
+$lang['btn_create']            = 'ایجاد این صفحه';
+$lang['btn_search']            = 'جستجو';
+$lang['btn_save']              = 'ذخیره';
+$lang['btn_preview']           = 'پیش‌نمایش';
+$lang['btn_top']               = 'برگشت به بالا';
+$lang['btn_newer']             = 'نتایج بیشتر »';
+$lang['btn_older']             = '« نتایج کمتر';
+$lang['btn_revs']              = 'نگارش‌های پیشین';
+$lang['btn_recent']            = 'تغییرات اخیر';
+$lang['btn_upload']            = 'ارسال';
+$lang['btn_cancel']            = 'لغو';
+$lang['btn_index']             = 'فهرست';
+$lang['btn_secedit']           = 'ویرایش';
+$lang['btn_login']             = 'ورود به سیستم';
+$lang['btn_logout']            = 'خروج از سیستم';
+$lang['btn_admin']             = 'مدیر';
+$lang['btn_update']            = 'به‌روزرسانی';
+$lang['btn_delete']            = 'حذف';
+$lang['btn_back']              = 'عقب';
+$lang['btn_backlink']          = 'پیوندهای به این صفحه';
+$lang['btn_subscribe']         = 'عضویت در تغییرات صفحه';
+$lang['btn_profile']           = 'به‌روزرسانی پروفایل';
+$lang['btn_reset']             = 'بازنشاندن';
+$lang['btn_resendpwd']         = 'تعیین گذرواژه‌ی جدید';
+$lang['btn_draft']             = 'ویرایش پیش‌نویس';
+$lang['btn_recover']           = 'بازیابی پیش‌نویس';
+$lang['btn_draftdel']          = 'حذف پیش‌نویس';
+$lang['btn_revert']            = 'بازیابی';
+$lang['btn_register']          = 'ثبت نام';
+$lang['btn_apply']             = 'اعمال';
+$lang['btn_media']             = 'مدیریت رسانه‌ها';
+$lang['btn_deleteuser']        = 'حساب کاربری مرا حذف کن';
+$lang['btn_img_backto']        = 'بازگشت به %s';
+$lang['btn_mediaManager']      = 'مشاهده در مدیریت رسانه‌ها';
+$lang['loggedinas']            = 'به این عنوان وارد شده‌اید:';
+$lang['user']                  = 'نام کاربری';
+$lang['pass']                  = 'گذرواژه‌';
+$lang['newpass']               = 'گذرواژه‌ی جدید';
+$lang['oldpass']               = 'گذرواژه‌ی فعلی را تایید کنید';
+$lang['passchk']               = 'یک بار دیگر';
+$lang['remember']              = 'مرا به خاطر بسپار';
+$lang['fullname']              = 'نام واقعی شما';
+$lang['email']                 = 'ایمیل';
+$lang['profile']               = 'پروفایل کاربر';
+$lang['badlogin']              = 'متاسفم، نام کاربری یا رمز عبور اشتباه است.';
+$lang['badpassconfirm']        = 'متاسفم، رمز عبور اشتباه است';
+$lang['minoredit']             = 'ویرایش‌های خُرد';
+$lang['draftdate']             = 'ذخیره خودکار پیش‌نویس در';
+$lang['nosecedit']             = 'این صفحه در این میان تغییر کرده است، اطلاعات بخش قدیمی شده است، در عوض محتوای کل نمایش داده می‌شود.';
+$lang['regmissing']            = 'متاسفم، شما باید همه قسمت‌ها را پر کنید.';
+$lang['reguexists']            = 'نام کاربری‌ای که وارد کردید قبلن استفاده شده است.';
+$lang['regsuccess']            = 'کاربر ساخته شد و گذرواژه به صورت ایمیل ارسال گردید.';
+$lang['regsuccess2']           = 'حساب ایجاد شد.';
+$lang['regfail']               = 'ایجاد کاربر ممکن نیست.';
+$lang['regmailfail']           = 'مشکلی در ارسال ایمیل رمز عبور پیش آمده است، با مدیر تماس بگیرید!';
+$lang['regbadmail']            = 'نشانی واردشدهٔ ایمیل قابل‌قبول نیست، چرا که دارای ساختار نامعتبری است. اگر فکر می‌کنید این یک ایراد سایت است با مدیر تماس بگیرید';
+$lang['regbadpass']            = 'گذرواژه‌هایی که وارد کردید یکسان نیستند، لطفاً یکبار دیگر تلاش کنید.';
+$lang['regpwmail']             = 'گذرواژه‌ی DokuWiki شما';
+$lang['reghere']               = 'شما هنوز حسابی در اینجا ندارید؟ یکی ایجاد کنید';
+$lang['profna']                = 'این ویکی اجازه ویرایش پروفایل را نمی‌دهد';
+$lang['profnochange']          = 'تغییری صورت نگرفت.';
+$lang['profnoempty']           = 'نام و آدرس ایمیل باید پر شود.';
+$lang['profchanged']           = 'پروفایل کاربر با موفقیت به روز شد.';
+$lang['profnodelete']          = 'این ویکی از حذف کاربران پشتیبانی نمی‌کند';
+$lang['profdeleteuser']        = 'حذف حساب کاربری';
+$lang['profdeleted']           = 'حساب کاربری شما از این ویکی حذف گردیده است';
+$lang['profconfdelete']        = 'می‌خواهم حساب کاربری من از این ویکی حذف شود. <br/> این عمل قابل برگشت نیست.';
+$lang['profconfdeletemissing'] = 'جعبهٔ تأیید تیک نخورده است';
+$lang['proffail']              = 'بروزرسانی پروفایل کاربری انجام نشد.';
+$lang['pwdforget']             = 'گذرواژه‌ی خود را فراموش کرده‌اید؟ گذرواژه‌ی جدید دریافت کنید';
+$lang['resendna']              = 'این ویکی ارسال مجدد گذرواژه را پشتیبانی نمی‌کند';
+$lang['resendpwd']             = 'تعیین کلمه عبور جدید برای ';
+$lang['resendpwdmissing']      = 'متاسفم، شما باید تمام قسمت‌ها را پر کنید.';
+$lang['resendpwdnouser']       = 'متاسفم، ما نتوانستیم این نام کاربری را در پایگاه دادهٔ خود پیدا کنیم.';
+$lang['resendpwdbadauth']      = 'متاسفم، کد شناسایی معتبر نیست. از صحت لینک تاییدیه اطمینان حاصل کنید.';
+$lang['resendpwdconfirm']      = 'یک لینک تاییدیه آدرس از طریق ایمیل ارسال شد.';
+$lang['resendpwdsuccess']      = 'گذرواژه‌ی جدید شما توسط ایمیل ارسال شد.';
+$lang['license']               = 'به جز مواردی که ذکر می‌شود، مابقی محتویات ویکی تحت مجوز زیر می‌باشند:';
+$lang['licenseok']             = 'توجه: با ویرایش این صفحه، شما مجوز زیر را تایید می‌کنید:';
+$lang['searchmedia']           = 'نام فایل برای جستجو:';
+$lang['searchmedia_in']        = 'جستجو در %s';
+$lang['txt_upload']            = 'فایل را برای آپلود انتخاب کنید:';
+$lang['txt_filename']          = 'ارسال به صورت (اختیاری):';
+$lang['txt_overwrt']           = 'بر روی فایل موجود بنویس';
+$lang['maxuploadsize']         = 'حداکثر %s برای هر فایل مجاز است.';
+$lang['lockedby']              = 'در حال حاضر قفل شده است:';
+$lang['lockexpire']            = 'قفل منقضی می‌شود در:';
+$lang['js']['willexpire']      = 'حالت قفل شما مدتی است منقضی شده است \n برای جلوگیری از تداخل دکمه‌ی پیش‌نمایش را برای صفر شدن ساعت قفل بزنید.';
+$lang['js']['notsavedyet']     = 'تغییرات ذخیره نشده از بین خواهد رفت.';
+$lang['js']['searchmedia']     = 'جستجو برای فایل‌ها';
+$lang['js']['keepopen']        = 'پنجره را در زمان انتخاب باز نگه‌دار';
+$lang['js']['hidedetails']     = 'پنهان کردن جزئیات';
+$lang['js']['mediatitle']      = 'تنظیمات پیوند';
+$lang['js']['mediadisplay']    = 'نوع پیوند';
+$lang['js']['mediaalign']      = 'هم‌ترازی';
+$lang['js']['mediasize']       = 'اندازه تصویر';
+$lang['js']['mediatarget']     = 'هدف پیوند';
+$lang['js']['mediaclose']      = 'بستن';
+$lang['js']['mediainsert']     = 'درج کردن';
+$lang['js']['mediadisplayimg'] = 'نمایش تصویر.';
+$lang['js']['mediadisplaylnk'] = 'فقط پیوند را نمایش بده.';
+$lang['js']['mediasmall']      = 'نگارش کوچک';
+$lang['js']['mediamedium']     = 'نگارش متوسط';
+$lang['js']['medialarge']      = 'نگارش بزرگ';
+$lang['js']['mediaoriginal']   = 'نگارش اصلی';
+$lang['js']['medialnk']        = 'پیوند به صفحه‌ی جزئیات';
+$lang['js']['mediadirect']     = 'پیوند مستقیم به اصلی';
+$lang['js']['medianolnk']      = 'بدون پیوند';
+$lang['js']['medianolink']     = 'تصویر را پیوند نکن';
+$lang['js']['medialeft']       = 'تصویر را با چپ هم‌تراز کن.';
+$lang['js']['mediaright']      = 'تصویر را با راست هم‌تراز کن.';
+$lang['js']['mediacenter']     = 'تصویر را با وسط هم‌تراز کن.';
+$lang['js']['medianoalign']    = 'هم‌تراز نکن.';
+$lang['js']['nosmblinks']      = 'پیوند به Windows share فقط در اینترنت‌اکسپلورر قابل استفاده است.
+شما می‌توانید پیوند‌ها رو کپی کنید.';
+$lang['js']['linkwiz']         = 'ویزارد پیوند';
+$lang['js']['linkto']          = 'پیوند به:';
+$lang['js']['del_confirm']     = 'واقعا تصمیم به حذف این موارد دارید؟';
+$lang['js']['restore_confirm'] = 'آیا مطمئن هستید که می خواهید این نگارش را بازیابی کنید؟';
+$lang['js']['media_diff']      = 'تفاوت ها را ببینید: ';
+$lang['js']['media_diff_both'] = 'پهلو به پهلو';
+$lang['js']['media_diff_opacity'] = 'درخشش از';
+$lang['js']['media_diff_portions'] = 'کش رفتن';
+$lang['js']['media_select']    = 'انتخاب فایل‌ها...';
+$lang['js']['media_upload_btn'] = 'آپلود';
+$lang['js']['media_done_btn']  = 'انجام شد';
+$lang['js']['media_drop']      = 'فایل‌ها را در اینجا قرار دهید تا آپلود شود';
+$lang['js']['media_cancel']    = 'حذف';
+$lang['js']['media_overwrt']   = 'جاینوشت فایل‌های موجود';
+$lang['rssfailed']             = 'بروز خطا در هنگام واکشی این فید:';
+$lang['nothingfound']          = 'چیزی پیدا نشد.';
+$lang['mediaselect']           = 'فایل‌ها';
+$lang['uploadsucc']            = 'ارسال با موفقیت انجام شد';
+$lang['uploadfail']            = 'خطا در ارسال. شاید دسترسی‌ها نادرست است؟';
+$lang['uploadwrong']           = 'ارسال متوقف شد. این فرمت فایل ممنوع می‌باشد.';
+$lang['uploadexist']           = 'این فایل وجود دارد. عملی انجام نشد.';
+$lang['uploadbadcontent']      = 'محتوای فایل آپلود شده با فرمت %s یکسان نیست.';
+$lang['uploadspam']            = 'فایل ارسال شده توسط لیست سیاه اسپم‌ها مسدود شده است.';
+$lang['uploadxss']             = 'این صفحه حاوی اسکریپت یا کد اچ‌تی‌ام‌ال است که ممکن است به نادرست توسط مرورگر وب تفسیر شود.';
+$lang['uploadsize']            = 'فایل ارسال شده سنگین است. (بیشینه، %s)';
+$lang['deletesucc']            = 'فایل «%s» حذف شد.';
+$lang['deletefail']            = '«%s» حذف نمی‌شود، دسترسی‌ها را بررسی کنید.';
+$lang['mediainuse']            = 'فایل «%s» حذف نمی‌شود، چون هنوز در حال استفاده است.';
+$lang['namespaces']            = 'فضای‌نام‌ها';
+$lang['mediafiles']            = 'فایل‌های موجود در';
+$lang['accessdenied']          = 'شما اجازهٔ مشاهدهٔ این صفحه را ندارید.';
+$lang['mediausage']            = 'برای ارجاع دادن به فایل از نگارش زیر استفاده کنید.';
+$lang['mediaview']             = 'مشاهدهٔ فایل اصلی';
+$lang['mediaroot']             = 'ریشه';
+$lang['mediaupload']           = 'ارسال فایل به فضای‌نام کنونی. برای ایجاد زیرفضای‌نام‌ها، پس از انتخاب فایل‌ها در قسمت «ارسال به صورت» به نام فایل نام‌های فضای‌نام‌ها را به عنوان پیشوندهایی که با دونقطه «:» جدا شده‌اند، اضافه کنید. همچنین فایل‌ها می‌توانند با کشیدن و ول کردن انتخاب شوند.';
+$lang['mediaextchange']        = 'فرمت فایل از %s به %s تغییر داده شد.';
+$lang['reference']             = 'ارجاع‌های';
+$lang['ref_inuse']             = 'این فایل نمی‌تواند حذف شود، زیرا هم‌چنان در این صفحه استفاده شده است:';
+$lang['ref_hidden']            = 'تعدادی مرجع در صفحاتی که شما دسترسی خواندن ندارید وجود دارد.';
+$lang['hits']                  = 'بازدیدها';
+$lang['quickhits']             = 'جور کردن نام صفحات';
+$lang['toc']                   = 'فهرست مندرجات';
+$lang['current']               = 'فعلی';
+$lang['yours']                 = 'نسخه‌ی شما';
+$lang['diff']                  = 'تفاوت‌ها را با نگارش کنونی نمایش بده.';
+$lang['diff2']                 = 'تفاوت‌ها را با نگارش انتخابی نمایش بده.';
+$lang['difflink']              = 'پیوند به صفحه‌ی تفاوت‌ها';
+$lang['diff_type']             = 'مشاهده تغییرات:';
+$lang['diff_inline']           = 'خطی';
+$lang['diff_side']             = 'کلی';
+$lang['diffprevrev']           = 'نگارش قبل';
+$lang['diffnextrev']           = 'نگارش بعد';
+$lang['difflastrev']           = 'آخرین نگارش';
+$lang['diffbothprevrev']       = 'نگارش قبل در دو طرف';
+$lang['diffbothnextrev']       = 'نگارش بعد در دو طرف';
+$lang['line']                  = 'خط';
+$lang['breadcrumb']            = 'ردپا:';
+$lang['youarehere']            = 'محل شما:';
+$lang['lastmod']               = 'آخرین ویرایش:';
+$lang['by']                    = 'توسط';
+$lang['deleted']               = 'حذف شد';
+$lang['created']               = 'ایجاد شد';
+$lang['restored']              = 'یک نگارش پیشین واگردانی شد. (%s)';
+$lang['external_edit']         = 'ویرایش خارجی';
+$lang['summary']               = 'پیش‌نمایش';
+$lang['noflash']               = 'برای نمایش محتویات <a href="http://www.adobe.com/products/flashplayer/">افزونه‌ی فلش</a> مورد نیاز است.';
+$lang['download']              = 'دیافت فایل منقطع گردید';
+$lang['tools']                 = 'ابزار';
+$lang['user_tools']            = 'ابزار کاربر';
+$lang['site_tools']            = 'ابزار سایت';
+$lang['page_tools']            = 'ابزار صفحه';
+$lang['skip_to_content']       = 'پرش به محتوا';
+$lang['sidebar']               = 'نوار کناری';
+$lang['mail_newpage']          = 'صفحه اضافه شد:';
+$lang['mail_changed']          = 'صفحه تغییر داده شد:';
+$lang['mail_subscribe_list']   = 'صفحات تغییر داده شده در فضای‌نام';
+$lang['mail_new_user']         = 'کاربر جدید:';
+$lang['mail_upload']           = 'فایل ارسال شده:';
+$lang['changes_type']          = 'دیدن تغییرات';
+$lang['pages_changes']         = 'صفحات';
+$lang['media_changes']         = 'فایلهای چند رسانه ای';
+$lang['both_changes']          = 'صفحات و فایل های چند رسانه ای هر دو';
+$lang['qb_bold']               = 'متن پُررنگ';
+$lang['qb_italic']             = 'متن ایتالیک';
+$lang['qb_underl']             = 'متن زیرخط‌دار';
+$lang['qb_code']               = 'کد';
+$lang['qb_strike']             = 'متن وسط‌خط‌دار';
+$lang['qb_h1']                 = 'عنوان سطح ۱';
+$lang['qb_h2']                 = 'عنوان سطح ۲';
+$lang['qb_h3']                 = 'عنوان سطح ۳';
+$lang['qb_h4']                 = 'عنوان سطح ۴';
+$lang['qb_h5']                 = 'عنوان سطح ۵';
+$lang['qb_h']                  = 'تیتر';
+$lang['qb_hs']                 = 'تیتر مورد نظر را انتخاب نمایید';
+$lang['qb_hplus']              = 'تیتر بالاتر';
+$lang['qb_hminus']             = 'تیتر پایین تر';
+$lang['qb_hequal']             = 'تیتر در یک سطح';
+$lang['qb_link']               = 'پیوند داخلی';
+$lang['qb_extlink']            = 'پیوند به بیرون (پیشوند http:// را فراموش نکنید)';
+$lang['qb_hr']                 = 'خط افقی';
+$lang['qb_ol']                 = 'لیست‌های مرتب';
+$lang['qb_ul']                 = 'لیست‌های بدون ترتیب';
+$lang['qb_media']              = 'افزودن تصویر و فایل';
+$lang['qb_sig']                = 'افزودن امضا';
+$lang['qb_smileys']            = 'شکلک';
+$lang['qb_chars']              = 'حروف ویژه';
+$lang['upperns']               = 'پرش به فضای‌نام بالا';
+$lang['metaedit']              = 'ویرایش داده‌های متا';
+$lang['metasaveerr']           = 'نوشتن داده‌نما با مشکل مواجه شد';
+$lang['metasaveok']            = 'داده‌نما ذخیره شد';
+$lang['img_title']             = 'عنوان تصویر:';
+$lang['img_caption']           = 'عنوان:';
+$lang['img_date']              = 'تاریخ:';
+$lang['img_fname']             = 'نام فایل:';
+$lang['img_fsize']             = 'اندازه:';
+$lang['img_artist']            = 'عکاس/هنرمند:';
+$lang['img_copyr']             = 'دارنده‌ی حق تکثیر:';
+$lang['img_format']            = 'فرمت:';
+$lang['img_camera']            = 'دوربین:';
+$lang['img_keywords']          = 'واژه‌های کلیدی:';
+$lang['img_width']             = 'عرض:';
+$lang['img_height']            = 'ارتفاع:';
+$lang['subscr_subscribe_success'] = '%s به لیست آبونه %s افزوده شد';
+$lang['subscr_subscribe_error'] = 'اشکال در افزودن %s به لیست آبونه %s';
+$lang['subscr_subscribe_noaddress'] = 'هیچ آدرسی برای این عضویت اضافه نشده است، شما نمی‌توانید به لیست آبونه اضافه شوید';
+$lang['subscr_unsubscribe_success'] = '%s از لیست آبونه %s پاک شد';
+$lang['subscr_unsubscribe_error'] = 'اشکال در پاک کردن %s از لیست آبونه %s';
+$lang['subscr_already_subscribed'] = '%s پیش‌تر در %s آبونه شده است';
+$lang['subscr_not_subscribed'] = '%s در %s آبونه نشده است';
+$lang['subscr_m_not_subscribed'] = 'شما در این صفحه یا فضای‌نام آبونه نشده‌اید';
+$lang['subscr_m_new_header']   = 'افزودن آبونه';
+$lang['subscr_m_current_header'] = 'آبونه‌های کنونی';
+$lang['subscr_m_unsubscribe']  = 'لغو آبونه';
+$lang['subscr_m_subscribe']    = 'آبونه شدن';
+$lang['subscr_m_receive']      = 'دریافت کردن';
+$lang['subscr_style_every']    = 'ارسال رای‌نامه در تمامی تغییرات';
+$lang['subscr_style_digest']   = 'ایمیل خلاصه‌ی تغییرات هر روز (هر %.2f روز)';
+$lang['subscr_style_list']     = 'فهرست صفحات تغییریافته از آخرین ایمیل (هر %.2f روز)';
+$lang['authtempfail']          = 'معتبرسازی کابران موقتن مسدود می‌باشد. اگر این حالت پایدار بود، مدیر ویکی را باخبر سازید.';
+$lang['i_chooselang']          = 'انتخاب زبان';
+$lang['i_installer']           = 'نصب کننده‌ی دوکوویکی';
+$lang['i_wikiname']            = 'نام ویکی';
+$lang['i_enableacl']           = 'فعال بودن کنترل دسترسی‌ها (توصیه شده)';
+$lang['i_superuser']           = 'کاربر اصلی';
+$lang['i_problems']            = 'نصب کننده با مشکلات زیر مواجه شد. در صورت رفع این مشکلات، امکان ادامه نصب خواهد بود.';
+$lang['i_modified']            = 'به دلایل امنیتی، این اسکریپت فقط با نصب تازه و بدون تغییر دوکوویکی کار خواهد کرد. شما باید دوباره فایل فشرده را باز کنید <a href="http://dokuwiki.org/install">راهنمای نصب DokuWiki</a> را بررسی کنید.';
+$lang['i_funcna']              = 'تابع <code>%s</code> در پی‌اچ‌پی موجود نیست. ممکن است شرکت خدمات وب شما آن را مسدود کرده باشد.';
+$lang['i_phpver']              = 'نگارش پی‌اچ‌پی <code>%s</code> پایین‌تر از نگارش مورد نیاز، یعنی <code>%s</code> است. خواهشمندیم به روز رسانی کنید.';
+$lang['i_mbfuncoverload']      = 'برای اجرای دوکوویکی باید mbstring.func_overload را در php.ini غیرفعال کنید.';
+$lang['i_permfail']            = 'شاخه‌ی <code>%s</code> قابلیت نوشتن ندارد. شما باید دسترسی‌های این شاخه را تنظیم کنید!';
+$lang['i_confexists']          = '<code>%s</code> پیش‌تر موجود است';
+$lang['i_writeerr']            = 'توانایی ایجاد <code>%s</code> نیست. شما باید دسترسی‌های شاخه یا فایل را بررسی کنید و فایل را به طور دستی ایجاد کنید.';
+$lang['i_badhash']             = 'فایل dokuwiki.php غیرقابل تشخیص بوده یا تغییر کرده است (hash=<code>%s</code>)';
+$lang['i_badval']              = '<code>%s</code> - غیرقانونی و یا مقادیر تهی';
+$lang['i_success']             = 'تنظیمات با موفقیت به پایان رسید. بهتر است فایل install.php را حذف کنید. برای ادامه <a href="doku.php?id=wiki:welcome">این‌جا</a> کلیک کنید.';
+$lang['i_failure']             = 'مشکلاتی در زمان نوشتن فایل تنظیمات پیش آمده است. شما باید این مشکلات را پیش از استفاده از <a href="doku.php?id=wiki:welcome">DokuWiki</a> برطرف کنید.';
+$lang['i_policy']              = 'کنترل دسترسی‌های اولیه';
+$lang['i_pol0']                = 'ویکی باز (همه می‌توانند بخوانند، بنویسند و فایل ارسال کنند)';
+$lang['i_pol1']                = 'ویکی عمومی (همه می‌توانند بخوانند، کاربران ثبت شده می‌توانند بنویسند و فایل ارسال کنند)';
+$lang['i_pol2']                = 'ویکی بسته (فقط کاربران ثبت شده می‌توانند بخوانند، بنویسند و فایل ارسال کنند)';
+$lang['i_allowreg']            = 'اجازه دهید که کاربران خود را ثبت نام کنند';
+$lang['i_retry']               = 'تلاش مجدد';
+$lang['i_license']             = 'لطفاً مجوزی که می‌خواهید برای محتوایتان استفاده کنید را وارد کنید:';
+$lang['i_license_none']        = 'هیچ اطلاعات مجوزی را نشان نده';
+$lang['i_pop_field']           = 'لطفاً به ما کمک کنید تا تجربهٔ دوکوویکی را بهبود دهیم.';
+$lang['i_pop_label']           = 'ماهی یک بار، اطلاعات ناشناس دربارهٔ نحوهٔ استفاده به توسعه‌دهندگان دوکوویکی ارسال کن';
+$lang['recent_global']         = 'شما هم‌اکنون تغییرات فضای‌نام <b>%s</b> را مشاهده می‌کنید. شما هم‌چنین می‌توانید <a href="%s">تغییرات اخیر در کل ویکی را مشاهده نمایید</a>.';
+$lang['years']                 = '%d سال پیش';
+$lang['months']                = '%d ماه پیش';
+$lang['weeks']                 = '%d هفته‌ی پیش';
+$lang['days']                  = '%d روز پیش';
+$lang['hours']                 = '%d ساعت پیش';
+$lang['minutes']               = '%d دقیقه‌ی پیش';
+$lang['seconds']               = '%d ثانیه‌ی پیش';
+$lang['wordblock']             = 'تغییرات شما به دلیل داشتن محتوای مشکوک (مثل اسپم) ذخیره نشد.';
+$lang['media_uploadtab']       = 'آپلود';
+$lang['media_searchtab']       = 'جستجو';
+$lang['media_file']            = 'فایل';
+$lang['media_viewtab']         = 'دیدن';
+$lang['media_edittab']         = 'ویرایش';
+$lang['media_historytab']      = 'تاریخچه';
+$lang['media_list_thumbs']     = 'ریز عکسها';
+$lang['media_list_rows']       = 'سطرها';
+$lang['media_sort_name']       = 'نام';
+$lang['media_sort_date']       = 'تاریخ';
+$lang['media_namespaces']      = 'انتخاب فضای نام';
+$lang['media_files']           = 'فایل در %s';
+$lang['media_upload']          = 'آپلود به %s';
+$lang['media_search']          = 'جستجو در %s';
+$lang['media_view']            = '%s';
+$lang['media_viewold']         = '%s در %s';
+$lang['media_edit']            = 'ویرایش %s';
+$lang['media_history']         = 'تاریخچهٔ %s';
+$lang['media_meta_edited']     = 'فراداده‌ها ویرایش شدند.';
+$lang['media_perm_read']       = 'متاسفانه شما دسترسی‌های لازم برای خواندن این فایل‌ها را ندارید.';
+$lang['media_perm_upload']     = 'متاسفانه شما دسترسی‌های لازم برای آپلود این فایل‌ها را ندارید.';
+$lang['media_update']          = 'آپلود نسخه‌ی جدید';
+$lang['media_restore']         = 'بازیابی این نسخه';
+$lang['media_acl_warning']     = 'این لیست ممکن است به خاطر محدودیتهای دسترسیهای ACL و صفحات پنهان کامل نباشد.';
+$lang['currentns']             = 'فضای نام جاری';
+$lang['searchresult']          = 'نتیجه‌ی جستجو';
+$lang['plainhtml']             = 'HTML ساده';
+$lang['wikimarkup']            = 'نشانه‌گذاری ویکی';
+$lang['page_nonexist_rev']     = 'صفحه %s وجود نداشت. این صفحه معاقباً در<a href="%s">%s</a> ایجاد شد.';
+$lang['unable_to_parse_date']  = 'امکان تجزیه و تحلیل پارامتر «%s» وجود ندارد.';
+$lang['email_signature_text']  = 'این ایمیل توسط دوکوویکی تولید شده است
+@DOKUWIKIURL@';
diff --git a/wiki/inc/lang/fa/locked.txt b/wiki/inc/lang/fa/locked.txt
new file mode 100644
index 0000000..2c0ca88
--- /dev/null
+++ b/wiki/inc/lang/fa/locked.txt
@@ -0,0 +1,3 @@
+====== قفل شده است ======
+
+این صفحه توسط یک کاربر دیگر، برای ویرایش، قفل شده است. شما باید تا پایان ویرایش این کاربر یا منقضی شدن قفل صبر کنید.
\ No newline at end of file
diff --git a/wiki/inc/lang/fa/login.txt b/wiki/inc/lang/fa/login.txt
new file mode 100644
index 0000000..0b1b3f9
--- /dev/null
+++ b/wiki/inc/lang/fa/login.txt
@@ -0,0 +1,3 @@
+====== ورود ======
+
+شما وارد سایت نشده‌اید! موارد زیر را تایپ کنید تا وارد شوید. برای ورود، نیاز دارید که کوکی‌های مرورگر فعال باشد.
\ No newline at end of file
diff --git a/wiki/inc/lang/fa/mailtext.txt b/wiki/inc/lang/fa/mailtext.txt
new file mode 100644
index 0000000..b51be6b
--- /dev/null
+++ b/wiki/inc/lang/fa/mailtext.txt
@@ -0,0 +1,12 @@
+یک صفحه در ویکی افزوده شده یا تغییر کرده، اطلاعات آن را می‌توانید در زیر بینید:
+
+تاریخ: @DATE@
+مرورگر: @BROWSER@
+آدرس IP: @IPADDRESS@
+نام هوست: @HOSTNAME@
+نگارش پیشین: @OLDPAGE@
+نگارش نو: @NEWPAGE@
+خلاصه ویرایش: @SUMMARY@
+کاربر: @USER@
+
+@DIFF@
diff --git a/wiki/inc/lang/fa/mailwrap.html b/wiki/inc/lang/fa/mailwrap.html
new file mode 100644
index 0000000..d257190
--- /dev/null
+++ b/wiki/inc/lang/fa/mailwrap.html
@@ -0,0 +1,13 @@
+<html>
+<head>
+<title>@TITLE@</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+</head>
+<body>
+
+@HTMLBODY@
+
+<br /><hr />
+<small>@EMAILSIGNATURE@</small>
+</body>
+</html>
\ No newline at end of file
diff --git a/wiki/inc/lang/fa/newpage.txt b/wiki/inc/lang/fa/newpage.txt
new file mode 100644
index 0000000..06377a9
--- /dev/null
+++ b/wiki/inc/lang/fa/newpage.txt
@@ -0,0 +1,3 @@
+====== این صفحه وجود ندارد ======
+
+شما به این صفحه که وجود ندارد رسیده‌اید. اگر دسترسی‌ها به شما اجازه می‌دهند، می‌توانید این صفحه را با کلیلک کردن روی دکمه‌ی «ساخت این صفحه» ایجاد کنید.
\ No newline at end of file
diff --git a/wiki/inc/lang/fa/norev.txt b/wiki/inc/lang/fa/norev.txt
new file mode 100644
index 0000000..186e374
--- /dev/null
+++ b/wiki/inc/lang/fa/norev.txt
@@ -0,0 +1,3 @@
+====== نگارشی یافت نشد ======
+
+نگارش مورد نظر یافت نشد. از دکمه‌ی «نگارش‌های پیشین» برای مشاهده‌ی نگارش‌های پیشین این صفحه استفاده کنید.
\ No newline at end of file
diff --git a/wiki/inc/lang/fa/password.txt b/wiki/inc/lang/fa/password.txt
new file mode 100644
index 0000000..86e7289
--- /dev/null
+++ b/wiki/inc/lang/fa/password.txt
@@ -0,0 +1,6 @@
+سلام @FULLNAME@!
+
+اطلاعات شخصی شما با عنوان @TITLE@ در @DOKUWIKIURL@ در ادامه آمده است:
+
+نام کاربری: @LOGIN@
+گذرواژه: @PASSWORD@
diff --git a/wiki/inc/lang/fa/preview.txt b/wiki/inc/lang/fa/preview.txt
new file mode 100644
index 0000000..727aa70
--- /dev/null
+++ b/wiki/inc/lang/fa/preview.txt
@@ -0,0 +1,3 @@
+====== پیش‌نمایش ======
+
+این پیش‌نمایش متن شماست. به یاد داشته باشید که این متن هنوز **ذخیره نشده‌است**!
\ No newline at end of file
diff --git a/wiki/inc/lang/fa/pwconfirm.txt b/wiki/inc/lang/fa/pwconfirm.txt
new file mode 100644
index 0000000..e97b612
--- /dev/null
+++ b/wiki/inc/lang/fa/pwconfirm.txt
@@ -0,0 +1,9 @@
+سلام @FULLNAME@!
+
+یک نفر با عنوان @TITLE@ برای ورود به @DOKUWIKIURL@ درخواست گذرواژه‌ای جدید کرده است:
+
+اگر شما چنین درخواستی نداده‌اید، به این ایمیل توجه نکنید.
+
+اگر این درخواست توسط شما داده شده است، برای تایید روی لینک زیر کلیک کنید.
+
+@CONFIRM@
diff --git a/wiki/inc/lang/fa/read.txt b/wiki/inc/lang/fa/read.txt
new file mode 100644
index 0000000..1acfdb4
--- /dev/null
+++ b/wiki/inc/lang/fa/read.txt
@@ -0,0 +1 @@
+این صفحه فقط خواندنی است. شما می‌توانید متن صفحه را مشاهده کنید، اما نمی‌توانید آن را تغییر دهید. اگر فکر می‌کنید که مشکلی رخ داده است، مدیر ویکی را در جریان بگذارید.
\ No newline at end of file
diff --git a/wiki/inc/lang/fa/recent.txt b/wiki/inc/lang/fa/recent.txt
new file mode 100644
index 0000000..a3d0c55
--- /dev/null
+++ b/wiki/inc/lang/fa/recent.txt
@@ -0,0 +1,3 @@
+====== تغییرات اخیر ======
+
+این صفحه‌ها به تازگی تغییر کرده‌اند.
\ No newline at end of file
diff --git a/wiki/inc/lang/fa/register.txt b/wiki/inc/lang/fa/register.txt
new file mode 100644
index 0000000..c6e1f0d
--- /dev/null
+++ b/wiki/inc/lang/fa/register.txt
@@ -0,0 +1,3 @@
+====== ثبت نام ======
+
+تمامی فیلدها را پر کنید و اطمینان پیدا کنید که ایمیل معتبر وارد کرده‌اید - اگر شما گذرواژه‌ای وارد نکردید، یک مقدار جدید برای‌تان ارسال خواهد شد. نام کاربری شما باید یک [[doku>pagename|صفحه‌ی]] معتبر باشد.
\ No newline at end of file
diff --git a/wiki/inc/lang/fa/registermail.txt b/wiki/inc/lang/fa/registermail.txt
new file mode 100644
index 0000000..f69460f
--- /dev/null
+++ b/wiki/inc/lang/fa/registermail.txt
@@ -0,0 +1,10 @@
+یک کاربر تازه با مشخصات زیر عضو ویکی شده است:
+
+نام کاربری: @NEWUSER@
+اسم کامل: @NEWNAME@
+ایمیل: @NEWEMAIL@
+
+تاریخ: @DATE@
+مرورگر: @BROWSER@
+آدرس IP: @IPADDRESS@
+نام هوست: @HOSTNAME@
diff --git a/wiki/inc/lang/fa/resendpwd.txt b/wiki/inc/lang/fa/resendpwd.txt
new file mode 100644
index 0000000..75ace99
--- /dev/null
+++ b/wiki/inc/lang/fa/resendpwd.txt
@@ -0,0 +1,3 @@
+====== ارسال گذرواژه‌ی جدید ======
+
+خواهش‌مندیم نام کاربری خود را در فرم زیر بنویسید تا گذرواژه‌ی جدید برای‌تان ارسال شود. یک پیوند تاییدیه برای ایمیل ثبت شده ارسال می‌شود.
\ No newline at end of file
diff --git a/wiki/inc/lang/fa/resetpwd.txt b/wiki/inc/lang/fa/resetpwd.txt
new file mode 100644
index 0000000..6a1355e
--- /dev/null
+++ b/wiki/inc/lang/fa/resetpwd.txt
@@ -0,0 +1,3 @@
+====== تعیین کلمه عبور جدید ======
+
+لطفاً یک کلمه عبور جدید برای حساب کاربری خود در این ویکی ایجاد کنید.
\ No newline at end of file
diff --git a/wiki/inc/lang/fa/revisions.txt b/wiki/inc/lang/fa/revisions.txt
new file mode 100644
index 0000000..7714ae6
--- /dev/null
+++ b/wiki/inc/lang/fa/revisions.txt
@@ -0,0 +1,3 @@
+====== نگارش‌های پیشین ======
+
+در اینجا نگارش‌های پیشین این صفحه را مشاهده می‌کنید. برای بازگشتن به آن‌ها، آن را انتخاب کنید و کلید «ویرایش این صفحه» را انتخاب کنید و سپس ذخیره نمایید.
\ No newline at end of file
diff --git a/wiki/inc/lang/fa/searchpage.txt b/wiki/inc/lang/fa/searchpage.txt
new file mode 100644
index 0000000..50d872e
--- /dev/null
+++ b/wiki/inc/lang/fa/searchpage.txt
@@ -0,0 +1,4 @@
+====== جستجو ======
+
+نتایج جستجو در زیر آمده است. @CREATEPAGEINFO@
+
diff --git a/wiki/inc/lang/fa/showrev.txt b/wiki/inc/lang/fa/showrev.txt
new file mode 100644
index 0000000..2117ee6
--- /dev/null
+++ b/wiki/inc/lang/fa/showrev.txt
@@ -0,0 +1,2 @@
+**این یک نگارش قدیمی از این مطلب است!**
+----
\ No newline at end of file
diff --git a/wiki/inc/lang/fa/stopwords.txt b/wiki/inc/lang/fa/stopwords.txt
new file mode 100644
index 0000000..58d3ca0
--- /dev/null
+++ b/wiki/inc/lang/fa/stopwords.txt
@@ -0,0 +1,445 @@
+# This is a list of words the indexer ignores, one word per line
+# When you edit this file be sure to use UNIX line endings (single newline)
+# No need to include words shorter than 3 chars - these are ignored anyway
+# This list is based upon the ones found at http://www.ranks.nl/stopwords/
+about
+are
+as
+an
+and
+you
+your
+them
+their
+com
+for
+from
+into
+if
+in
+is
+it
+how
+of
+on
+or
+that
+the
+this
+to
+was
+what
+when
+where
+who
+will
+with
+und
+the
+www
+من
+تو
+او
+ما
+شما
+آنها
+ایشان
+ایشون
+از

+را
+ای
+یا
+باید
+شاید
+چرا
+چون
+چگونه
+چه
+اگر
+الان
+سلام
+ممنون
+موفق
+باشید
+باش
+باشند
+باشی
+باشم
+باشد
+است
+نیست
+شد
+شدن
+شدند
+شدیم
+شدید
+درباره
+یک
+دو
+سه
+چهار
+پنج
+شش
+هفت
+هشت
+ده
+در
+هست
+هستم
+هستی
+هستیم
+هستید
+هستند
+برای
+این
+آن
+اون
+روی
+رو
+بود
+بودم
+بودی
+بودیم
+بودید
+بودند
+کجا
+کی
+با
+کس
+کسی
+پیرامون
+نزدیک
+بالا
+پایین
+بالای
+بالاتر
+موافق
+مطابق
+طبق
+برطبق
+همان
+سر
+درمیان
+عرض
+طرف
+عملا
+واقعا
+بعد
+قبل
+جستجو
+سپس
+دوباره
+رفتم
+رفتی
+رفت
+رفتیم
+رفتید
+رفتند
+بای
+اوه
+آه
+اه
+برابر
+بااینکه
+همواره
+همیشه
+پیوسته
+وقت
+هزار
+دیگر
+جدا
+شخص
+کدام
+هیچگونه
+بهرحال
+هرچیز
+هیچکار
+درهرصورت
+پدیدار
+درک
+باشه
+جنوب
+ضبط
+حوالی
+نزدیکی
+چنانچه
+بطوریکه
+هنگامیکه
+مثال
+مانند
+پرسیدن
+جویا
+خواهش
+خواستن
+انجمن
+کنار
+پیک
+بیرون
+خارج
+مرتبا
+آغاز
+پایان
+آمد
+امد
+به
+زیرا
+چونکه
+آمدن
+بودن
+درخور
+بوده
+پیش
+پس
+قبلا
+راحت
+مقدم
+کار
+برو
+بیا
+باور
+گمان
+بمیر
+چپ
+راست
+شمال
+غرب
+شرق
+دور
+گذشته
+آینده
+بهتر
+بهترین
+بدترین
+عظیم
+کوچک
+نیک
+بدتر
+خوب
+بد
+زشت
+میان
+هردو
+هم
+یکی
+کوتاه
+بلند
+مختصر
+حکم
+اما
+ولی
+لیکن
+حز
+مگر
+فقط
+بدون
+محض
+بخش
+بدست
+وسیله
+درجه
+اول
+دوم
+سوم
+چهارم
+پنجم
+ششم
+هفتم
+هشتم
+نهم
+دهم
+امکان
+داشتن
+داشتیم
+داشتی
+داشتند
+داشتید
+سبب
+علت
+موجب
+هدف
+صفر
+محتوی
+دارا
+شامل
+نیا
+چیز
+نرو
+مسیر
+روش
+جهت
+دقیقا
+درطی
+درضمن
+بسرعت
+رایج
+جاری
+طورقطعی
+شرح
+کرد
+انجام
+عدد
+غیر
+بریم
+کاملا
+قلم
+آب
+سایه
+مساوی
+صاف
+هموار
+حتی
+جفت
+هرگز
+درست
+کامل
+چنین
+دومین
+سومین
+چهارمین
+پنجمین
+ششمین
+هشتمین
+نهمین
+دهمین
+برید
+رفتن
+راه
+درود
+خداحافظ
+حاجی
+واقع
+سخت
+آسان
+مشکل
+اینجا
+آنجا
+خودش
+هنوز
+بلافاصله
+نگاه
+نگه
+آخر
+اخر
+عمرا
+کمترین
+کوچکترین
+اقل
+مثل
+شکل
+نظر
+چندین
+زیاد
+احتمالا
+متوسط
+یعنی
+اساسا
+عالی
+وای
+خودم
+خودت
+خودمان
+خودمون
+اسم
+نام
+آره
+حال
+حالا
+اینک
+خیلی
+بارها
+بسیار
+کن
+وسط
+ممکن
+راستی
+فعلا
+صحیح
+واقعی
+گفت
+گفتم
+گفتیم
+امثال
+آنکه
+مهم
+جدی
+چنان
+چندان
+زیادی
+بعضی
+گاهگاهی
+زود
+بزودی
+بگیر
+ببر
+بردن
+گیرنده
+تا
+تشکر
+سپاس
+ان
+آنان
+بکلی
+تماما
+بنا
+همدیگر
+جلو
+معمولا
+مقدار
+موقع
+اونجا
+آیا
+که
+بچه
+حاضر
+میخواستم
+بلی
+خیر
+فوروم
+خواهم
+داره
+نداره
+داری
+همون
+میبینم
+اینجوریه
+بهش
+هستن
+امضام
+اولی
+دومی
+سومی
+چهارمی
+بگذار
+بکنه
+امروز
+صدمین
+همش
+همگی
+هوا
+اعلام
+اخرین
+خودشون
+حد
+شده
+اینکه
+خب
+یه
+اینجوری
+گاه
+گهگاه
+گاهی
+گهگدار
+گهگداری
+ها
+میشه
+کمی
+راجبه
+توضیح
+بدی
+راجع
+می
+شه
+روز
+کنی
+اصلا
\ No newline at end of file
diff --git a/wiki/inc/lang/fa/subscr_digest.txt b/wiki/inc/lang/fa/subscr_digest.txt
new file mode 100644
index 0000000..c5ac515
--- /dev/null
+++ b/wiki/inc/lang/fa/subscr_digest.txt
@@ -0,0 +1,13 @@
+سلام،
+
+صفحه‌ی @PAGE@ با عنوان @TITLE@ در ویکی تغییر کرد.
+تغییرات عبارت است از:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+نگارش پیشین: @OLDPAGE@
+نگارش نو: @NEWPAGE@
+
+برای از بین بردن آگاهی‌های این صفحه، از طریق آدرس @DOKUWIKIURL@ وارد ویکی شده و صفحه‌ی @SUBSCRIBE@ را مرور کنید و عضویت خود را از صفحه یا فضای‌نام پاک کنید.
diff --git a/wiki/inc/lang/fa/subscr_form.txt b/wiki/inc/lang/fa/subscr_form.txt
new file mode 100644
index 0000000..39764d0
--- /dev/null
+++ b/wiki/inc/lang/fa/subscr_form.txt
@@ -0,0 +1,3 @@
+====== مدیریت عضویت‌ها ======
+
+این صفحه به شما امکان مدیریت عضویت‌تان را برای این صفحه یا فضای‌نام می‌دهد.
\ No newline at end of file
diff --git a/wiki/inc/lang/fa/subscr_list.txt b/wiki/inc/lang/fa/subscr_list.txt
new file mode 100644
index 0000000..6970997
--- /dev/null
+++ b/wiki/inc/lang/fa/subscr_list.txt
@@ -0,0 +1,13 @@
+سلام،
+
+صفحه‌های فضای‌نام @PAGE@ با عنوان @TITLE@ در ویکی تغییر کرد.
+تغییرات عبارت است از:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+نگارش پیشین: @OLDPAGE@
+نگارش نو: @NEWPAGE@
+
+برای از بین بردن آگاهی‌های این صفحه، از طریق آدرس @DOKUWIKIURL@ وارد ویکی شده و صفحه‌ی @SUBSCRIBE@ را مرور کنید و عضویت خود را از صفحه یا فضای‌نام پاک کنید.
diff --git a/wiki/inc/lang/fa/subscr_single.txt b/wiki/inc/lang/fa/subscr_single.txt
new file mode 100644
index 0000000..75ffb24
--- /dev/null
+++ b/wiki/inc/lang/fa/subscr_single.txt
@@ -0,0 +1,16 @@
+سلام،
+
+صفحه‌ی @PAGE@ با عنوان @TITLE@ در ویکی تغییر کرد.
+تغییرات عبارت است از:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+تاریخ : @DATE@
+نام‌کاربری: @USER@
+خلاصه ویرایش: @SUMMARY@
+نگارش پیشین: @OLDPAGE@
+نگارش نو: @NEWPAGE@
+
+برای از بین بردن آگاهی‌های این صفحه، از طریق آدرس @DOKUWIKIURL@ وارد ویکی شده و صفحه‌ی @NEWPAGE@ را مرور کنید و عضویت خود را از صفحه یا فضای‌نام پاک کنید.
diff --git a/wiki/inc/lang/fa/updateprofile.txt b/wiki/inc/lang/fa/updateprofile.txt
new file mode 100644
index 0000000..d790833
--- /dev/null
+++ b/wiki/inc/lang/fa/updateprofile.txt
@@ -0,0 +1,3 @@
+====== به روز رسانی پروفایل ======
+
+شما می‌توانید مقادیر زیر را تغییر دهید.
\ No newline at end of file
diff --git a/wiki/inc/lang/fa/uploadmail.txt b/wiki/inc/lang/fa/uploadmail.txt
new file mode 100644
index 0000000..e9218b6
--- /dev/null
+++ b/wiki/inc/lang/fa/uploadmail.txt
@@ -0,0 +1,10 @@
+یک فایل به ویکی ارسال شد:
+
+فایل: @MEDIA@
+تاریخ: @DATE@
+مرورگر: @BROWSER@
+آدرس IP: @IPADDRESS@
+نام هوست: @HOSTNAME@
+اندازه: @SIZE@
+MIME: @MIME@
+کاربر: @USER@
diff --git a/wiki/inc/lang/fi/admin.txt b/wiki/inc/lang/fi/admin.txt
new file mode 100644
index 0000000..b57b608
--- /dev/null
+++ b/wiki/inc/lang/fi/admin.txt
@@ -0,0 +1,3 @@
+====== Ylläpito ======
+
+Alla on lista DokuWiki:ssä käytössä olevista ylläpitotoiminnoista.
diff --git a/wiki/inc/lang/fi/adminplugins.txt b/wiki/inc/lang/fi/adminplugins.txt
new file mode 100644
index 0000000..fa3571e
--- /dev/null
+++ b/wiki/inc/lang/fi/adminplugins.txt
@@ -0,0 +1 @@
+===== Muita liitännäisiä =====
\ No newline at end of file
diff --git a/wiki/inc/lang/fi/backlinks.txt b/wiki/inc/lang/fi/backlinks.txt
new file mode 100644
index 0000000..4577202
--- /dev/null
+++ b/wiki/inc/lang/fi/backlinks.txt
@@ -0,0 +1,4 @@
+====== Linkitykset ======
+
+Tässä lista tälle sivuille linkittävistä sivuista.
+
diff --git a/wiki/inc/lang/fi/conflict.txt b/wiki/inc/lang/fi/conflict.txt
new file mode 100644
index 0000000..be788a1
--- /dev/null
+++ b/wiki/inc/lang/fi/conflict.txt
@@ -0,0 +1,5 @@
+====== On olemassa uudempi versio ======
+
+Muokkaamastasi dokumentista on olemassa uudempi versio. Näin käy, kun toinen käyttäjä muuttaa dokumenttia sillä aikaa, kun sinä olit muokkaamassa sitä.
+
+Tutki alla näkyvät eroavaisuudet kunnolla ja päätä mikä versio säilytetään. Jos valitset "tallenna", sinun versiosi tallennetaan. Valitse ''peru'' pitääksesi tämänhetkisen, toisen käyttäjän muuttaman version.
diff --git a/wiki/inc/lang/fi/denied.txt b/wiki/inc/lang/fi/denied.txt
new file mode 100644
index 0000000..89ebd48
--- /dev/null
+++ b/wiki/inc/lang/fi/denied.txt
@@ -0,0 +1,4 @@
+====== Lupa evätty ======
+
+Sinulla ei ole tarpeeksi valtuuksia jatkaa.
+
diff --git a/wiki/inc/lang/fi/diff.txt b/wiki/inc/lang/fi/diff.txt
new file mode 100644
index 0000000..fbf62b7
--- /dev/null
+++ b/wiki/inc/lang/fi/diff.txt
@@ -0,0 +1,3 @@
+====== Erot ======
+
+Tämä näyttää erot valitun ja nykyisen version kesken tästä sivusta.
diff --git a/wiki/inc/lang/fi/draft.txt b/wiki/inc/lang/fi/draft.txt
new file mode 100644
index 0000000..859f4d9
--- /dev/null
+++ b/wiki/inc/lang/fi/draft.txt
@@ -0,0 +1,5 @@
+====== Vedos löydetty ======
+
+Edellinen muokkauksesi tälle sivulle ei ole päivittynyt oikein. DokuWiki on automaattisesti tallentanut vedoksen muokkauksen aikana. Voit nyt jatkaa muokkausta. Alla näet tallennetun version edellisestä istunnostasi.
+
+Valitse jos haluat //palauttaa// edellisen muutoksesi, //poistaa// automaattisesti tallennetun vedoksen, vai //peruuttaa// muutokset.
\ No newline at end of file
diff --git a/wiki/inc/lang/fi/edit.txt b/wiki/inc/lang/fi/edit.txt
new file mode 100644
index 0000000..81b7714
--- /dev/null
+++ b/wiki/inc/lang/fi/edit.txt
@@ -0,0 +1 @@
+Muokkaa sivua ja paina ''Tallenna''. Katso [[wiki:syntax]] nähdäksesi Wikisyntaksi. Muuta sivua vain jos voit **parantaa** sitä. Jos haluat kokeilla Wikiä hyvä paikka siihen on [[playground:playground]].
diff --git a/wiki/inc/lang/fi/editrev.txt b/wiki/inc/lang/fi/editrev.txt
new file mode 100644
index 0000000..fd4d9a3
--- /dev/null
+++ b/wiki/inc/lang/fi/editrev.txt
@@ -0,0 +1,2 @@
+**Olet ladannut vanhan version dokumentista** Jos tallennat tämän, tästä tulee uusin versio dokumentista.
+----
diff --git a/wiki/inc/lang/fi/index.txt b/wiki/inc/lang/fi/index.txt
new file mode 100644
index 0000000..9086e22
--- /dev/null
+++ b/wiki/inc/lang/fi/index.txt
@@ -0,0 +1,3 @@
+====== hakemisto ======
+
+Tämä on hakemisto kaikista saatavilla olevista sivuista järjestettynä [[doku>namespace|nimiavaruuksittain]].
diff --git a/wiki/inc/lang/fi/install.html b/wiki/inc/lang/fi/install.html
new file mode 100644
index 0000000..1b43455
--- /dev/null
+++ b/wiki/inc/lang/fi/install.html
@@ -0,0 +1,21 @@
+<p>Tämä sivu avustaa <a href="http://dokuwiki.org">Dokuwikin</a> ensiasennuksessa ja
+  asetuksissa. Lisätietoa asennusohjelmasta löytyy ohjelman
+	<a href="http://dokuwiki.org/installer">dokumentaatiosta</a>.</p>
+
+<p>DokuWiki käyttää tavallisia tiedostoja wiki-sivujen, sekä muiden niihin liittyvien
+  tietojen kuten kuvien, hakuindeksien, versionhallinnan jne. tallentamiseen. Toimiakseen
+	oikein DokuWikillä <strong>täytyy</strong> olla kirjoitusoikeus niihin hakemistoihin joissa nämä
+	tiedostot sijaitsevat. Asennusohjelma ei pysty asettamaan näitä oikeuksia. Tämä täytyy
+	useimmiten tehdä suoraan komentoriviltä tai muulla, esimerkiksi
+	internet-palveluntarjoajan määrittämällä tavalla, kuten FTP -ohjelmalla tai erillisen
+	asetusvalikon kautta. (cPanel).</p>
+
+<p>Asennusohjelma määrittelee DokuWikin käyttöoikeudet (<abbr title="access control list">ACL</abbr>),
+  jotka mahdollistavat ylläpitäjän sisäänkirjautumisen ja pääsyn DokuWikin ylläpito -valikkoon,
+	josta voidaan asentaa plugineja, hallita käyttäjätietoja, wiki-sivujen luku- ja
+	kirjoitusoikeuksia sekä muita asetuksia. Käyttöoikeuksien käyttäminen ei ole pakollista,
+	mutta se helpottaa DokuWikin ylläpitämistä.</p>
+
+<p>Kokeneille käyttäjille tai käyttäjille joilla on erityisvaatimuksia asennukselle
+  löytyy lisätietoa <a href="http://dokuwiki.org/install">asennuksesta</a> sekä
+	<a href="http://dokuwiki.org/config">asetuksista</a>.</p>
diff --git a/wiki/inc/lang/fi/jquery.ui.datepicker.js b/wiki/inc/lang/fi/jquery.ui.datepicker.js
new file mode 100644
index 0000000..a8386ff
--- /dev/null
+++ b/wiki/inc/lang/fi/jquery.ui.datepicker.js
@@ -0,0 +1,37 @@
+/* Finnish initialisation for the jQuery UI date picker plugin. */
+/* Written by Harri Kilpiö (harrikilpio@gmail.com). */
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "../widgets/datepicker" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery.datepicker );
+	}
+}( function( datepicker ) {
+
+datepicker.regional.fi = {
+	closeText: "Sulje",
+	prevText: "&#xAB;Edellinen",
+	nextText: "Seuraava&#xBB;",
+	currentText: "Tänään",
+	monthNames: [ "Tammikuu","Helmikuu","Maaliskuu","Huhtikuu","Toukokuu","Kesäkuu",
+	"Heinäkuu","Elokuu","Syyskuu","Lokakuu","Marraskuu","Joulukuu" ],
+	monthNamesShort: [ "Tammi","Helmi","Maalis","Huhti","Touko","Kesä",
+	"Heinä","Elo","Syys","Loka","Marras","Joulu" ],
+	dayNamesShort: [ "Su","Ma","Ti","Ke","To","Pe","La" ],
+	dayNames: [ "Sunnuntai","Maanantai","Tiistai","Keskiviikko","Torstai","Perjantai","Lauantai" ],
+	dayNamesMin: [ "Su","Ma","Ti","Ke","To","Pe","La" ],
+	weekHeader: "Vk",
+	dateFormat: "d.m.yy",
+	firstDay: 1,
+	isRTL: false,
+	showMonthAfterYear: false,
+	yearSuffix: "" };
+datepicker.setDefaults( datepicker.regional.fi );
+
+return datepicker.regional.fi;
+
+} ) );
diff --git a/wiki/inc/lang/fi/lang.php b/wiki/inc/lang/fi/lang.php
new file mode 100644
index 0000000..ebcca33
--- /dev/null
+++ b/wiki/inc/lang/fi/lang.php
@@ -0,0 +1,342 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * 
+ * @author Petteri <petteri@gmail.com>
+ * @author Matti Pöllä <mpo@iki.fi>
+ * @author Otto Vainio <otto@valjakko.net>
+ * @author Teemu Mattila <ghcsystems@gmail.com>
+ * @author Sami Olmari <sami@olmari.fi>
+ * @author Rami Lehti <rammer@ipi.fi>
+ * @author Jussi Takala <jussi.takala@live.fi>
+ * @author Wiki Doku <SugarKidder@mailinator.com>
+ */
+$lang['encoding']              = 'utf-8';
+$lang['direction']             = 'ltr';
+$lang['doublequoteopening']    = '”';
+$lang['doublequoteclosing']    = '”';
+$lang['singlequoteopening']    = '’';
+$lang['singlequoteclosing']    = '’';
+$lang['apostrophe']            = '’';
+$lang['btn_edit']              = 'Muokkaa tätä sivua';
+$lang['btn_source']            = 'Näytä sivun lähdekoodi';
+$lang['btn_show']              = 'Näytä sivu';
+$lang['btn_create']            = 'Luo tämä sivu';
+$lang['btn_search']            = 'Etsi';
+$lang['btn_save']              = 'Tallenna';
+$lang['btn_preview']           = 'Esikatselu';
+$lang['btn_top']               = 'Takaisin ylös';
+$lang['btn_newer']             = '<< uudemmat';
+$lang['btn_older']             = 'vanhemmat >>';
+$lang['btn_revs']              = 'Vanhat versiot';
+$lang['btn_recent']            = 'Viimeiset muutokset';
+$lang['btn_upload']            = 'Lähetä tiedosto';
+$lang['btn_cancel']            = 'Peru';
+$lang['btn_index']             = 'Hakemisto';
+$lang['btn_secedit']           = 'Muokkaa';
+$lang['btn_login']             = 'Kirjaudu sisään';
+$lang['btn_logout']            = 'Kirjaudu ulos';
+$lang['btn_admin']             = 'Ylläpito';
+$lang['btn_update']            = 'Päivitä';
+$lang['btn_delete']            = 'Poista';
+$lang['btn_back']              = 'Takaisin';
+$lang['btn_backlink']          = 'Paluulinkit';
+$lang['btn_subscribe']         = 'Tilaa muutokset';
+$lang['btn_profile']           = 'Päivitä profiili';
+$lang['btn_reset']             = 'Tyhjennä';
+$lang['btn_resendpwd']         = 'Aseta uusi salasana';
+$lang['btn_draft']             = 'Muokkaa luonnosta';
+$lang['btn_recover']           = 'Palauta luonnos';
+$lang['btn_draftdel']          = 'Poista luonnos';
+$lang['btn_revert']            = 'palauta';
+$lang['btn_register']          = 'Rekisteröidy';
+$lang['btn_apply']             = 'Toteuta';
+$lang['btn_media']             = 'Media manager';
+$lang['btn_deleteuser']        = 'Poista tilini';
+$lang['btn_img_backto']        = 'Takaisin %s';
+$lang['btn_mediaManager']      = 'Näytä mediamanagerissa';
+$lang['loggedinas']            = 'Kirjautunut nimellä:';
+$lang['user']                  = 'Käyttäjänimi';
+$lang['pass']                  = 'Salasana';
+$lang['newpass']               = 'Uusi salasana';
+$lang['oldpass']               = 'Vahvista nykyinen salasana';
+$lang['passchk']               = 'uudelleen';
+$lang['remember']              = 'Muista minut';
+$lang['fullname']              = 'Koko nimi';
+$lang['email']                 = 'Sähköposti';
+$lang['profile']               = 'Käyttäjän profiili';
+$lang['badlogin']              = 'Käyttäjänimi tai salasana oli väärä.';
+$lang['badpassconfirm']        = 'Valitan. Salasana oli väärin';
+$lang['minoredit']             = 'Pieni muutos';
+$lang['draftdate']             = 'Luonnos tallennettu automaattisesti';
+$lang['nosecedit']             = 'Sivu on muuttunut välillä ja kappaleen tiedot olivat vanhentuneet. Koko sivu ladattu.';
+$lang['regmissing']            = 'Kaikki kentät tulee täyttää.';
+$lang['reguexists']            = 'Käyttäjä tällä käyttäjänimellä on jo olemassa.';
+$lang['regsuccess']            = 'Käyttäjä luotiin ja salasana lähetettiin sähköpostilla.';
+$lang['regsuccess2']           = 'Käyttäjänimi on luotu.';
+$lang['regfail']               = 'Valitsemaasi käyttäjää ei voitu luoda.';
+$lang['regmailfail']           = 'Näyttää siltä, että salasanan lähettämisessä tapahtui virhe. Ota yhteys ylläpitäjään!';
+$lang['regbadmail']            = 'Antamasi sähköpostiosoite näyttää epäkelvolta. Jos pidät tätä virheenä ota yhteys ylläpitäjään.';
+$lang['regbadpass']            = 'Annetut kaksi salasanaa eivät täsmää. Yritä uudelleen.';
+$lang['regpwmail']             = 'DokuWiki salasanasi';
+$lang['reghere']               = 'Puuttuuko sinulta käyttäjätili? Hanki sellainen';
+$lang['profna']                = 'Tässä wikissä profiilien muokkaaminen ei ole mahdollista';
+$lang['profnochange']          = 'Ei muutoksia.';
+$lang['profnoempty']           = 'Tyhjä nimi tai sähköpostiosoite ei ole sallittu.';
+$lang['profchanged']           = 'Käyttäjän profiilin päivitys onnistui.';
+$lang['profnodelete']          = 'Tässä wikissä ei voi poistaa käyttäjiä';
+$lang['profdeleteuser']        = 'Poista tili';
+$lang['profdeleted']           = 'Käyttäjätilisi on postettu tästä wikistä';
+$lang['profconfdelete']        = 'Haluan poistaa käyttäjätilini tästä wikistä. <br/> Tätä toimintoa ei voi myöhemmin peruuttaa.';
+$lang['profconfdeletemissing'] = 'Vahvistus rastia ei valittu';
+$lang['pwdforget']             = 'Unohtuiko salasana? Hanki uusi';
+$lang['resendna']              = 'Tämä wiki ei tue salasanan uudelleenlähettämistä.';
+$lang['resendpwd']             = 'Aseta uusisalasana';
+$lang['resendpwdmissing']      = 'Kaikki kentät on täytettävä.';
+$lang['resendpwdnouser']       = 'Käyttäjää ei löydy tietokannastamme.';
+$lang['resendpwdbadauth']      = 'Tunnistuskoodi on virheellinen. Varmista, että käytit koko varmistuslinkkiä.';
+$lang['resendpwdconfirm']      = 'Varmistuslinkki on lähetetty sähköpostilla';
+$lang['resendpwdsuccess']      = 'Uusi salasanasi on lähetetty sähköpostilla.';
+$lang['license']               = 'Jollei muuta ole mainittu, niin sisältö tässä wikissä on lisensoitu seuraavalla lisenssillä:';
+$lang['licenseok']             = 'Huom: Muokkaamalla tätä sivua suostut lisensoimaan sisällön seuraavan lisenssin mukaisesti:';
+$lang['searchmedia']           = 'Etsi tiedostoa nimeltä:';
+$lang['searchmedia_in']        = 'Etsi kohteesta %s';
+$lang['txt_upload']            = 'Valitse tiedosto lähetettäväksi:';
+$lang['txt_filename']          = 'Lähetä nimellä (valinnainen):';
+$lang['txt_overwrt']           = 'Ylikirjoita olemassa oleva';
+$lang['maxuploadsize']         = 'Palvelimelle siirto max. %s / tiedosto.';
+$lang['lockedby']              = 'Tällä hetkellä tiedoston on lukinnut:';
+$lang['lockexpire']            = 'Lukitus päättyy:';
+$lang['js']['willexpire']      = 'Lukituksesi tämän sivun muokkaukseen päättyy minuutin kuluttua.\nRistiriitojen välttämiseksi paina esikatselu-nappia nollataksesi lukitusajan.';
+$lang['js']['notsavedyet']     = 'Dokumentissa on tallentamattomia muutoksia, jotka häviävät.
+ Haluatko varmasti jatkaa?';
+$lang['js']['searchmedia']     = 'Etsi tiedostoja';
+$lang['js']['keepopen']        = 'Pidä valinnan ikkuna avoinna.';
+$lang['js']['hidedetails']     = 'Piilota yksityiskohdat';
+$lang['js']['mediatitle']      = 'Linkkien asetukset';
+$lang['js']['mediadisplay']    = 'Linkin tyyppi';
+$lang['js']['mediaalign']      = 'Tasaus';
+$lang['js']['mediasize']       = 'Kuvan koko';
+$lang['js']['mediatarget']     = 'Linkin kohde';
+$lang['js']['mediaclose']      = 'Sulje';
+$lang['js']['mediainsert']     = 'Liitä';
+$lang['js']['mediadisplayimg'] = 'Näytä kuva.';
+$lang['js']['mediadisplaylnk'] = 'Näytä vain linkki';
+$lang['js']['mediasmall']      = 'Pieni versio';
+$lang['js']['mediamedium']     = 'Keskikokoinen versio';
+$lang['js']['medialarge']      = 'Iso versio';
+$lang['js']['mediaoriginal']   = 'Alkuperäinen versio';
+$lang['js']['medialnk']        = 'Linkki tietosivuun';
+$lang['js']['mediadirect']     = 'Suora linkki alkuperäiseen';
+$lang['js']['medianolnk']      = 'Ei linkkiä';
+$lang['js']['medianolink']     = 'Älä linkitä kuvaa';
+$lang['js']['medialeft']       = 'Tasaa kuva vasemmalle.';
+$lang['js']['mediaright']      = 'Tasaa kuva oikealle.';
+$lang['js']['mediacenter']     = 'Tasaa kuva keskelle.';
+$lang['js']['medianoalign']    = 'Älä tasaa.';
+$lang['js']['nosmblinks']      = 'Linkit Windows-jakoihin toimivat vain Microsoft Internet Explorerilla.
+Voit silti kopioida ja liittää linkin.';
+$lang['js']['linkwiz']         = 'Linkkivelho';
+$lang['js']['linkto']          = 'Linkki kohteeseen:';
+$lang['js']['del_confirm']     = 'Haluatko todella poistaa valitut kohteet?';
+$lang['js']['restore_confirm'] = 'Haluatko varmasti palauttaa tämän version?';
+$lang['js']['media_diff']      = 'Näytä erot:';
+$lang['js']['media_diff_both'] = 'Vierekkäin';
+$lang['js']['media_diff_opacity'] = 'Päällä';
+$lang['js']['media_diff_portions'] = 'Liukusäädin';
+$lang['js']['media_select']    = 'Valitse tiedostot...';
+$lang['js']['media_upload_btn'] = 'Lähetä';
+$lang['js']['media_done_btn']  = 'Valmis';
+$lang['js']['media_drop']      = 'Pudota lähetettävät tiedostot tähän';
+$lang['js']['media_cancel']    = 'Poista';
+$lang['js']['media_overwrt']   = 'Ylikirjoita olemassa olevat tiedostot';
+$lang['rssfailed']             = 'Virhe tapahtui noudettaessa tätä syötettä: ';
+$lang['nothingfound']          = 'Mitään ei löytynyt.';
+$lang['mediaselect']           = 'Mediatiedoston valinta';
+$lang['uploadsucc']            = 'Tiedoston lähetys onnistui';
+$lang['uploadfail']            = 'Tiedoston lähetys epäonnistui. Syynä ehkä väärät oikeudet?';
+$lang['uploadwrong']           = 'Tiedoston lähetys evätty. Tämä tiedostopääte on kielletty';
+$lang['uploadexist']           = 'Tiedosto on jo olemassa. Mitään ei tehty.';
+$lang['uploadbadcontent']      = 'Tiedoston sisältö ei vastannut päätettä %s';
+$lang['uploadspam']            = 'Roskapostin estolista esti tiedoston lähetyksen.';
+$lang['uploadxss']             = 'Tiedoston lähetys estettiin mahdollisen haitallisen sisällön vuoksi.';
+$lang['uploadsize']            = 'Lähetetty tiedosto oli liian iso. (max %s)';
+$lang['deletesucc']            = 'Tiedosto "%s" on poistettu.';
+$lang['deletefail']            = 'Kohdetta "%s" poistaminen ei onnistunut - tarkista oikeudet.';
+$lang['mediainuse']            = 'Tiedostoa "%s" ei ole poistettu - se on vielä käytössä.';
+$lang['namespaces']            = 'Nimiavaruudet';
+$lang['mediafiles']            = 'Tarjolla olevat tiedostot';
+$lang['accessdenied']          = 'Sinulla ei ole oikeuksia tämän sivun katsomiseen';
+$lang['mediausage']            = 'Käytä seuraavaa merkintätapaa viittausta tehtäessä:';
+$lang['mediaview']             = 'Katsele alkuperäistä tiedostoa';
+$lang['mediaroot']             = 'root';
+$lang['mediaupload']           = 'Siirrä tiedosto nykyiseen nimiavaruuteen täällä. Voit luoda uusia alinimiavaruuksia laittamalla lisäämällä sen nimen ja kaksoispisteen "Lähetä nimellä" eteen.';
+$lang['mediaextchange']        = 'Tiedoston pääte muutettu: .%s on nyt .%s!';
+$lang['reference']             = 'Viitteet';
+$lang['ref_inuse']             = 'Tiedostoa ei voi poistaa, koska seuraavat sivut käyttävät sitä:';
+$lang['ref_hidden']            = 'Osa viitteistä on sivuilla, joihin sinulla ei ole lukuoikeutta';
+$lang['hits']                  = 'Osumia';
+$lang['quickhits']             = 'Sopivat sivunimet';
+$lang['toc']                   = 'Sisällysluettelo';
+$lang['current']               = 'nykyinen';
+$lang['yours']                 = 'Sinun versiosi';
+$lang['diff']                  = 'Näytä eroavaisuudet nykyiseen versioon';
+$lang['diff2']                 = 'Näytä eroavaisuudet valittuun versioon';
+$lang['difflink']              = 'Linkki vertailunäkymään';
+$lang['diff_type']             = 'Näytä eroavaisuudet:';
+$lang['diff_inline']           = 'Sisäkkäin';
+$lang['diff_side']             = 'Vierekkäin';
+$lang['diffprevrev']           = 'Edellinen revisio';
+$lang['diffnextrev']           = 'Seuraava revisio';
+$lang['difflastrev']           = 'Viimeisin revisio';
+$lang['line']                  = 'Rivi';
+$lang['breadcrumb']            = 'Jäljet:';
+$lang['youarehere']            = 'Olet täällä:';
+$lang['lastmod']               = 'Viimeksi muutettu:';
+$lang['by']                    = '/';
+$lang['deleted']               = 'poistettu';
+$lang['created']               = 'luotu';
+$lang['restored']              = 'vanha versio palautettu (%s)';
+$lang['external_edit']         = 'ulkoinen muokkaus';
+$lang['summary']               = 'Yhteenveto muokkauksesta';
+$lang['noflash']               = 'Tarvitset <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash-liitännäisen</a> nähdäksesi tämän sisällön.';
+$lang['download']              = 'Lataa palanen';
+$lang['tools']                 = 'Työkalut';
+$lang['user_tools']            = 'Käyttäjän työkalut';
+$lang['site_tools']            = 'Sivuston työkalut';
+$lang['page_tools']            = 'Sivutyökalut';
+$lang['skip_to_content']       = 'Siirry sisältöön';
+$lang['sidebar']               = 'Sivupalkki';
+$lang['mail_newpage']          = 'sivu lisätty:';
+$lang['mail_changed']          = 'sivu muutettu:';
+$lang['mail_subscribe_list']   = 'muuttuneet sivut nimiavaruudessa:';
+$lang['mail_new_user']         = 'uusi käyttäjä:';
+$lang['mail_upload']           = 'tiedosto lähetetty:';
+$lang['changes_type']          = 'Näytä muutokset:';
+$lang['pages_changes']         = 'Sivut';
+$lang['media_changes']         = 'Mediatiedostot';
+$lang['both_changes']          = 'Sivut ja mediatiedostot';
+$lang['qb_bold']               = 'Lihavoitu teksti';
+$lang['qb_italic']             = 'Kursivoitu teksti';
+$lang['qb_underl']             = 'Alleviivattu teksti';
+$lang['qb_code']               = 'Kooditeksti';
+$lang['qb_strike']             = 'Yliviivattu teksti';
+$lang['qb_h1']                 = 'Taso 1 otsikko';
+$lang['qb_h2']                 = 'Taso 2 otsikko';
+$lang['qb_h3']                 = 'Taso 3 otsikko';
+$lang['qb_h4']                 = 'Taso 4 otsikko';
+$lang['qb_h5']                 = 'Taso 5 otsikko';
+$lang['qb_h']                  = 'Otsikko';
+$lang['qb_hs']                 = 'Valitse otsikko';
+$lang['qb_hplus']              = 'Ylempi otsikko';
+$lang['qb_hminus']             = 'Alempi otsikko';
+$lang['qb_hequal']             = 'Saman tason otsikko';
+$lang['qb_link']               = 'Sisäinen linkki';
+$lang['qb_extlink']            = 'Ulkoinen linkki';
+$lang['qb_hr']                 = 'Vaakaerotin';
+$lang['qb_ol']                 = 'Järjestetyn listan osa ';
+$lang['qb_ul']                 = 'Epäjärjestetyn listan osa';
+$lang['qb_media']              = 'Lisää kuvia ja muita tiedostoja';
+$lang['qb_sig']                = 'Lisää allekirjoitus';
+$lang['qb_smileys']            = 'Hymiöt';
+$lang['qb_chars']              = 'Erikoismerkit';
+$lang['upperns']               = 'Hyppää edelliseen nimiavaruuteen';
+$lang['metaedit']              = 'Muokkaa metadataa';
+$lang['metasaveerr']           = 'Metadatan kirjoittaminen epäonnistui';
+$lang['metasaveok']            = 'Metadata tallennettu';
+$lang['img_title']             = 'Otsikko:';
+$lang['img_caption']           = 'Kuvateksti:';
+$lang['img_date']              = 'Päivämäärä:';
+$lang['img_fname']             = 'Tiedoston nimi:';
+$lang['img_fsize']             = 'Koko:';
+$lang['img_artist']            = 'Kuvaaja:';
+$lang['img_copyr']             = 'Tekijänoikeus:';
+$lang['img_format']            = 'Formaatti:';
+$lang['img_camera']            = 'Kamera:';
+$lang['img_keywords']          = 'Avainsanat:';
+$lang['img_width']             = 'Leveys:';
+$lang['img_height']            = 'Korkeus:';
+$lang['subscr_subscribe_success'] = '%s lisätty %s tilauslistalle';
+$lang['subscr_subscribe_error'] = 'Virhe lisättäessä %s tilauslistalle %s';
+$lang['subscr_subscribe_noaddress'] = 'Login tiedoissasi ei ole sähköpostiosoitetta. Sinua ei voi lisätä tilaukseen';
+$lang['subscr_unsubscribe_success'] = '%s poistettu tilauslistalta %s';
+$lang['subscr_unsubscribe_error'] = 'Virhe tapahtui poistaessa %s tilauslistalta %s';
+$lang['subscr_already_subscribed'] = '%s on jo tilannut %s';
+$lang['subscr_not_subscribed'] = '%s ei ole tilannut %s';
+$lang['subscr_m_not_subscribed'] = 'Et ole tilannut sivua tai nimiavaruutta';
+$lang['subscr_m_new_header']   = 'Lisää tilaus';
+$lang['subscr_m_current_header'] = 'Voimassaolevat tilaukset';
+$lang['subscr_m_unsubscribe']  = 'Poista tilaus';
+$lang['subscr_m_subscribe']    = 'Tilaa';
+$lang['subscr_m_receive']      = 'Vastaanota';
+$lang['subscr_style_every']    = 'Sähköposti joka muutoksesta';
+$lang['subscr_style_digest']   = 'yhteenveto-sähköposti joka sivusta (joka %.2f. päivä)';
+$lang['subscr_style_list']     = 'lista muuttuneista sivuista edellisen sähköpostin jälkeen (joka %.2f. päivä)';
+$lang['authtempfail']          = 'Käyttäjien autentikointi ei tällä hetkellä onnistu. Jos ongelma jatkuu, ota yhteyttä wikin ylläpitäjään.';
+$lang['i_chooselang']          = 'Valitse kieli';
+$lang['i_installer']           = 'DokuWikin asentaja';
+$lang['i_wikiname']            = 'Wikin nimi';
+$lang['i_enableacl']           = 'Käytä käyttöoikeuksien hallintaa (ACL) (Suositeltu)';
+$lang['i_superuser']           = 'Pääkäyttäjä';
+$lang['i_problems']            = 'Asennusohjelma löysi alla listattuja ongelmia ongelmia. Et voi jatkaa ennen kuin ne on korjattu.';
+$lang['i_modified']            = 'Turvallisuussyistä tämä ohjelma toimii vain uusien ja muokkaamattomien Dokuwiki-asennusten kanssa. Pura tiedostot uudestaan asennuspaketista, tai lue <a href="http://dokuwiki.org/install">Dokuwikin asennusohje (englanniksi)</a>';
+$lang['i_funcna']              = 'PHP:n funktio <code>%s</code> ei ole käytettävissä. Palveluntarjoajasi on saattanut poistaa sen jostain syystä.';
+$lang['i_phpver']              = 'Käyttämäsi PHP-ohjelmiston versio <code>%s</code> on pienempi, kuin tarvitaan <code>%s</code>. PHP-asennuksesi pitää päivittää.';
+$lang['i_mbfuncoverload']      = 'mbstring.func_overload pitää ottaa pois käytöstä php.ini -tiedostosta käyttääksesi DokuWikiä';
+$lang['i_permfail']            = '<code>%s</code> ei ole DokuWikin kirjoitettavissa. Muokkaa hakemiston oikeuksia!';
+$lang['i_confexists']          = '<code>%s</code> on jo olemassa';
+$lang['i_writeerr']            = '<code>%s</code>n luonti epäonnistui. Tarkista hakemiston/tiedoston oikeudet ja luo tiedosto käsin.';
+$lang['i_badhash']             = 'tunnistamaton tai muokattu dokuwiki.php (tarkistussumma=<code>%s</code>)';
+$lang['i_badval']              = '<code>%s</code> - väärä tai tyhjä arvo';
+$lang['i_success']             = 'Kokoonpano tehty onnistuneesti. Voit poistaa install.php tiedoston. Jatka <a href="doku.php?id=wiki:welcome">uuteen DokuWikiisi</a>.';
+$lang['i_failure']             = 'Joitain virheitä tapahtui kirjoitettaessa vaadittavia tiedostoja. Sinun pitää korjata ne käsin ennen kuin voit käyttää <a href="doku.php?id=wiki:welcome">uutta DokuWikiäsi</a>.';
+$lang['i_policy']              = 'Käyttöoikeuksien oletusmenettelytapa';
+$lang['i_pol0']                = 'Avoin Wiki (luku, kirjoitus, tiedostojen lähetys on sallittu kaikille)';
+$lang['i_pol1']                = 'Julkinen Wiki (luku kaikilla, kirjoitus ja tiedostojen lähetys rekisteröidyillä käyttäjillä)';
+$lang['i_pol2']                = 'Suljettu Wiki (luku, kirjoitus ja tiedostojen lähetys vain rekisteröityneillä käyttäjillä)';
+$lang['i_allowreg']            = 'Salli käyttäjien rekisteröityminen';
+$lang['i_retry']               = 'Yritä uudelleen';
+$lang['i_license']             = 'Valitse lisenssi, jonka alle haluat sisältösi laittaa:';
+$lang['i_license_none']        = 'Älä näytä mitään lisenssitietoja';
+$lang['i_pop_field']           = 'Auta parantamaan DokuWikiä';
+$lang['i_pop_label']           = 'Lähetä kerran kuussa nimetöntä käyttäjätietoa DokuWikin kehittäjille';
+$lang['recent_global']         = 'Seuraat tällä hetkellä muutoksia nimiavaruuden <b>%s</b> sisällä. Voit myös <a href="%s">katsoa muutoksia koko wikissä</a>';
+$lang['years']                 = '%d vuotta sitten';
+$lang['months']                = '%d kuukautta sitten';
+$lang['weeks']                 = '%d viikkoa sitten';
+$lang['days']                  = '%d päivää sitten';
+$lang['hours']                 = '%d tuntia sitten';
+$lang['minutes']               = '%d minuuttia sitten';
+$lang['seconds']               = '%d sekuntia sitten';
+$lang['wordblock']             = 'Muutostasi ei talletettu, koska se sisältää estettyä tekstiä (spam).';
+$lang['media_uploadtab']       = 'Lähetä';
+$lang['media_searchtab']       = 'Etsi';
+$lang['media_file']            = 'Tiedosto';
+$lang['media_viewtab']         = 'Näytä';
+$lang['media_edittab']         = 'Muokkaa';
+$lang['media_historytab']      = 'Historia';
+$lang['media_list_thumbs']     = 'Thumbnails';
+$lang['media_list_rows']       = 'Rivit';
+$lang['media_sort_name']       = 'nimen mukaan';
+$lang['media_sort_date']       = 'päivämäärän mukaan';
+$lang['media_namespaces']      = 'Valitse nimiavaruus';
+$lang['media_files']           = 'Tiedostoja %s';
+$lang['media_upload']          = 'Lähetä <strong>%s</strong> nimiavaruuteen';
+$lang['media_search']          = 'Etsi <strong>%s</strong> nimiavaruudesta';
+$lang['media_view']            = '%s';
+$lang['media_viewold']         = '%s at %s';
+$lang['media_edit']            = 'Muokkaa %s';
+$lang['media_history']         = 'Nämä ovat vanhat versiot tiedostosta %s';
+$lang['media_meta_edited']     = 'Metadataa muokattu';
+$lang['media_perm_read']       = 'Anteeksi. Sinulla ei ole riittävästi oikeuksia lukeaksesi tiedostoja.';
+$lang['media_perm_upload']     = 'Anteeksi. Sinulla ei ole riittävästi oikeuksia lähettääksesi tiedostoja.';
+$lang['media_update']          = 'Lähetä uusi versio';
+$lang['media_restore']         = 'Palauta tämä versio';
+$lang['currentns']             = 'Nykyinen nimiavaruus';
+$lang['searchresult']          = 'Haun tulokset';
+$lang['plainhtml']             = 'pelkkä HTML';
+$lang['wikimarkup']            = 'Wiki markup';
+$lang['unable_to_parse_date']  = 'Parametrin "%s" jäsennys ei onnistu.';
+$lang['email_signature_text'] = 'Tämän postin loi DokuWiki osoitteessa
+@DOKUWIKIURL@';
diff --git a/wiki/inc/lang/fi/locked.txt b/wiki/inc/lang/fi/locked.txt
new file mode 100644
index 0000000..3a48ff8
--- /dev/null
+++ b/wiki/inc/lang/fi/locked.txt
@@ -0,0 +1,3 @@
+====== Sivu lukittu ======
+
+Tämä sivu on tällä hetkellä lukittuna, koska se on toisen käyttäjän muokkauksessa. Joudut odottamaan, kunnes hän lopettaa muokkauksen, tai kunnes lukko aukeaa.
diff --git a/wiki/inc/lang/fi/login.txt b/wiki/inc/lang/fi/login.txt
new file mode 100644
index 0000000..efba262
--- /dev/null
+++ b/wiki/inc/lang/fi/login.txt
@@ -0,0 +1,3 @@
+====== Sisäänkirjautuminen ======
+
+Et ole tällä hetkellä kirjautunut sisään! Anna käyttäjätunnus ja salasana alle kirjautuaksesi. Muista, että evästeiden käyttö tulee olla päällä, jotta sisäänkirjautuminen onnistuu.
diff --git a/wiki/inc/lang/fi/mailtext.txt b/wiki/inc/lang/fi/mailtext.txt
new file mode 100644
index 0000000..015b3c3
--- /dev/null
+++ b/wiki/inc/lang/fi/mailtext.txt
@@ -0,0 +1,12 @@
+DokuWikiisi lisättiin tai siellä muutettiin sivua. Tässä yksityiskohdat
+
+Päivämäärä : @DATE@
+Selain: @BROWSER@
+IP-Osoite: @IPADDRESS@
+Isäntänimi: @HOSTNAME@
+Vanha versio: @OLDPAGE@
+Uusi versio: @NEWPAGE@
+Yhteenveto: @SUMMARY@
+Käyttäjä : @USER@
+
+@DIFF@
diff --git a/wiki/inc/lang/fi/mailwrap.html b/wiki/inc/lang/fi/mailwrap.html
new file mode 100644
index 0000000..d257190
--- /dev/null
+++ b/wiki/inc/lang/fi/mailwrap.html
@@ -0,0 +1,13 @@
+<html>
+<head>
+<title>@TITLE@</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+</head>
+<body>
+
+@HTMLBODY@
+
+<br /><hr />
+<small>@EMAILSIGNATURE@</small>
+</body>
+</html>
\ No newline at end of file
diff --git a/wiki/inc/lang/fi/newpage.txt b/wiki/inc/lang/fi/newpage.txt
new file mode 100644
index 0000000..fc6379b
--- /dev/null
+++ b/wiki/inc/lang/fi/newpage.txt
@@ -0,0 +1,3 @@
+====== Tätä otsikkoa ei vielä ole ======
+
+Olet seurannut linkkiä otsikkoon jota ei vielä ole. Voit luoda tämän käyttämällä ''Luo tämä sivu'' -nappia.
diff --git a/wiki/inc/lang/fi/norev.txt b/wiki/inc/lang/fi/norev.txt
new file mode 100644
index 0000000..a5138cf
--- /dev/null
+++ b/wiki/inc/lang/fi/norev.txt
@@ -0,0 +1,3 @@
+====== Ei tällaista versiota ======
+
+Kyseistä versiota ei ole. Käytä ''Vanha versio''-nappia nähdäksesi listan tämän dokumentin vanhoista versioista
diff --git a/wiki/inc/lang/fi/password.txt b/wiki/inc/lang/fi/password.txt
new file mode 100644
index 0000000..e088166
--- /dev/null
+++ b/wiki/inc/lang/fi/password.txt
@@ -0,0 +1,6 @@
+Terve @FULLNAME@!
+
+Tässä käyttäjätietosi sivulla @TITLE@ osoitteessa @DOKUWIKIURL@
+
+Käyttäjätunnus : @LOGIN@
+Salasana : @PASSWORD@
diff --git a/wiki/inc/lang/fi/preview.txt b/wiki/inc/lang/fi/preview.txt
new file mode 100644
index 0000000..8487807
--- /dev/null
+++ b/wiki/inc/lang/fi/preview.txt
@@ -0,0 +1,3 @@
+====== Esikatselu ======
+
+Tämä on esikatselu siitä, miltä tekstisi tulee näyttämään. Muista, että tätä **ei ole tallennettu** vielä!
diff --git a/wiki/inc/lang/fi/pwconfirm.txt b/wiki/inc/lang/fi/pwconfirm.txt
new file mode 100644
index 0000000..de6780c
--- /dev/null
+++ b/wiki/inc/lang/fi/pwconfirm.txt
@@ -0,0 +1,9 @@
+Hei @FULLNAME@!
+
+Joku pyysi uutta salasanaa login nimellesi @TITLE@ sivustolla @DOKUWIKIURL@
+
+Jos sinä ei pyytänyt uutta salasanaa, niin voit unohtaa tämän postin.
+
+Käytä alla olevaa linkkiä vahvistaaksesi, että pyynnön lähettäjä todella olet sinä.
+
+@CONFIRM@
diff --git a/wiki/inc/lang/fi/read.txt b/wiki/inc/lang/fi/read.txt
new file mode 100644
index 0000000..eb43802
--- /dev/null
+++ b/wiki/inc/lang/fi/read.txt
@@ -0,0 +1 @@
+Tämä sivu on vain luettavissa. Voit katsoa sen lähdekoodia, mutta et muuttaa sitä. Kysy ylläpitäjältä jos pidät tätä estoa virheellisenä.
diff --git a/wiki/inc/lang/fi/recent.txt b/wiki/inc/lang/fi/recent.txt
new file mode 100644
index 0000000..ffb0810
--- /dev/null
+++ b/wiki/inc/lang/fi/recent.txt
@@ -0,0 +1,4 @@
+====== Viimeiset muutokset ======
+
+Seuraavat sivut ovat muuttuneet viime aikoina.
+
diff --git a/wiki/inc/lang/fi/register.txt b/wiki/inc/lang/fi/register.txt
new file mode 100644
index 0000000..cf7a625
--- /dev/null
+++ b/wiki/inc/lang/fi/register.txt
@@ -0,0 +1,3 @@
+====== Rekisteröi uusi käyttäjä ======
+
+Täytä alla olevat tiedot luodaksesi uuden käyttäjätilin tähän wikiin. Muista antaa **toimiva sähköpostiosoite**. Jos sinulta ei kysytä uutta salasanaa, niin uusi salasanasi lähetetään sähköpostiisi. Käyttäjänimi pitää olla myös käypä [[doku>pagename|sivunimi]].
diff --git a/wiki/inc/lang/fi/registermail.txt b/wiki/inc/lang/fi/registermail.txt
new file mode 100644
index 0000000..07c35be
--- /dev/null
+++ b/wiki/inc/lang/fi/registermail.txt
@@ -0,0 +1,10 @@
+Uusi käyttäjä on rekisteröitynyt. Tässä tiedot:
+
+Käyttäjänimi : @NEWUSER@
+Kokonimi : @NEWNAME@
+Sähköposti : @NEWEMAIL@
+
+Päivämäärä : @DATE@
+Selain : @BROWSER@
+IP-osoite : @IPADDRESS@
+Hostname : @HOSTNAME@
diff --git a/wiki/inc/lang/fi/resendpwd.txt b/wiki/inc/lang/fi/resendpwd.txt
new file mode 100644
index 0000000..5a567b0
--- /dev/null
+++ b/wiki/inc/lang/fi/resendpwd.txt
@@ -0,0 +1,3 @@
+====== Lähetä uusi salasana ======
+
+Täytä käyttäjätunnuksesi kaavakkeeseen pyytääksesi uutta salasanaa wikin käyttäjätilillesi. Vahvistuslinkki lähetetään kirjautumisen yhteydessä antamaan sähköpostiosoitteeseen.
diff --git a/wiki/inc/lang/fi/resetpwd.txt b/wiki/inc/lang/fi/resetpwd.txt
new file mode 100644
index 0000000..c678094
--- /dev/null
+++ b/wiki/inc/lang/fi/resetpwd.txt
@@ -0,0 +1,3 @@
+===== Aseta salasana =====
+
+Anna uusi salasanasi tässä wikissä.
\ No newline at end of file
diff --git a/wiki/inc/lang/fi/revisions.txt b/wiki/inc/lang/fi/revisions.txt
new file mode 100644
index 0000000..a48cd33
--- /dev/null
+++ b/wiki/inc/lang/fi/revisions.txt
@@ -0,0 +1,3 @@
+====== Vanha versio ======
+
+Nämä ovat vanhoja versioita nykyisestä dokumentista. Jos haluat palauttaa vanhan version valitse se alhaalta, paina ''Muokkaa tätä sivua'' ja tallenna se.
diff --git a/wiki/inc/lang/fi/searchpage.txt b/wiki/inc/lang/fi/searchpage.txt
new file mode 100644
index 0000000..8e61bf3
--- /dev/null
+++ b/wiki/inc/lang/fi/searchpage.txt
@@ -0,0 +1,4 @@
+====== Etsi ======
+
+Löydät etsinnän tulokset alta. @CREATEPAGEINFO@
+
diff --git a/wiki/inc/lang/fi/showrev.txt b/wiki/inc/lang/fi/showrev.txt
new file mode 100644
index 0000000..243f8d0
--- /dev/null
+++ b/wiki/inc/lang/fi/showrev.txt
@@ -0,0 +1,2 @@
+**Tämä on vanha versio dokumentista!**
+----
diff --git a/wiki/inc/lang/fi/stopwords.txt b/wiki/inc/lang/fi/stopwords.txt
new file mode 100644
index 0000000..82d3daa
--- /dev/null
+++ b/wiki/inc/lang/fi/stopwords.txt
@@ -0,0 +1,11 @@
+# Tämä on lista sanoista, jotka indeksoija ohittaa. Yksi sana riviä kohti
+# Kun muokkaat sivua, varmista että käytät UNIX rivinvaihtoa (yksi newline)
+# Ei tarvitse lisätä alle kolmen merkin sanoja. NE ohitetaan automaattisesti.
+# Jos wikissäsin muita kieliä, lisää sanoja listaan esimerkiksi sivulta http://www.ranks.nl/stopwords/
+www
+eli
+tai
+sinä
+sinun
+com
+oli
diff --git a/wiki/inc/lang/fi/subscr_digest.txt b/wiki/inc/lang/fi/subscr_digest.txt
new file mode 100644
index 0000000..e395e07
--- /dev/null
+++ b/wiki/inc/lang/fi/subscr_digest.txt
@@ -0,0 +1,16 @@
+Hei!
+
+Sivu @PAGE@ wikissä @TITLE@ on muuttunut.
+Tässä ovat muutokset:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Vanha versio: @OLDPAGE@
+Uusi versio: @NEWPAGE@
+
+Peruttaaksesi sivuilmoitukset kirjaudu wikiin osoitteessa
+@DOKUWIKIURL@ , jonka jälkeen katso
+@SUBSCRIBE@
+ja peruuta tilauksesi sivun ja/tai nimiavaruuden muutoksista.
diff --git a/wiki/inc/lang/fi/subscr_form.txt b/wiki/inc/lang/fi/subscr_form.txt
new file mode 100644
index 0000000..70f2fde
--- /dev/null
+++ b/wiki/inc/lang/fi/subscr_form.txt
@@ -0,0 +1,3 @@
+====== Tilausten hallinta ======
+
+Tämä sivu avulla voit hallita silauksiasi nykyiseltä sivulta ja nimiavaruudelta.
\ No newline at end of file
diff --git a/wiki/inc/lang/fi/subscr_list.txt b/wiki/inc/lang/fi/subscr_list.txt
new file mode 100644
index 0000000..255f123
--- /dev/null
+++ b/wiki/inc/lang/fi/subscr_list.txt
@@ -0,0 +1,13 @@
+Hei!
+
+Sivut nimiavaruudessa @PAGE@ wikissä @TITLE@ ovat muuttuneet.
+Tässä ovat muuttuneet sivut:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Peruuttaaksesi sivuilmoitukset kirjaudu wikiin osoitteessa
+@DOKUWIKIURL@ , jonka jälkeen katso
+@SUBSCRIBE@
+ja peruuta tilauksesi sivun ja/tai nimiavaruuden muutoksista.
diff --git a/wiki/inc/lang/fi/subscr_single.txt b/wiki/inc/lang/fi/subscr_single.txt
new file mode 100644
index 0000000..f373ff3
--- /dev/null
+++ b/wiki/inc/lang/fi/subscr_single.txt
@@ -0,0 +1,19 @@
+Hei!
+
+Sivu @PAGE@ wikissä @TITLE@ on muuttunut.
+Tässä ovat muutokset:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Päivä : @DATE@
+Käyttäjä : @USER@
+Yhteenveto: @SUMMARY@
+Vanha versio: @OLDPAGE@
+Uusi versio: @NEWPAGE@
+
+Peruttaaksesi sivuilmoitukset kirjaudu wikiin osoitteessa
+@DOKUWIKIURL@ , jonka jälkeen katso
+@SUBSCRIBE@
+ja peruuta tilauksesi sivun ja/tai nimiavaruuden muutoksista.
diff --git a/wiki/inc/lang/fi/updateprofile.txt b/wiki/inc/lang/fi/updateprofile.txt
new file mode 100644
index 0000000..7140795
--- /dev/null
+++ b/wiki/inc/lang/fi/updateprofile.txt
@@ -0,0 +1,3 @@
+====== Päivitä käyttäjätilisi profiilia ======
+
+Täytä vain ne kentät, joita haluat muuttaa. Et voi muuttaa käyttäjätunnustasi.
\ No newline at end of file
diff --git a/wiki/inc/lang/fi/uploadmail.txt b/wiki/inc/lang/fi/uploadmail.txt
new file mode 100644
index 0000000..e7b9abf
--- /dev/null
+++ b/wiki/inc/lang/fi/uploadmail.txt
@@ -0,0 +1,10 @@
+Tiedosto ladattiin DokuWikillesi. Tässä yksityiskohtaiset tiedot:
+
+Tiedosto : @MEDIA@
+PVM : @DATE@
+Selain : @BROWSER@
+IP-Osoite : @IPADDRESS@
+Hostname : @HOSTNAME@
+Koko : @SIZE@
+MIME Type : @MIME@
+Käyttäjä : @USER@
diff --git a/wiki/inc/lang/fo/admin.txt b/wiki/inc/lang/fo/admin.txt
new file mode 100644
index 0000000..2774322
--- /dev/null
+++ b/wiki/inc/lang/fo/admin.txt
@@ -0,0 +1,4 @@
+====== Fyrisiting ======
+
+Niðanfyri kanst tú finna eina røð av amboðum til fyrisiting.
+
diff --git a/wiki/inc/lang/fo/backlinks.txt b/wiki/inc/lang/fo/backlinks.txt
new file mode 100644
index 0000000..422377f
--- /dev/null
+++ b/wiki/inc/lang/fo/backlinks.txt
@@ -0,0 +1,4 @@
+====== Ávísing afturúr ======
+
+Hetta er ein listi yvur øll tey skjøl sum vísa aftur á tað núverandi skjali.
+
diff --git a/wiki/inc/lang/fo/conflict.txt b/wiki/inc/lang/fo/conflict.txt
new file mode 100644
index 0000000..df3fe52
--- /dev/null
+++ b/wiki/inc/lang/fo/conflict.txt
@@ -0,0 +1,5 @@
+====== Ein níggjari útgáva av skjalinum er til ======
+
+Ein nýggjari útgáva av hesum skjalinum er til. Hetta hendur tá fleiri brúkarir rætta í skjalinum samstundis.
+
+Eftirkanna tær vístu broytingar nágreiniliga, og avgerð hvat fyri útgávu sum skal goymast. Um tú velur ''Goym'', verður tín útgáva av skalinum goymd. Velur tú ''Angra'' varðveittur tú tí núverandi útgávuna.
diff --git a/wiki/inc/lang/fo/denied.txt b/wiki/inc/lang/fo/denied.txt
new file mode 100644
index 0000000..ecebba8
--- /dev/null
+++ b/wiki/inc/lang/fo/denied.txt
@@ -0,0 +1,4 @@
+====== Atgongd nokta! ======
+
+Tú hevur ikki rættindi til at halda áfram.
+
diff --git a/wiki/inc/lang/fo/diff.txt b/wiki/inc/lang/fo/diff.txt
new file mode 100644
index 0000000..343818b
--- /dev/null
+++ b/wiki/inc/lang/fo/diff.txt
@@ -0,0 +1,4 @@
+====== Munir ======
+
+Hetta vísur munir millum tí valdu og núverandu útgávu av skjalinum. Gular eru linjur sum er at finna í gomlu útgávuni, og grønar eru linjur sum eru at finna í núvarandi útgávuni.
+
diff --git a/wiki/inc/lang/fo/edit.txt b/wiki/inc/lang/fo/edit.txt
new file mode 100644
index 0000000..2ba92a2
--- /dev/null
+++ b/wiki/inc/lang/fo/edit.txt
@@ -0,0 +1,2 @@
+Rætta hetta skjal og trýst so á **''[Goym]''** knappin. Sí [[wiki:syntax|snið ábending]] fyri Wiki setningsbygnað. Rætta vinarliga bert hetta skjali um tú kanst **fyrireika** tað. Nýt vinarliga [[playground:playground|sandkassan]] til at testa áðrenn tú rættar í einum røttum skjali. Minst eisini til at brúkar **''[Forskoðan]''** áðrenn tú goymur skjalið.
+
diff --git a/wiki/inc/lang/fo/editrev.txt b/wiki/inc/lang/fo/editrev.txt
new file mode 100644
index 0000000..274d423
--- /dev/null
+++ b/wiki/inc/lang/fo/editrev.txt
@@ -0,0 +1,2 @@
+**Tú hevur heinta eina gamla útgávu av hesum skjalinum!** Um tú goymur skjali vilt tú skriva útyvir núverandi við gomlu útgávuni.
+----
diff --git a/wiki/inc/lang/fo/index.txt b/wiki/inc/lang/fo/index.txt
new file mode 100644
index 0000000..640edfb
--- /dev/null
+++ b/wiki/inc/lang/fo/index.txt
@@ -0,0 +1,3 @@
+====== Evnisyvirlit ======
+
+Hetta er eitt yvirlit yvur øll atkomandi skjøl, flokka eftir [[doku>namespaces|navnarúm]].
diff --git a/wiki/inc/lang/fo/jquery.ui.datepicker.js b/wiki/inc/lang/fo/jquery.ui.datepicker.js
new file mode 100644
index 0000000..6c24b8b
--- /dev/null
+++ b/wiki/inc/lang/fo/jquery.ui.datepicker.js
@@ -0,0 +1,45 @@
+/* Faroese initialisation for the jQuery UI date picker plugin */
+/* Written by Sverri Mohr Olsen, sverrimo@gmail.com */
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "../widgets/datepicker" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery.datepicker );
+	}
+}( function( datepicker ) {
+
+datepicker.regional.fo = {
+	closeText: "Lat aftur",
+	prevText: "&#x3C;Fyrra",
+	nextText: "Næsta&#x3E;",
+	currentText: "Í dag",
+	monthNames: [ "Januar","Februar","Mars","Apríl","Mei","Juni",
+	"Juli","August","September","Oktober","November","Desember" ],
+	monthNamesShort: [ "Jan","Feb","Mar","Apr","Mei","Jun",
+	"Jul","Aug","Sep","Okt","Nov","Des" ],
+	dayNames: [
+		"Sunnudagur",
+		"Mánadagur",
+		"Týsdagur",
+		"Mikudagur",
+		"Hósdagur",
+		"Fríggjadagur",
+		"Leyardagur"
+	],
+	dayNamesShort: [ "Sun","Mán","Týs","Mik","Hós","Frí","Ley" ],
+	dayNamesMin: [ "Su","Má","Tý","Mi","Hó","Fr","Le" ],
+	weekHeader: "Vk",
+	dateFormat: "dd-mm-yy",
+	firstDay: 1,
+	isRTL: false,
+	showMonthAfterYear: false,
+	yearSuffix: "" };
+datepicker.setDefaults( datepicker.regional.fo );
+
+return datepicker.regional.fo;
+
+} ) );
diff --git a/wiki/inc/lang/fo/lang.php b/wiki/inc/lang/fo/lang.php
new file mode 100644
index 0000000..9b078d3
--- /dev/null
+++ b/wiki/inc/lang/fo/lang.php
@@ -0,0 +1,170 @@
+<?php
+/**
+ * faroese language file
+ *
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Poul J. Clementsen <poul@diku.dk>
+ * @author Einar Petersen <einar.petersen@gmail.com>
+ */
+$lang['encoding']              = 'utf-8';
+$lang['direction']             = 'ltr';
+$lang['doublequoteopening']    = '&quot;';
+$lang['doublequoteclosing']    = '&quot;';
+$lang['singlequoteopening']    = '\'';
+$lang['singlequoteclosing']    = '\'';
+$lang['apostrophe']            = '\'';
+$lang['btn_edit']              = 'Rætta hetta skjal';
+$lang['btn_source']            = 'Vís keldu';
+$lang['btn_show']              = 'Vís skjal';
+$lang['btn_create']            = 'Býrja uppá hetta skjal';
+$lang['btn_search']            = 'Leita';
+$lang['btn_save']              = 'Goym';
+$lang['btn_preview']           = 'Forskoðan';
+$lang['btn_top']               = 'Aftur til toppin';
+$lang['btn_newer']             = '<< undan síða';
+$lang['btn_older']             = 'næsta síðe >>';
+$lang['btn_revs']              = 'Gamlar útgávur';
+$lang['btn_recent']            = 'Nýggj broyting';
+$lang['btn_upload']            = 'Legg fílu upp';
+$lang['btn_cancel']            = 'Angra';
+$lang['btn_index']             = 'Evnisyvirlit';
+$lang['btn_secedit']           = 'Rætta';
+$lang['btn_login']             = 'Rita inn';
+$lang['btn_logout']            = 'Rita út';
+$lang['btn_admin']             = 'Admin';
+$lang['btn_update']            = 'Dagfør';
+$lang['btn_delete']            = 'Strika';
+$lang['btn_back']              = 'Aftur';
+$lang['btn_backlink']          = 'Ávísingar afturúr';
+$lang['btn_subscribe']         = 'Tilmelda broytingar';
+$lang['btn_profile']           = 'Dagføra vangamynd';
+$lang['btn_reset']             = 'Nullstilla';
+$lang['btn_draft']             = 'Broyt kladdu';
+$lang['btn_recover']           = 'Endurbygg kladdu';
+$lang['btn_draftdel']          = 'Sletta';
+$lang['btn_revert']            = 'Endurbygg';
+$lang['btn_register']          = 'Melda til';
+$lang['loggedinas']            = 'Ritavur inn sum:';
+$lang['user']                  = 'Brúkaranavn';
+$lang['pass']                  = 'Loyniorð';
+$lang['newpass']               = 'Nýtt loyniorð';
+$lang['oldpass']               = 'Vátta núverandi loyniorð';
+$lang['passchk']               = 'Endurtak nýtt loyniorð';
+$lang['remember']              = 'Minst til loyniorðið hjá mær';
+$lang['fullname']              = 'Navn';
+$lang['email']                 = 'T-postur';
+$lang['profile']               = 'Brúkara vangamynd';
+$lang['badlogin']              = 'Skeivt brúkaranavn ella loyniorð.';
+$lang['minoredit']             = 'Smærri broytingar';
+$lang['draftdate']             = 'Goym kladdu sett frá';
+$lang['nosecedit']             = 'Hendan síðan var broytt undir tilevnan, brotið var ikki rætt dagfest, heintaði fulla síðu í staðin';
+$lang['regmissing']            = 'Tú skalt fylla út øll øki.';
+$lang['reguexists']            = 'Hetta brúkaranavn er upptiki.';
+$lang['regsuccess']            = 'Tú ert nú stovnavur sum brúkari. Títt loyniorð verður sent til tín í einum T-posti.';
+$lang['regsuccess2']           = 'Tú ert nú stovnavur sum brúkari.';
+$lang['regmailfail']           = 'Títt loyniorð bleiv ikki sent. Fá vinarliga samband við administratorin.';
+$lang['regbadmail']            = 'T-post adressan er ógildig. Fá vinarliga samband við administratorin, um tú heldur at hetta er eitt brek.';
+$lang['regbadpass']            = 'Bæði loyniorðini eru ikki eins, royn vinarliga umaftur.';
+$lang['regpwmail']             = 'Títt DokuWiki loyniorð';
+$lang['reghere']               = 'Upprætta eina DokuWiki-konto her';
+$lang['profna']                = 'Tað er ikki møguligt at broyta tína vangamynd í hesu wiki';
+$lang['profnochange']          = 'Ongar broytingar, onki tillaga.';
+$lang['profnoempty']           = 'Tómt navn ella t-post adressa er ikki loyvt.';
+$lang['profchanged']           = 'Brúkara vangamynd dagført rætt.';
+$lang['pwdforget']             = 'Gloymt títt loyniorð? Fá eitt nýtt';
+$lang['resendna']              = 'Tað er ikki møguligt at fá sent nýtt loyniorð við hesu wiki.';
+$lang['resendpwdmissing']      = 'Tú skal filla út øll økir.';
+$lang['resendpwdnouser']       = 'Vit kunna ikki finna hendan brúkara í okkara dátagrunni.';
+$lang['resendpwdbadauth']      = 'Hald til góðar, hendan góðkenningar kodan er ikki gildug. Kanna eftir at tú nýtti tað fulfíggjaðu góðkenningarleinkjuna';
+$lang['resendpwdconfirm']      = 'Ein góðkenningarleinkja er send við e-posti';
+$lang['resendpwdsuccess']      = 'Títt nýggja loyniorð er sent við t-posti.';
+$lang['license']               = 'Um ikki annað er tilskilað, so er tilfar á hesari wiki loyvt margfaldað undir fylgjandi treytum:';
+$lang['licenseok']             = 'Legg til merkis: Við at dagføra hesa síðu samtykkir tú at loyva margfalding av tilfarinum undir fylgjandi treytum:';
+$lang['searchmedia']           = 'Leita eftir fíl navn:';
+$lang['searchmedia_in']        = 'Leita í %s';
+$lang['txt_upload']            = 'Vel tí fílu sum skal leggjast upp:';
+$lang['txt_filename']          = 'Sláa inn wikinavn (valfrítt):';
+$lang['txt_overwrt']           = 'Yvurskriva verandi fílu';
+$lang['lockedby']              = 'Fyribils læst av:';
+$lang['lockexpire']            = 'Lásið ferð úr gildi kl.:';
+$lang['js']['willexpire']            = 'Títt lás á hetta skjalið ferð úr gildi um ein minnutt.\nTrýst á Forskoðan-knappin fyri at sleppa undan trupulleikum.';
+$lang['js']['notsavedyet']     = 'Tað eru gjørdar broytingar í skjalinum, um tú haldur fram vilja broytingar fara fyri skeytið.
+Ynskir tú at halda fram?';
+$lang['js']['searchmedia']     = 'Leita eftir dátufílum';
+$lang['js']['mediasize']       = 'Mynda stødd';
+$lang['js']['mediatarget']     = 'Leinkja til';
+$lang['js']['mediaclose']      = 'Læt aftur';
+$lang['js']['mediainsert']     = 'Set inn';
+$lang['js']['mediadisplayimg'] = 'Vís myndina';
+$lang['js']['mediadisplaylnk'] = 'Vís bert leinkjuna';
+$lang['js']['nosmblinks']      = 'Ávísingar til Windows shares virka bert í Microsoft Internet Explorer.
+Tú kanst enn avrita og sata inn slóðina.';
+$lang['js']['del_confirm']     = 'Strika post(ar)?';
+$lang['rssfailed']             = 'Eitt brek koma fyri tá roynt var at fáa: ';
+$lang['nothingfound']          = 'Leiting gav onki úrslit.';
+$lang['mediaselect']           = 'Vel miðlafílu';
+$lang['uploadsucc']            = 'Upp legg av fílu var væl eydna';
+$lang['uploadfail']            = 'Brek við upp legg av fílu. Tað er møguliga trupuleikar við rættindunum';
+$lang['uploadwrong']           = 'Upp legg av fílu víst burtur. Fíluslag er ikki loyvt';
+$lang['uploadexist']           = 'Fílan er longu til.';
+$lang['deletesucc']            = 'Fílan "%s" er nú strika.';
+$lang['deletefail']            = '"%s" kundi ikki strikast - kanna rættindini.';
+$lang['mediainuse']            = 'Fíla "%s" er ikki strika - hen verður enn nýtt.';
+$lang['namespaces']            = 'Navnarúm';
+$lang['mediafiles']            = 'Atkomandi fílur í';
+$lang['reference']             = 'Ávísing til';
+$lang['ref_inuse']             = 'Fílan kan ikki strikast, síðan hon enn verður nýtt á fylgjandi síðum:';
+$lang['ref_hidden']            = 'Nakrar ávísingar eru í skjølum sum tú ikki hevur lesi rættindi til';
+$lang['hits']                  = 'Hits';
+$lang['quickhits']             = 'Samsvarandi skjøl';
+$lang['toc']                   = 'Innihaldsyvirlit';
+$lang['current']               = 'núverandi';
+$lang['yours']                 = 'Tín útgáva';
+$lang['diff']                  = 'vís broytingar í mun til núverandi útgávu';
+$lang['line']                  = 'Linja';
+$lang['breadcrumb']            = 'Leið:';
+$lang['youarehere']            = 'Tú ert her:';
+$lang['lastmod']               = 'Seinast broytt:';
+$lang['by']                    = 'av';
+$lang['deleted']               = 'strika';
+$lang['created']               = 'stovna';
+$lang['restored']              = 'gomul útgáva endurstovna (%s)';
+$lang['summary']               = 'Samandráttur';
+$lang['mail_newpage']          = 'skjal skoyta uppí:';
+$lang['mail_changed']          = 'skjal broytt:';
+$lang['qb_bold']               = 'Feit';
+$lang['qb_italic']             = 'Skák';
+$lang['qb_underl']             = 'Undurstrika';
+$lang['qb_code']               = 'Skrivimaskinu tekstur';
+$lang['qb_strike']             = 'Gjøgnumstrika';
+$lang['qb_h1']                 = 'Stig 1 yvirskrift';
+$lang['qb_h2']                 = 'Stig 2 yvirskrift';
+$lang['qb_h3']                 = 'Stig 3 yvirskrift';
+$lang['qb_h4']                 = 'Stig 4 yvirskrift';
+$lang['qb_h5']                 = 'Stig 5 yvirskrift';
+$lang['qb_link']               = 'Innanhýsis slóð';
+$lang['qb_extlink']            = 'Útvortis slóð';
+$lang['qb_hr']                 = 'Vatnrætt linja';
+$lang['qb_ol']                 = 'Talmerktur listi';
+$lang['qb_ul']                 = 'Ótalmerktur listi';
+$lang['qb_media']              = 'Leggja myndir og aðrar fílur afturat';
+$lang['qb_sig']                = 'Set inn undirskrift';
+$lang['qb_smileys']            = 'Smileys';
+$lang['qb_chars']              = 'Sertekn';
+$lang['metaedit']              = 'Rætta metadáta';
+$lang['metasaveerr']           = 'Brek við skriving av metadáta';
+$lang['metasaveok']            = 'Metadáta goymt';
+$lang['btn_img_backto']            = 'Aftur til %s';
+$lang['img_title']             = 'Heitið:';
+$lang['img_caption']           = 'Myndatekstur:';
+$lang['img_date']              = 'Dato:';
+$lang['img_fname']             = 'Fílunavn:';
+$lang['img_fsize']             = 'Stødd:';
+$lang['img_artist']            = 'Myndafólk:';
+$lang['img_copyr']             = 'Upphavsrættur:';
+$lang['img_format']            = 'Snið:';
+$lang['img_camera']            = 'Fototól:';
+$lang['img_keywords']          = 'Evnisorð:';
+$lang['authtempfail']          = 'Validering av brúkara virkar fyribils ikki. Um hetta er varandi, fá so samband við umboðsstjóran á hesi wiki.';
+$lang['email_signature_text'] = 'Hesin t-postur var skaptur av DokuWiki á
+@DOKUWIKIURL@';
diff --git a/wiki/inc/lang/fo/locked.txt b/wiki/inc/lang/fo/locked.txt
new file mode 100644
index 0000000..2e65a06
--- /dev/null
+++ b/wiki/inc/lang/fo/locked.txt
@@ -0,0 +1,3 @@
+====== Læst skjal ======
+
+Hetta skjal er fyribils læst av einum øðrum brúkara. Bíða vinarliga til brúkarin er liðugur við at rætta skjali, ella at lásið er fara úr gildi.
diff --git a/wiki/inc/lang/fo/login.txt b/wiki/inc/lang/fo/login.txt
new file mode 100644
index 0000000..31a4c54
--- /dev/null
+++ b/wiki/inc/lang/fo/login.txt
@@ -0,0 +1,3 @@
+====== Rita inn ======
+
+Tú hevur ikki rita inn! Slá inn brúkaranavn og loyniorð. Tín kagi skal loyva at cookies verða goymdar fyri at tú kanst rita inn.
diff --git a/wiki/inc/lang/fo/mailtext.txt b/wiki/inc/lang/fo/mailtext.txt
new file mode 100644
index 0000000..331edfe
--- /dev/null
+++ b/wiki/inc/lang/fo/mailtext.txt
@@ -0,0 +1,12 @@
+Eitt skjal í tíni DokuWiki bleiv broytt ella skoytt uppí. Her er ein lýsing:
+
+Dato               : @DATE@
+Browser            : @BROWSER@
+IP-adressa         : @IPADDRESS@
+Hostnavn           : @HOSTNAME@
+Gomul útgáva       : @OLDPAGE@
+Nýggj útgáva       : @NEWPAGE@
+Rætti samandráttur : @SUMMARY@
+Brúkari            : @USER@
+
+@DIFF@
diff --git a/wiki/inc/lang/fo/newpage.txt b/wiki/inc/lang/fo/newpage.txt
new file mode 100644
index 0000000..6eeb1ef
--- /dev/null
+++ b/wiki/inc/lang/fo/newpage.txt
@@ -0,0 +1,3 @@
+====== Hetta skjal er ikki til (enn) ======
+
+Tú fylgdi ein ávísing til eitt skjal sum ikki er til (enn). Tú kanst stovna skjali við at trýsta á **''[Stovna hetta skjal]''** knappin.
diff --git a/wiki/inc/lang/fo/norev.txt b/wiki/inc/lang/fo/norev.txt
new file mode 100644
index 0000000..d0b463a
--- /dev/null
+++ b/wiki/inc/lang/fo/norev.txt
@@ -0,0 +1,4 @@
+====== Valda útgávan er ikki til ======
+
+Valda útgávan av skjalinum er ikki til! Trýst á knappin **''[Gamlar útgávur]''** fyri at síggja ein lista yvur gamlar útgávur av hesum skjali.
+
diff --git a/wiki/inc/lang/fo/password.txt b/wiki/inc/lang/fo/password.txt
new file mode 100644
index 0000000..df8b6e7
--- /dev/null
+++ b/wiki/inc/lang/fo/password.txt
@@ -0,0 +1,6 @@
+Hey @FULLNAME@!
+
+Her eru tínar brúkaraupplýsingar @TITLE@ at @DOKUWIKIURL@
+
+Brúkaranavn : @LOGIN@
+Loyniorð    : @PASSWORD@
diff --git a/wiki/inc/lang/fo/preview.txt b/wiki/inc/lang/fo/preview.txt
new file mode 100644
index 0000000..e3e65d8
--- /dev/null
+++ b/wiki/inc/lang/fo/preview.txt
@@ -0,0 +1,4 @@
+====== Forskoðan ======
+
+Hetta er ein forskoðan skjalinum, sum vísur hvussi tað fer at síggja út. Minst til: Tað er //**IKKI**// goymt enn! Um tað sær rætt út, trýst so á **''[Goym]''** knappin
+
diff --git a/wiki/inc/lang/fo/read.txt b/wiki/inc/lang/fo/read.txt
new file mode 100644
index 0000000..bacf790
--- /dev/null
+++ b/wiki/inc/lang/fo/read.txt
@@ -0,0 +1,2 @@
+Hetta skjal kan bert læsast. Tú kanst síggja kelduna, men ikki goyma  broytingar í tí. Um tú heldur at hetta er eitt brek, skriva so vinarliga í [[wiki:brek-yvirlit]].
+
diff --git a/wiki/inc/lang/fo/recent.txt b/wiki/inc/lang/fo/recent.txt
new file mode 100644
index 0000000..4704f37
--- /dev/null
+++ b/wiki/inc/lang/fo/recent.txt
@@ -0,0 +1,5 @@
+====== Nýggjar broytingar ======
+
+Fylgjandi skjøl er broytt nýliga.
+
+
diff --git a/wiki/inc/lang/fo/register.txt b/wiki/inc/lang/fo/register.txt
new file mode 100644
index 0000000..24438af
--- /dev/null
+++ b/wiki/inc/lang/fo/register.txt
@@ -0,0 +1,4 @@
+====== Upprætta eina wiki-konti ======
+
+Fylla út niðanfyrista skema fyri at upprætta eina konti í hesu wiki. Minst til at nýta eina **galdandi t-post-adressu** - títt loyniorð verður sent til tín. Títt brúkaranavn skal verða galdandi [[doku>pagename|skjalanavn]].
+
diff --git a/wiki/inc/lang/fo/resendpwd.txt b/wiki/inc/lang/fo/resendpwd.txt
new file mode 100644
index 0000000..450202c
--- /dev/null
+++ b/wiki/inc/lang/fo/resendpwd.txt
@@ -0,0 +1,3 @@
+====== Send nýtt loyniorð ======
+
+Fyll út øll niðanfyristandandi øki fyri at fáa sent eitt nýtt loyniorð til hesa wiki. Títt nýggja loyniorð verður sent til tí uppgivnu t-postadressu. Brúkaranavn eigur at verða títt wiki brúkaranavn.
diff --git a/wiki/inc/lang/fo/revisions.txt b/wiki/inc/lang/fo/revisions.txt
new file mode 100644
index 0000000..dcd845c
--- /dev/null
+++ b/wiki/inc/lang/fo/revisions.txt
@@ -0,0 +1,3 @@
+====== Gamlar útgávur ======
+
+Her eru tær gomlu útgávurnar av hesum skalinum. Tú kanst venda aftur til eina eldri útgávu av skjalinum við at velja tað niðanfyri, trýst á **''[Rætta hetta skjal]''** knappin, og til síðst goyma skjali.
diff --git a/wiki/inc/lang/fo/searchpage.txt b/wiki/inc/lang/fo/searchpage.txt
new file mode 100644
index 0000000..896102b
--- /dev/null
+++ b/wiki/inc/lang/fo/searchpage.txt
@@ -0,0 +1,4 @@
+====== Leiting ======
+
+Tú kanst síggja úrslitini av tíni leiting niðanfyri. @CREATEPAGEINFO@
+
diff --git a/wiki/inc/lang/fo/showrev.txt b/wiki/inc/lang/fo/showrev.txt
new file mode 100644
index 0000000..515f80a
--- /dev/null
+++ b/wiki/inc/lang/fo/showrev.txt
@@ -0,0 +1,2 @@
+**Hetta er ein gomul útgáva av skjalinum!**
+----
diff --git a/wiki/inc/lang/fo/stopwords.txt b/wiki/inc/lang/fo/stopwords.txt
new file mode 100644
index 0000000..210e859
--- /dev/null
+++ b/wiki/inc/lang/fo/stopwords.txt
@@ -0,0 +1,87 @@
+# This is a list of words the indexer ignores, one word per line
+# When you edit this file be sure to use UNIX line endings (single newline)
+# No need to include words shorter than 3 chars - these are ignored anyway
+# This list is based upon the ones found at http://www.ranks.nl/stopwords/
+annar
+báðir
+eg
+eingin
+einhvør
+eini
+eitt
+ella
+enn
+fim
+fleiri
+flestir
+frá
+fyri
+fyrr
+fýra
+góður
+hann
+hansara
+har
+hendan
+hennara
+her
+hetta
+hevur
+hon
+hvar
+hvat
+hvussi
+hví
+hvør
+ikki
+inn
+kan
+koma
+lítil
+man
+maður
+meira
+men
+miðan
+niður
+nær
+næstan
+næsti
+nógv
+nýtt
+okkurt
+ongin
+onki
+onkur
+seks
+sindur
+sjey
+smáur
+stórur
+større
+størst
+sum
+síggjast
+tann
+tað
+teir
+tey
+til
+tríggir
+trý
+tvey
+tykkara
+tær
+tí
+tín
+tó
+tú
+um
+undan
+var
+vera
+við
+yvur
+átta
+áðrenn
+øll
diff --git a/wiki/inc/lang/fo/subscr_digest.txt b/wiki/inc/lang/fo/subscr_digest.txt
new file mode 100644
index 0000000..ff76e53
--- /dev/null
+++ b/wiki/inc/lang/fo/subscr_digest.txt
@@ -0,0 +1,16 @@
+Halló!
+
+Síðan @PAGE@ í @TITLE@ wiki er broytt.
+Her eru broytinganar:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Gamla skjalið: @OLDPAGE@
+Nýggja skjalið: @NEWPAGE@
+
+Fyri at avmelda síðu kunngerðir, logga inn í wikiina á
+@DOKUWIKIURL@ vitja so
+@SUBSCRIBE@
+og avmelda hald á síðu og/ella navnaøkis broytingar.
diff --git a/wiki/inc/lang/fo/updateprofile.txt b/wiki/inc/lang/fo/updateprofile.txt
new file mode 100644
index 0000000..10ee40d
--- /dev/null
+++ b/wiki/inc/lang/fo/updateprofile.txt
@@ -0,0 +1,3 @@
+====== Dagføra vangamynd fyri tína konti ======
+
+Tú nýtist bert at fylla út tey øki sum tú ynskjur at broyta. Tú kanst ikki broyta títt brúkaranavn.
diff --git a/wiki/inc/lang/fr/admin.txt b/wiki/inc/lang/fr/admin.txt
new file mode 100644
index 0000000..eeeb231
--- /dev/null
+++ b/wiki/inc/lang/fr/admin.txt
@@ -0,0 +1,3 @@
+====== Administration ======
+
+Ci-dessous, vous trouverez une liste des tâches d'administration disponibles dans DokuWiki.
diff --git a/wiki/inc/lang/fr/adminplugins.txt b/wiki/inc/lang/fr/adminplugins.txt
new file mode 100644
index 0000000..0b2bf18
--- /dev/null
+++ b/wiki/inc/lang/fr/adminplugins.txt
@@ -0,0 +1 @@
+===== Extensions ===== 
\ No newline at end of file
diff --git a/wiki/inc/lang/fr/backlinks.txt b/wiki/inc/lang/fr/backlinks.txt
new file mode 100644
index 0000000..8e6d27d
--- /dev/null
+++ b/wiki/inc/lang/fr/backlinks.txt
@@ -0,0 +1,4 @@
+====== Pages pointant sur la page en cours ======
+
+Ceci est la liste des pages qui semblent pointer sur la page actuelle.
+
diff --git a/wiki/inc/lang/fr/conflict.txt b/wiki/inc/lang/fr/conflict.txt
new file mode 100644
index 0000000..e34ec97
--- /dev/null
+++ b/wiki/inc/lang/fr/conflict.txt
@@ -0,0 +1,6 @@
+====== Une version plus récente existe ======
+
+Une version plus récente du document que vous avez modifié existe. Cela se produit lorsqu'un autre utilisateur enregistre une nouvelle version du document alors que vous le modifiez.
+
+Examinez attentivement les différences ci-dessous et décidez quelle version conserver. Si vous choisissez « Enregistrer », votre version sera enregistrée. Cliquez sur « Annuler » pour conserver la version actuelle.
+
diff --git a/wiki/inc/lang/fr/denied.txt b/wiki/inc/lang/fr/denied.txt
new file mode 100644
index 0000000..6de1930
--- /dev/null
+++ b/wiki/inc/lang/fr/denied.txt
@@ -0,0 +1,4 @@
+====== Autorisation refusée ======
+
+Désolé, vous n'avez pas suffisamment d'autorisations pour poursuivre votre demande.
+
diff --git a/wiki/inc/lang/fr/diff.txt b/wiki/inc/lang/fr/diff.txt
new file mode 100644
index 0000000..d1230cc
--- /dev/null
+++ b/wiki/inc/lang/fr/diff.txt
@@ -0,0 +1,4 @@
+====== Différences ======
+
+Ci-dessous, les différences entre deux révisions de la page.
+
diff --git a/wiki/inc/lang/fr/draft.txt b/wiki/inc/lang/fr/draft.txt
new file mode 100644
index 0000000..44cb4e3
--- /dev/null
+++ b/wiki/inc/lang/fr/draft.txt
@@ -0,0 +1,6 @@
+====== Un fichier brouillon existe ======
+
+La dernière modification de cette page ne s'est pas terminée correctement. DokuWiki a enregistré automatiquement un brouillon de votre travail que vous pouvez utiliser pour votre modification. Ci-dessous figurent les données enregistrées lors de votre dernière session.
+
+À vous de décider si vous souhaitez //récupérer// votre session de modification précédente, //supprimer// le brouillon enregistré automatiquement ou //annuler// le processus d'édition.
+
diff --git a/wiki/inc/lang/fr/edit.txt b/wiki/inc/lang/fr/edit.txt
new file mode 100644
index 0000000..df8c9fc
--- /dev/null
+++ b/wiki/inc/lang/fr/edit.txt
@@ -0,0 +1,2 @@
+Modifiez cette page et cliquez sur « Enregistrer ». Voyez le [[:wiki:syntax|guide de mise en page]] pour une aide à propos du formatage. Veuillez ne modifier cette page que si vous pouvez l'**améliorer**. Si vous souhaitez faire des tests, faites vos premiers pas dans le [[:playground:playground|bac à sable]].
+
diff --git a/wiki/inc/lang/fr/editrev.txt b/wiki/inc/lang/fr/editrev.txt
new file mode 100644
index 0000000..d3fa366
--- /dev/null
+++ b/wiki/inc/lang/fr/editrev.txt
@@ -0,0 +1,2 @@
+**Vous affichez une ancienne révision du document !** Si vous l'enregistrez, vous créerez une nouvelle version avec ce contenu.
+----
diff --git a/wiki/inc/lang/fr/index.txt b/wiki/inc/lang/fr/index.txt
new file mode 100644
index 0000000..15e1673
--- /dev/null
+++ b/wiki/inc/lang/fr/index.txt
@@ -0,0 +1,4 @@
+====== Plan du site ======
+
+Voici un plan du site de toutes les pages disponibles, triées par [[doku>fr:namespaces|catégories]].
+
diff --git a/wiki/inc/lang/fr/install.html b/wiki/inc/lang/fr/install.html
new file mode 100644
index 0000000..6dcba25
--- /dev/null
+++ b/wiki/inc/lang/fr/install.html
@@ -0,0 +1,13 @@
+<p>Cette page vous assiste dans l'installation et la
+configuration de <a href="http://dokuwiki.org">DokuWiki</a>.
+Pour plus d'informations sur cet installateur, reportez-vous à sa
+<a href="http://dokuwiki.org/installer">page de
+documentation</a>.</p>
+
+<p>DokuWiki utilise des fichiers textes ordinaires pour stocker les pages du
+wiki et les autres informations associées à ces pages
+(par exemple, les images, les index de recherche, les anciennes révisions, ...). Pour fonctionner correctement, DokuWiki <strong>doit</strong> avoir accès en écriture aux différents répertoires qui contiennent ces fichiers. Cet installateur n'est pas capable de modifier les autorisations sur les répertoires. Cette opération doit-être effectué directement depuis votre ligne de commande shell, ou, si vous êtes hébergé, <em>via</em> FTP ou votre panneau de contrôle (par exemple cPanel, Plesk, ...).</p>
+
+<p>Cet installateur va paramétrer votre configuration de DokuWiki pour des contrôle d'accès (ACL), qui permettront l'accès à un identifiant administrateur et l'accès au menu d'administration de DokuWiki pour l'ajout d'extensions, la gestion d'utilisateurs, la gestion de l'accès aux pages du wiki et les modifications des paramètres de configuration. Les contrôle d'accès ne sont pas nécessaires au fonctionnement de DokuWiki, néanmoins elles facilitent l'administration de DokuWiki.</p>
+
+<p>Les utilisateurs expérimentés ou les utilisateurs possédants des besoins de configurations spécifiques devraient se reporter aux liens suivants pour les détails concernant les <a href="http://dokuwiki.org/install">instructions d'installation</a> et les <a href="http://dokuwiki.org/config">paramètres de configuration</a>.</p>
diff --git a/wiki/inc/lang/fr/jquery.ui.datepicker.js b/wiki/inc/lang/fr/jquery.ui.datepicker.js
new file mode 100644
index 0000000..9e39fbd
--- /dev/null
+++ b/wiki/inc/lang/fr/jquery.ui.datepicker.js
@@ -0,0 +1,39 @@
+/* French initialisation for the jQuery UI date picker plugin. */
+/* Written by Keith Wood (kbwood{at}iinet.com.au),
+			  Stéphane Nahmani (sholby@sholby.net),
+			  Stéphane Raimbault <stephane.raimbault@gmail.com> */
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "../widgets/datepicker" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery.datepicker );
+	}
+}( function( datepicker ) {
+
+datepicker.regional.fr = {
+	closeText: "Fermer",
+	prevText: "Précédent",
+	nextText: "Suivant",
+	currentText: "Aujourd'hui",
+	monthNames: [ "janvier", "février", "mars", "avril", "mai", "juin",
+		"juillet", "août", "septembre", "octobre", "novembre", "décembre" ],
+	monthNamesShort: [ "janv.", "févr.", "mars", "avr.", "mai", "juin",
+		"juil.", "août", "sept.", "oct.", "nov.", "déc." ],
+	dayNames: [ "dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi" ],
+	dayNamesShort: [ "dim.", "lun.", "mar.", "mer.", "jeu.", "ven.", "sam." ],
+	dayNamesMin: [ "D","L","M","M","J","V","S" ],
+	weekHeader: "Sem.",
+	dateFormat: "dd/mm/yy",
+	firstDay: 1,
+	isRTL: false,
+	showMonthAfterYear: false,
+	yearSuffix: "" };
+datepicker.setDefaults( datepicker.regional.fr );
+
+return datepicker.regional.fr;
+
+} ) );
diff --git a/wiki/inc/lang/fr/lang.php b/wiki/inc/lang/fr/lang.php
new file mode 100644
index 0000000..8cf396c
--- /dev/null
+++ b/wiki/inc/lang/fr/lang.php
@@ -0,0 +1,389 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Damien Regad <dregad@mantisbt.org>
+ * @author Schplurtz le Déboulonné <Schplurtz@laposte.net>
+ * @author Michael Bohn <mjbohn@gmail.com>
+ * @author Sébastien Bauer <sebastien.bauer@advalvas.be>
+ * @author Antoine Fixary <antoine.fixary@freesbee.fr>
+ * @author cumulus <pta-n56@myamail.com>
+ * @author Gwenn Gueguen <contact@demisel.net>
+ * @author Guy Brand <gb@unistra.fr>
+ * @author Fabien Chabreuil <fabien@integralpersonality.com>
+ * @author Stéphane Chamberland <stephane.chamberland@ec.gc.ca>
+ * @author Delassaux Julien <julien@delassaux.fr>
+ * @author Maurice A. LeBlanc <leblancma@cooptel.qc.ca>
+ * @author stephane.gully <stephane.gully@gmail.com>
+ * @author Guillaume Turri <guillaume.turri@gmail.com>
+ * @author Erik Pedersen <erik.pedersen@shaw.ca>
+ * @author olivier duperray <duperray.olivier@laposte.net>
+ * @author Vincent Feltz <psycho@feltzv.fr>
+ * @author Philippe Bajoit <philippe.bajoit@gmail.com>
+ * @author Florian Gaub <floriang@floriang.net>
+ * @author Samuel Dorsaz <samuel.dorsaz@novelion.net>
+ * @author Johan Guilbaud <guilbaud.johan@gmail.com>
+ * @author Yannick Aure <yannick.aure@gmail.com>
+ * @author Olivier DUVAL <zorky00@gmail.com>
+ * @author Anael Mobilia <contrib@anael.eu>
+ * @author Bruno Veilleux <bruno.vey@gmail.com>
+ * @author Emmanuel <seedfloyd@gmail.com>
+ * @author Jérôme Brandt <jeromebrandt@gmail.com>
+ * @author Wild <wild.dagger@free.fr>
+ * @author ggallon <gwenael.gallon@mac.com>
+ * @author David VANTYGHEM <david.vantyghem@free.fr>
+ * @author Caillot <remicaillot5@gmail.com>
+ * @author YoBoY <yoboy@ubuntu-fr.org>
+ * @author james <j.mccann@celcat.com>
+ * @author Pietroni <pietroni@informatique.univ-paris-diderot.fr>
+ * @author Floriang <antispam@floriang.eu>
+ * @author Eric <ericstevenart@netc.fr>
+ * @author Olivier Humbert <trebmuh@tuxfamily.org>
+ */
+$lang['encoding']              = 'utf-8';
+$lang['direction']             = 'ltr';
+$lang['doublequoteopening']    = '“';
+$lang['doublequoteclosing']    = '”';
+$lang['singlequoteopening']    = '‘';
+$lang['singlequoteclosing']    = '’';
+$lang['apostrophe']            = '’';
+$lang['btn_edit']              = 'Modifier cette page';
+$lang['btn_source']            = 'Afficher le texte source';
+$lang['btn_show']              = 'Afficher la page';
+$lang['btn_create']            = 'Créer cette page';
+$lang['btn_search']            = 'Rechercher';
+$lang['btn_save']              = 'Enregistrer';
+$lang['btn_preview']           = 'Aperçu';
+$lang['btn_top']               = 'Haut de page';
+$lang['btn_newer']             = '<< Plus récent';
+$lang['btn_older']             = 'Moins récent >>';
+$lang['btn_revs']              = 'Anciennes révisions';
+$lang['btn_recent']            = 'Derniers changements';
+$lang['btn_upload']            = 'Téléverser';
+$lang['btn_cancel']            = 'Annuler';
+$lang['btn_index']             = 'Plan du site';
+$lang['btn_secedit']           = 'Modifier';
+$lang['btn_login']             = 'S\'identifier';
+$lang['btn_logout']            = 'Se déconnecter';
+$lang['btn_admin']             = 'Administrer';
+$lang['btn_update']            = 'Mettre à jour';
+$lang['btn_delete']            = 'Effacer';
+$lang['btn_back']              = 'Retour';
+$lang['btn_backlink']          = 'Liens de retour';
+$lang['btn_subscribe']         = 'Gérer les abonnements';
+$lang['btn_profile']           = 'Mettre à jour le profil';
+$lang['btn_reset']             = 'Réinitialiser';
+$lang['btn_resendpwd']         = 'Définir un nouveau mot de passe';
+$lang['btn_draft']             = 'Modifier le brouillon';
+$lang['btn_recover']           = 'Récupérer le brouillon';
+$lang['btn_draftdel']          = 'Effacer le brouillon';
+$lang['btn_revert']            = 'Restaurer';
+$lang['btn_register']          = 'Créer un compte';
+$lang['btn_apply']             = 'Appliquer';
+$lang['btn_media']             = 'Gestionnaire Multimédia';
+$lang['btn_deleteuser']        = 'Supprimer mon compte';
+$lang['btn_img_backto']        = 'Retour vers %s';
+$lang['btn_mediaManager']      = 'Voir dans le gestionnaire de médias';
+$lang['loggedinas']            = 'Connecté en tant que :';
+$lang['user']                  = 'Utilisateur';
+$lang['pass']                  = 'Mot de passe';
+$lang['newpass']               = 'Nouveau mot de passe';
+$lang['oldpass']               = 'Mot de passe actuel';
+$lang['passchk']               = 'Répétez le mot de passe';
+$lang['remember']              = 'Mémoriser';
+$lang['fullname']              = 'Nom';
+$lang['email']                 = 'Adresse de courriel';
+$lang['profile']               = 'Profil utilisateur';
+$lang['badlogin']              = 'Le nom d\'utilisateur ou le mot de passe est incorrect.';
+$lang['badpassconfirm']        = 'Désolé, le mot de passe est erroné';
+$lang['minoredit']             = 'Modification mineure';
+$lang['draftdate']             = 'Brouillon enregistré automatiquement le';
+$lang['nosecedit']             = 'La page a changé entre temps, les informations de la section sont obsolètes ; la page complète a été chargée à la place.';
+$lang['searchcreatepage']      = 'Si vous ne trouvez pas ce que vous cherchiez, vous pouvez créer ou éditer la page %s, nommée selon les termes de votre recherche.';
+$lang['search_fullresults']    = 'Résultats plein texte';
+$lang['js']['search_toggle_tools'] = '(dé)activer les outils de recherche';
+$lang['js']['willexpire']      = 'Votre blocage pour la modification de cette page expire dans une minute.\nPour éviter les conflits, utilisez le bouton « Aperçu » pour réinitialiser le minuteur.';
+$lang['js']['notsavedyet']     = 'Les modifications non enregistrées seront perdues. Voulez-vous vraiment continuer ?';
+$lang['js']['searchmedia']     = 'Chercher des fichiers';
+$lang['js']['keepopen']        = 'Toujours conserver cette fenêtre ouverte';
+$lang['js']['hidedetails']     = 'Masquer les détails';
+$lang['js']['mediatitle']      = 'Paramètres de lien';
+$lang['js']['mediadisplay']    = 'Type de lien';
+$lang['js']['mediaalign']      = 'Alignement';
+$lang['js']['mediasize']       = 'Taille de l\'image';
+$lang['js']['mediatarget']     = 'Cible du lien';
+$lang['js']['mediaclose']      = 'Fermer';
+$lang['js']['mediainsert']     = 'Insérer';
+$lang['js']['mediadisplayimg'] = 'Afficher l\'image.';
+$lang['js']['mediadisplaylnk'] = 'N\'afficher que le lien.';
+$lang['js']['mediasmall']      = 'Petite taille';
+$lang['js']['mediamedium']     = 'Taille moyenne';
+$lang['js']['medialarge']      = 'Grande taille';
+$lang['js']['mediaoriginal']   = 'Taille originelle';
+$lang['js']['medialnk']        = 'Lien vers la page de détail';
+$lang['js']['mediadirect']     = 'Lien direct vers l\'original';
+$lang['js']['medianolnk']      = 'Aucun lien';
+$lang['js']['medianolink']     = 'Ne pas lier l\'image';
+$lang['js']['medialeft']       = 'Aligner l\'image à gauche.';
+$lang['js']['mediaright']      = 'Aligner l\'image à droite.';
+$lang['js']['mediacenter']     = 'Centrer l\'image.';
+$lang['js']['medianoalign']    = 'Ne pas aligner.';
+$lang['js']['nosmblinks']      = 'Les liens vers les partages Windows ne fonctionnent qu\'avec Microsoft Internet Explorer.\nVous pouvez toujours copier puis coller le lien.';
+$lang['js']['linkwiz']         = 'Assistant Lien';
+$lang['js']['linkto']          = 'Lien vers :';
+$lang['js']['del_confirm']     = 'Voulez-vous vraiment effacer ce(s) élément(s) ?';
+$lang['js']['restore_confirm'] = 'Voulez-vous vraiment restaurer cette version ?';
+$lang['js']['media_diff']      = 'Voir les différences :';
+$lang['js']['media_diff_both'] = 'Côte à côte';
+$lang['js']['media_diff_opacity'] = 'Calque';
+$lang['js']['media_diff_portions'] = 'Curseur';
+$lang['js']['media_select']    = 'Sélection de fichiers…';
+$lang['js']['media_upload_btn'] = 'Envoyer';
+$lang['js']['media_done_btn']  = 'Terminé';
+$lang['js']['media_drop']      = 'Déposez des fichiers ici pour les envoyer';
+$lang['js']['media_cancel']    = 'supprimer';
+$lang['js']['media_overwrt']   = 'Écraser les fichiers existants';
+$lang['search_exact_match']    = 'Correspondance exacte';
+$lang['search_starts_with']    = 'Commence par';
+$lang['search_ends_with']      = 'Se termine par';
+$lang['search_contains']       = 'Contient';
+$lang['search_custom_match']   = 'personnalisé';
+$lang['search_any_ns']         = 'toute catégorie';
+$lang['search_any_time']       = 'toute date';
+$lang['search_past_7_days']    = 'la semaine dernière';
+$lang['search_past_month']     = 'le mois dernier';
+$lang['search_past_year']      = 'l\'année dernière';
+$lang['search_sort_by_hits']   = 'Trier par nombre de résultats';
+$lang['search_sort_by_mtime']  = 'Trier par date de modification';
+$lang['regmissing']            = 'Désolé, vous devez remplir tous les champs.';
+$lang['reguexists']            = 'Désolé, ce nom d\'utilisateur est déjà pris.';
+$lang['regsuccess']            = 'L\'utilisateur a été créé. Le mot de passe a été expédié par courriel.';
+$lang['regsuccess2']           = 'L\'utilisateur a été créé.';
+$lang['regfail']               = 'L\'utilisateur n\'a pu être crée.';
+$lang['regmailfail']           = 'On dirait qu\'il y a eu une erreur lors de l\'envoi du mot de passe de messagerie. Veuillez contacter l\'administrateur !';
+$lang['regbadmail']            = 'L\'adresse de courriel semble incorrecte. Si vous pensez que c\'est une erreur, contactez l\'administrateur.';
+$lang['regbadpass']            = 'Les deux mots de passe fournis sont différents, veuillez recommencez.';
+$lang['regpwmail']             = 'Votre mot de passe DokuWiki';
+$lang['reghere']               = 'Vous n\'avez pas encore de compte ? Inscrivez-vous';
+$lang['profna']                = 'Ce wiki ne permet pas de modifier les profils';
+$lang['profnochange']          = 'Pas de modification, rien à faire.';
+$lang['profnoempty']           = 'Un nom ou une adresse de courriel vide n\'est pas permis.';
+$lang['profchanged']           = 'Mise à jour du profil réussie.';
+$lang['profnodelete']          = 'Ce wiki ne permet pas la suppression des utilisateurs';
+$lang['profdeleteuser']        = 'Supprimer le compte';
+$lang['profdeleted']           = 'Votre compte utilisateur a été supprimé de ce wiki';
+$lang['profconfdelete']        = 'Je veux supprimer mon compte sur ce wiki. </br> Cette action est irréversible.';
+$lang['profconfdeletemissing'] = 'La case de confirmation n\'est pas cochée';
+$lang['proffail']              = 'Le profil utilisateur n\'a pas été mis à jour.';
+$lang['pwdforget']             = 'Mot de passe oublié ? Obtenez-en un nouveau';
+$lang['resendna']              = 'Ce wiki ne permet pas le renvoi de mot de passe.';
+$lang['resendpwd']             = 'Définir un nouveau mot de passe pour';
+$lang['resendpwdmissing']      = 'Désolé, vous devez remplir tous les champs.';
+$lang['resendpwdnouser']       = 'Désolé, cet utilisateur n\'existe pas dans notre base de données.';
+$lang['resendpwdbadauth']      = 'Désolé, ce code d\'authentification est invalide. Assurez-vous d\'avoir utilisé le lien de confirmation intégral.';
+$lang['resendpwdconfirm']      = 'Un lien de confirmation vous a été expédié par courriel.';
+$lang['resendpwdsuccess']      = 'Votre nouveau mot de passe vous a été expédié par courriel.';
+$lang['license']               = 'Sauf mention contraire, le contenu de ce wiki est placé sous les termes de la licence suivante :';
+$lang['licenseok']             = 'Note : En modifiant cette page, vous acceptez que le contenu soit placé sous les termes de la licence suivante :';
+$lang['searchmedia']           = 'Chercher le nom de fichier :';
+$lang['searchmedia_in']        = 'Chercher dans %s';
+$lang['txt_upload']            = 'Sélectionnez un fichier à envoyer:';
+$lang['txt_filename']          = 'Envoyer en tant que (optionnel):';
+$lang['txt_overwrt']           = 'Écraser le fichier cible (s\'il existe)';
+$lang['maxuploadsize']         = 'Taille d\'envoi maximale : %s par fichier';
+$lang['lockedby']              = 'Actuellement bloqué par:';
+$lang['lockexpire']            = 'Le blocage expire à:';
+$lang['rssfailed']             = 'Une erreur s\'est produite en récupérant ce flux : ';
+$lang['nothingfound']          = 'Pas de réponse.';
+$lang['mediaselect']           = 'Sélection de fichiers';
+$lang['uploadsucc']            = 'Envoi réussi';
+$lang['uploadfail']            = 'L\'envoi a échoué. Les autorisations sont-elles correctes ?';
+$lang['uploadwrong']           = 'Envoi refusé. Cette extension de fichier est interdite !';
+$lang['uploadexist']           = 'Le fichier existe déjà. L\'envoi a été annulé.';
+$lang['uploadbadcontent']      = 'Le contenu envoyé ne correspond pas à l\'extension du fichier (%s).';
+$lang['uploadspam']            = 'L\'envoi a été bloqué par la liste noire de l\'anti-spam.';
+$lang['uploadxss']             = 'L\'envoi a été bloqué car son contenu est peut-être malveillant.';
+$lang['uploadsize']            = 'Le fichier envoyé était trop gros. (max. : %s)';
+$lang['deletesucc']            = 'Le fichier « %s » a été effacé.';
+$lang['deletefail']            = 'Le fichier « %s » n\'a pas pu être effacé. Vérifiez les autorisations.';
+$lang['mediainuse']            = 'Le fichier « %s » n\'a pas été effacé : il est en toujours utilisé.';
+$lang['namespaces']            = 'Catégories';
+$lang['mediafiles']            = 'Fichiers disponibles dans';
+$lang['accessdenied']          = 'Vous n\'êtes pas autorisé à voir cette page.';
+$lang['mediausage']            = 'Utilisez la syntaxe suivante pour faire référence à ce fichier :';
+$lang['mediaview']             = 'Afficher le fichier original';
+$lang['mediaroot']             = 'racine';
+$lang['mediaupload']           = 'Envoyez un fichier dans la catégorie actuelle. Pour créer des sous-catégories, préfixez en le nom du fichier séparées par un double-point, après avoir choisis le(s) fichier(s). Le(s) fichier(s) peuvent également être envoyé(s) par glisser-déposer (drag &amp; drop)';
+$lang['mediaextchange']        = 'Extension du fichier modifiée de .%s en .%s !';
+$lang['reference']             = 'Utilisé par';
+$lang['ref_inuse']             = 'Le fichier ne peut être effacé car il est toujours utilisé par les pages suivantes :';
+$lang['ref_hidden']            = 'Des références sont présentes dans des pages que vous ne pouvez pas voir (autorisations insuffisantes)';
+$lang['hits']                  = 'Occurrences trouvées';
+$lang['quickhits']             = 'Pages trouvées ';
+$lang['toc']                   = 'Table des matières';
+$lang['current']               = 'Version actuelle';
+$lang['yours']                 = 'Votre version';
+$lang['diff']                  = 'Différences avec la version actuelle';
+$lang['diff2']                 = 'Différences entre les versions sélectionnées';
+$lang['difflink']              = 'Lien vers cette vue comparative';
+$lang['diff_type']             = 'Voir les différences :';
+$lang['diff_inline']           = 'Sur une seule ligne';
+$lang['diff_side']             = 'Côte à côte';
+$lang['diffprevrev']           = 'Révision précédente';
+$lang['diffnextrev']           = 'Prochaine révision';
+$lang['difflastrev']           = 'Dernière révision';
+$lang['diffbothprevrev']       = 'Les deux révisions précédentes';
+$lang['diffbothnextrev']       = 'Les deux révisions suivantes';
+$lang['line']                  = 'Ligne';
+$lang['breadcrumb']            = 'Piste:';
+$lang['youarehere']            = 'Vous êtes ici:';
+$lang['lastmod']               = 'Dernière modification:';
+$lang['by']                    = 'par';
+$lang['deleted']               = 'supprimée';
+$lang['created']               = 'créée';
+$lang['restored']              = 'ancienne révision (%s) restaurée';
+$lang['external_edit']         = 'modification externe';
+$lang['summary']               = 'Résumé';
+$lang['noflash']               = 'L\'<a href="http://www.adobe.com/products/flashplayer/">extension Adobe Flash</a> est nécessaire pour afficher ce contenu.';
+$lang['download']              = 'Télécharger cet extrait';
+$lang['tools']                 = 'Outils';
+$lang['user_tools']            = 'Outils pour utilisateurs';
+$lang['site_tools']            = 'Outils du site';
+$lang['page_tools']            = 'Outils de la page';
+$lang['skip_to_content']       = 'Aller au contenu';
+$lang['sidebar']               = 'Panneau latéral';
+$lang['mail_newpage']          = 'page ajoutée :';
+$lang['mail_changed']          = 'page modifiée :';
+$lang['mail_subscribe_list']   = 'pages modifiées dans la catégorie :';
+$lang['mail_new_user']         = 'nouvel utilisateur :';
+$lang['mail_upload']           = 'fichier envoyé :';
+$lang['changes_type']          = 'Voir les changements';
+$lang['pages_changes']         = 'Pages';
+$lang['media_changes']         = 'Fichiers multimédias';
+$lang['both_changes']          = 'Pages et fichiers multimédias';
+$lang['qb_bold']               = 'Gras';
+$lang['qb_italic']             = 'Italique';
+$lang['qb_underl']             = 'Soulignage';
+$lang['qb_code']               = 'Code « machine à écrire »';
+$lang['qb_strike']             = 'Barré';
+$lang['qb_h1']                 = 'Titre de niveau 1';
+$lang['qb_h2']                 = 'Titre de niveau 2';
+$lang['qb_h3']                 = 'Titre de niveau 3';
+$lang['qb_h4']                 = 'Titre de niveau 4';
+$lang['qb_h5']                 = 'Titre de niveau 5';
+$lang['qb_h']                  = 'Titre';
+$lang['qb_hs']                 = 'Sélectionner la ligne de titre';
+$lang['qb_hplus']              = 'Titre de niveau supérieur';
+$lang['qb_hminus']             = 'Titre de niveau inférieur';
+$lang['qb_hequal']             = 'Titre de même niveau';
+$lang['qb_link']               = 'Lien interne';
+$lang['qb_extlink']            = 'Lien externe';
+$lang['qb_hr']                 = 'Ligne horizontale';
+$lang['qb_ol']                 = 'Liste numérotée';
+$lang['qb_ul']                 = 'Liste à puce';
+$lang['qb_media']              = 'Ajouter des images ou autres fichiers';
+$lang['qb_sig']                = 'Insérer une signature';
+$lang['qb_smileys']            = 'Émoticones';
+$lang['qb_chars']              = 'Caractères spéciaux';
+$lang['upperns']               = 'Aller à la catégorie parente';
+$lang['metaedit']              = 'Modifier les métadonnées';
+$lang['metasaveerr']           = 'Erreur lors de l\'enregistrement des métadonnées';
+$lang['metasaveok']            = 'Métadonnées enregistrées';
+$lang['img_title']             = 'Titre:';
+$lang['img_caption']           = 'Légende:';
+$lang['img_date']              = 'Date:';
+$lang['img_fname']             = 'Nom de fichier:';
+$lang['img_fsize']             = 'Taille:';
+$lang['img_artist']            = 'Photographe:';
+$lang['img_copyr']             = 'Copyright:';
+$lang['img_format']            = 'Format:';
+$lang['img_camera']            = 'Appareil photo:';
+$lang['img_keywords']          = 'Mots-clés:';
+$lang['img_width']             = 'Largeur:';
+$lang['img_height']            = 'Hauteur:';
+$lang['subscr_subscribe_success'] = '%s a été ajouté à la liste des abonnés de %s';
+$lang['subscr_subscribe_error'] = 'Erreur à l\'ajout de %s à la liste des abonnés de %s';
+$lang['subscr_subscribe_noaddress'] = 'Il n\'y a pas d\'adresse associée à votre identifiant, vous ne pouvez pas être ajouté à la liste des abonnés.';
+$lang['subscr_unsubscribe_success'] = '%s a été supprimé de la liste des abonnés de %s';
+$lang['subscr_unsubscribe_error'] = 'Erreur au retrait de %s de la liste des abonnés de %s';
+$lang['subscr_already_subscribed'] = '%s est déjà abonné à %s';
+$lang['subscr_not_subscribed'] = '%s n\'est pas abonné à %s';
+$lang['subscr_m_not_subscribed'] = 'Vous n\'êtes pour l\'instant pas abonné à la page actuelle ou à la catégorie';
+$lang['subscr_m_new_header']   = 'Ajouter un abonnement';
+$lang['subscr_m_current_header'] = 'Abonnements actifs';
+$lang['subscr_m_unsubscribe']  = 'Annuler l\'abonnement';
+$lang['subscr_m_subscribe']    = 'S\'abonner';
+$lang['subscr_m_receive']      = 'Recevoir';
+$lang['subscr_style_every']    = 'Recevoir un courriel à chaque modification';
+$lang['subscr_style_digest']   = 'Courriel, tous les %.2f jours, résumant les modifications de chaque page';
+$lang['subscr_style_list']     = 'Liste des pages modifiées depuis le dernier courriel (tous les %.2f jours)';
+$lang['authtempfail']          = 'L\'authentification est temporairement indisponible. Si cela perdure, merci d\'en informer l\'administrateur du wiki.';
+$lang['i_chooselang']          = 'Choisissez votre langue';
+$lang['i_installer']           = 'Installateur DokuWiki';
+$lang['i_wikiname']            = 'Nom du wiki';
+$lang['i_enableacl']           = 'Activer le contrôle d\'accès (recommandé)';
+$lang['i_superuser']           = 'Super-utilisateur';
+$lang['i_problems']            = 'L\'installateur a détecté les problèmes indiqués ci-dessous. Vous ne pouvez pas poursuivre l\'installation tant qu\'ils n\'auront pas été corrigés.';
+$lang['i_modified']            = 'Pour des raisons de sécurité, ce script ne fonctionne qu\'avec une installation neuve et non modifiée de DokuWiki. Vous devriez ré-extraire les fichiers depuis le paquet téléchargé ou consulter les <a href="http://dokuwiki.org/install">instructions d\'installation de DokuWiki</a>';
+$lang['i_funcna']              = 'La fonction PHP <code>%s</code> n\'est pas disponible. Peut-être que votre hébergeur web l\'a désactivée ?';
+$lang['i_phpver']              = 'Votre version de PHP (%s) est antérieure à la version requise (%s). Vous devez mettre à jour votre installation de PHP.';
+$lang['i_mbfuncoverload']      = 'Il faut désactiver mbstring.func_overload dans php.ini pour DokuWiki';
+$lang['i_permfail']            = '<code>%s</code> n\'est pas accessible en écriture pour DokuWiki. Vous devez corriger les autorisations de ce répertoire !';
+$lang['i_confexists']          = '<code>%s</code> existe déjà';
+$lang['i_writeerr']            = 'Impossible de créer <code>%s</code>. Vous devez vérifier les autorisations des répertoires/fichiers et créer le fichier manuellement.';
+$lang['i_badhash']             = 'dokuwiki.php non reconnu ou modifié (hash=<code>%s</code>)';
+$lang['i_badval']              = '<code>%s</code> - valeur interdite ou vide';
+$lang['i_success']             = 'L\'installation s\'est terminée avec succès. Vous pouvez maintenant supprimer le fichier « install.php ». Continuer avec <a href="doku.php?id=wiki:welcome">votre nouveau DokuWiki</a>.';
+$lang['i_failure']             = 'Des erreurs sont survenues lors de l\'écriture des fichiers de configuration. Il vous faudra les corriger manuellement avant de pouvoir utiliser <a href="doku.php?id=wiki:welcome">votre nouveau DokuWiki</a>.';
+$lang['i_policy']              = 'Politique de contrôle d\'accès initiale';
+$lang['i_pol0']                = 'Wiki ouvert (lecture, écriture, envoi de fichiers pour tout le monde)';
+$lang['i_pol1']                = 'Wiki public (lecture pour tout le monde, écriture et envoi de fichiers pour les utilisateurs enregistrés)';
+$lang['i_pol2']                = 'Wiki fermé (lecture, écriture, envoi de fichiers pour les utilisateurs enregistrés uniquement)';
+$lang['i_allowreg']            = 'Permettre aux utilisateurs de s\'enregistrer eux-mêmes.';
+$lang['i_retry']               = 'Réessayer';
+$lang['i_license']             = 'Veuillez choisir la licence sous laquelle vous souhaitez placer votre contenu :';
+$lang['i_license_none']        = 'Ne pas afficher d\'information de licence.';
+$lang['i_pop_field']           = 'Merci de nous aider à améliorer l\'expérience DokuWiki:';
+$lang['i_pop_label']           = 'Une fois par mois, envoyer des données d\'utilisation anonymes aux développeurs DokuWiki';
+$lang['recent_global']         = 'Vous êtes actuellement en train de regarder les modifications au sein de la catégorie <strong>%s</strong>. Vous pouvez également <a href="%s">afficher les derniers changements sur l\'ensemble du wiki</a>.';
+$lang['years']                 = 'il y a %d ans';
+$lang['months']                = 'il y a %d mois';
+$lang['weeks']                 = 'il y a %d semaines';
+$lang['days']                  = 'il y a %d jours';
+$lang['hours']                 = 'il y a %d heures';
+$lang['minutes']               = 'il y a %d minutes';
+$lang['seconds']               = 'il y a %d secondes';
+$lang['wordblock']             = 'Vos modifications n\'ont pas été enregistrées car elles contiennent du texte non autorisé (spam).';
+$lang['media_uploadtab']       = 'Envoyer';
+$lang['media_searchtab']       = 'Rechercher';
+$lang['media_file']            = 'Fichier';
+$lang['media_viewtab']         = 'Voir';
+$lang['media_edittab']         = 'Éditer';
+$lang['media_historytab']      = 'Historique';
+$lang['media_list_thumbs']     = 'Miniatures';
+$lang['media_list_rows']       = 'Lignes';
+$lang['media_sort_name']       = 'Nom';
+$lang['media_sort_date']       = 'Date';
+$lang['media_namespaces']      = 'Choisissez une catégorie';
+$lang['media_files']           = 'Fichiers dans %s';
+$lang['media_upload']          = 'Envoyer vers %s.';
+$lang['media_search']          = 'Rechercher dans %s.';
+$lang['media_view']            = '%s';
+$lang['media_viewold']         = '%s dans %s';
+$lang['media_edit']            = 'Éditer %s';
+$lang['media_history']         = 'Historique de %s';
+$lang['media_meta_edited']     = 'métadonnées éditées';
+$lang['media_perm_read']       = 'Désolé, vous n\'avez pas l\'autorisation de voir les fichiers.';
+$lang['media_perm_upload']     = 'Désolé, vous n\'avez pas l\'autorisation d\'envoyer des fichiers.';
+$lang['media_update']          = 'Envoyer une nouvelle version';
+$lang['media_restore']         = 'Restaurer cette version';
+$lang['media_acl_warning']     = 'En raison des restrictions dans les ACL et de pages cachées, cette liste peut ne pas être complète.';
+$lang['currentns']             = 'Catégorie courante';
+$lang['searchresult']          = 'Résultat de la recherche';
+$lang['plainhtml']             = 'HTML brut';
+$lang['wikimarkup']            = 'Wiki balise';
+$lang['page_nonexist_rev']     = 'La page n\'existait pas le %s. Elle a été créée le <a href="%s">%s</a>.';
+$lang['unable_to_parse_date']  = 'Ne peut analyser le paramètre date "%s".';
+$lang['email_signature_text']  = 'Ce courriel a été généré par DokuWiki depuis
+@DOKUWIKIURL@';
diff --git a/wiki/inc/lang/fr/locked.txt b/wiki/inc/lang/fr/locked.txt
new file mode 100644
index 0000000..fe88b57
--- /dev/null
+++ b/wiki/inc/lang/fr/locked.txt
@@ -0,0 +1,3 @@
+====== Page bloquée ======
+
+Cette page est actuellement bloquée pour modification par un autre utilisateur. Vous devez attendre que cet utilisateur ait terminé ou que le blocage de la page expire.
diff --git a/wiki/inc/lang/fr/login.txt b/wiki/inc/lang/fr/login.txt
new file mode 100644
index 0000000..c8d40c8
--- /dev/null
+++ b/wiki/inc/lang/fr/login.txt
@@ -0,0 +1,3 @@
+====== Connexion ======
+
+Vous n'êtes pas connecté ! Entrez vos identifiants ci-dessous pour vous connecter. Votre navigateur doit accepter les cookies pour pouvoir vous connecter.
diff --git a/wiki/inc/lang/fr/mailtext.txt b/wiki/inc/lang/fr/mailtext.txt
new file mode 100644
index 0000000..d93eb1e
--- /dev/null
+++ b/wiki/inc/lang/fr/mailtext.txt
@@ -0,0 +1,13 @@
+Une page dans votre wiki a été ajoutée ou modifiée. Voici les
+détails :
+
+Date              : @DATE@
+Navigateur        : @BROWSER@
+Adresse IP        : @IPADDRESS@
+Nom d'hôte        : @HOSTNAME@
+Ancienne révision : @OLDPAGE@
+Nouvelle révision : @NEWPAGE@
+Résumé            : @SUMMARY@
+Utilisateur       : @USER@
+
+@DIFF@
diff --git a/wiki/inc/lang/fr/mailwrap.html b/wiki/inc/lang/fr/mailwrap.html
new file mode 100644
index 0000000..d257190
--- /dev/null
+++ b/wiki/inc/lang/fr/mailwrap.html
@@ -0,0 +1,13 @@
+<html>
+<head>
+<title>@TITLE@</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+</head>
+<body>
+
+@HTMLBODY@
+
+<br /><hr />
+<small>@EMAILSIGNATURE@</small>
+</body>
+</html>
\ No newline at end of file
diff --git a/wiki/inc/lang/fr/newpage.txt b/wiki/inc/lang/fr/newpage.txt
new file mode 100644
index 0000000..c649489
--- /dev/null
+++ b/wiki/inc/lang/fr/newpage.txt
@@ -0,0 +1,4 @@
+====== Cette page n'existe pas encore ======
+
+Vous avez suivi un lien vers une page qui n'existe pas encore. Si vos permissions sont suffisantes, vous pouvez la créer en cliquant sur « Créer cette page ».
+
diff --git a/wiki/inc/lang/fr/norev.txt b/wiki/inc/lang/fr/norev.txt
new file mode 100644
index 0000000..0d40dbe
--- /dev/null
+++ b/wiki/inc/lang/fr/norev.txt
@@ -0,0 +1,4 @@
+====== Révision non trouvée ======
+
+La révision demandée n'existe pas. Cliquez sur « Anciennes révisions » pour obtenir une liste des révisions de ce document.
+
diff --git a/wiki/inc/lang/fr/password.txt b/wiki/inc/lang/fr/password.txt
new file mode 100644
index 0000000..2ffe715
--- /dev/null
+++ b/wiki/inc/lang/fr/password.txt
@@ -0,0 +1,6 @@
+Bonjour @FULLNAME@ !
+
+Voici vos identifiants pour @TITLE@ sur @DOKUWIKIURL@
+
+Utilisateur  : @LOGIN@
+Mot de passe : @PASSWORD@
diff --git a/wiki/inc/lang/fr/preview.txt b/wiki/inc/lang/fr/preview.txt
new file mode 100644
index 0000000..00f09e2
--- /dev/null
+++ b/wiki/inc/lang/fr/preview.txt
@@ -0,0 +1,4 @@
+====== Aperçu ======
+
+Ceci est un aperçu de votre document. Attention : il n'est **pas encore enregistré** !
+
diff --git a/wiki/inc/lang/fr/pwconfirm.txt b/wiki/inc/lang/fr/pwconfirm.txt
new file mode 100644
index 0000000..187ec0b
--- /dev/null
+++ b/wiki/inc/lang/fr/pwconfirm.txt
@@ -0,0 +1,11 @@
+Bonjour @FULLNAME@ !
+
+Quelqu'un a demandé un nouveau mot de passe pour votre identifiant
+@TITLE@ depuis @DOKUWIKIURL@
+
+Si vous n'êtes pas à l'origine de cette requête d'un nouveau mot de
+passe, ignorez simplement ce message.
+
+Pour confirmer que cette requête émane bien de vous, merci de cliquer sur le lien ci-dessous.
+
+@CONFIRM@
diff --git a/wiki/inc/lang/fr/read.txt b/wiki/inc/lang/fr/read.txt
new file mode 100644
index 0000000..6afb864
--- /dev/null
+++ b/wiki/inc/lang/fr/read.txt
@@ -0,0 +1,2 @@
+Cette page est en lecture seule. Vous pouvez afficher le texte source, mais ne pourrez pas le modifier. Contactez votre administrateur si vous pensez qu'il s'agit d'une erreur.
+
diff --git a/wiki/inc/lang/fr/recent.txt b/wiki/inc/lang/fr/recent.txt
new file mode 100644
index 0000000..b41972f
--- /dev/null
+++ b/wiki/inc/lang/fr/recent.txt
@@ -0,0 +1,5 @@
+====== Derniers changements ======
+
+Les pages suivantes ont été modifiées récemment.
+
+
diff --git a/wiki/inc/lang/fr/register.txt b/wiki/inc/lang/fr/register.txt
new file mode 100644
index 0000000..f983834
--- /dev/null
+++ b/wiki/inc/lang/fr/register.txt
@@ -0,0 +1,3 @@
+====== S'enregistrer comme nouvel utilisateur ======
+
+Remplissez toutes les informations ci-dessous pour vous créer un compte sur ce wiki. Assurez-vous de fournir une **adresse de courriel valide** - s'il ne vous est pas demandé de saisir un mot de passe ici, il vous sera expédié par courriel à cette adresse. Le nom d'utilisateur doit être un [[doku>pagename|nom de page]] valide.
diff --git a/wiki/inc/lang/fr/registermail.txt b/wiki/inc/lang/fr/registermail.txt
new file mode 100644
index 0000000..fe39c2d
--- /dev/null
+++ b/wiki/inc/lang/fr/registermail.txt
@@ -0,0 +1,10 @@
+Un nouvel utilisateur s'est enregistré. Voici les détails :
+
+Utilisateur         : @NEWUSER@
+Nom         : @NEWNAME@
+Courriel : @NEWEMAIL@
+
+Date                : @DATE@
+Navigateur internet         : @BROWSER@
+Adresse IP          : @IPADDRESS@
+Nom d'hôte          : @HOSTNAME@
diff --git a/wiki/inc/lang/fr/resendpwd.txt b/wiki/inc/lang/fr/resendpwd.txt
new file mode 100644
index 0000000..91dd924
--- /dev/null
+++ b/wiki/inc/lang/fr/resendpwd.txt
@@ -0,0 +1,4 @@
+====== Envoyer un nouveau mot de passe ======
+
+Veuillez compléter les champs ci-dessous pour obtenir un nouveau mot de passe pour votre compte dans ce wiki. Un lien de confirmation vous sera expédié à l'adresse de courriel utilisée lors de votre enregistrement.
+
diff --git a/wiki/inc/lang/fr/resetpwd.txt b/wiki/inc/lang/fr/resetpwd.txt
new file mode 100644
index 0000000..7b1990c
--- /dev/null
+++ b/wiki/inc/lang/fr/resetpwd.txt
@@ -0,0 +1,3 @@
+====== Définir un nouveau mot de passe ======
+
+Merci d'entrer un nouveau mot de passe pour votre compte sur ce wiki.
\ No newline at end of file
diff --git a/wiki/inc/lang/fr/revisions.txt b/wiki/inc/lang/fr/revisions.txt
new file mode 100644
index 0000000..29c1713
--- /dev/null
+++ b/wiki/inc/lang/fr/revisions.txt
@@ -0,0 +1,4 @@
+====== Anciennes révisions ======
+
+Voici les anciennes révisions de la page en cours. Pour revenir à une ancienne révision, sélectionnez-la ci-dessous, cliquez sur le bouton « Modifier cette page » et enregistrez-la.
+
diff --git a/wiki/inc/lang/fr/searchpage.txt b/wiki/inc/lang/fr/searchpage.txt
new file mode 100644
index 0000000..7866187
--- /dev/null
+++ b/wiki/inc/lang/fr/searchpage.txt
@@ -0,0 +1,4 @@
+====== Recherche ======
+
+Voici les résultats de votre recherche. @CREATEPAGEINFO@
+
diff --git a/wiki/inc/lang/fr/showrev.txt b/wiki/inc/lang/fr/showrev.txt
new file mode 100644
index 0000000..2e36199
--- /dev/null
+++ b/wiki/inc/lang/fr/showrev.txt
@@ -0,0 +1,2 @@
+**Ceci est une ancienne révision du document !**
+----
diff --git a/wiki/inc/lang/fr/stopwords.txt b/wiki/inc/lang/fr/stopwords.txt
new file mode 100644
index 0000000..5f187f7
--- /dev/null
+++ b/wiki/inc/lang/fr/stopwords.txt
@@ -0,0 +1,112 @@
+# Cette liste regroupe les mots ignorés par l'indexeur
+# Un seul mot par ligne
+# Les fins de ligne de ce fichier doivent être de type UNIX
+# Les mots de moins de 3 lettres sont ignorés par défaut.
+# Cette liste est basée sur http://www.ranks.nl/stopwords/
+alors
+aucuns
+aussi
+autre
+avant
+avec
+avoir
+bon
+car
+cela
+ces
+ceux
+chaque
+comme
+comment
+dans
+des
+dedans
+dehors
+depuis
+deux
+devrait
+doit
+donc
+dos
+droite
+début
+elle
+elles
+encore
+essai
+est
+fait
+faites
+fois
+font
+force
+haut
+hors
+ici
+ils
+juste
+les
+leur
+là
+maintenant
+mais
+mes
+mine
+moins
+mon
+mot
+même
+nommés
+notre
+nous
+nouveaux
+où
+par
+parce
+parole
+pas
+personnes
+peut
+peu
+pièce
+plupart
+pour
+pourquoi
+quand
+que
+quel
+quelle
+quelles
+quels
+qui
+sans
+ses
+seulement
+sien
+son
+sont
+sous
+soyez
+sujet
+sur
+tandis
+tellement
+tels
+tes
+ton
+tous
+tout
+trop
+très
+valeur
+voie
+voient
+vont
+votre
+vous
+ça
+étaient
+état
+étions
+été
+être
diff --git a/wiki/inc/lang/fr/subscr_digest.txt b/wiki/inc/lang/fr/subscr_digest.txt
new file mode 100644
index 0000000..c1fa463
--- /dev/null
+++ b/wiki/inc/lang/fr/subscr_digest.txt
@@ -0,0 +1,15 @@
+Bonjour,
+
+La page « @PAGE@ » dans le wiki « @TITLE@ » a été modifiée. Voici les modifications :
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Révision précédente : @OLDPAGE@
+Nouvelle révision : @NEWPAGE@
+
+Pour annuler les notifications de page, connectez-vous au wiki à l'adresse
+@DOKUWIKIURL@ puis visitez
+@SUBSCRIBE@
+et désabonnez-vous de la page ou de la catégorie.
diff --git a/wiki/inc/lang/fr/subscr_form.txt b/wiki/inc/lang/fr/subscr_form.txt
new file mode 100644
index 0000000..f14832e
--- /dev/null
+++ b/wiki/inc/lang/fr/subscr_form.txt
@@ -0,0 +1,3 @@
+====== Gestion des souscriptions ======
+
+Cette page vous permet de gérer vos abonnements pour suivre les modifications sur la page et sur la catégorie courante.
\ No newline at end of file
diff --git a/wiki/inc/lang/fr/subscr_list.txt b/wiki/inc/lang/fr/subscr_list.txt
new file mode 100644
index 0000000..4c5c55d
--- /dev/null
+++ b/wiki/inc/lang/fr/subscr_list.txt
@@ -0,0 +1,12 @@
+Bonjour,
+
+Des pages de la catégorie « @PAGE@ » du wiki « @TITLE@ » ont été modifiées. Voici les modifications :
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Pour annuler les notifications de page, connectez-vous au wiki à l'adresse
+@DOKUWIKIURL@ puis visitez
+@SUBSCRIBE@
+et désabonnez-vous de la page ou de la catégorie.
diff --git a/wiki/inc/lang/fr/subscr_single.txt b/wiki/inc/lang/fr/subscr_single.txt
new file mode 100644
index 0000000..a13bd00
--- /dev/null
+++ b/wiki/inc/lang/fr/subscr_single.txt
@@ -0,0 +1,18 @@
+Bonjour,
+
+La page « @PAGE@ » dans le wiki « @TITLE@ » a été modifiée. Voici les modifications :
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Date : @DATE@
+Utilisateur : @USER@
+Résumé : @SUMMARY@
+Révision précédente : @OLDPAGE@
+Nouvelle révision : @NEWPAGE@
+
+Pour annuler les notifications de page, connectez-vous au wiki à l'adresse
+@DOKUWIKIURL@ puis visitez
+@SUBSCRIBE@
+et désabonnez-vous de la page ou de la catégorie.
diff --git a/wiki/inc/lang/fr/updateprofile.txt b/wiki/inc/lang/fr/updateprofile.txt
new file mode 100644
index 0000000..623d75e
--- /dev/null
+++ b/wiki/inc/lang/fr/updateprofile.txt
@@ -0,0 +1,5 @@
+====== Mise à jour de votre profil ======
+
+Ne complétez que les champs que vous souhaitez modifier. Vous ne pouvez pas modifier votre nom d'utilisateur.
+
+
diff --git a/wiki/inc/lang/fr/uploadmail.txt b/wiki/inc/lang/fr/uploadmail.txt
new file mode 100644
index 0000000..37273d9
--- /dev/null
+++ b/wiki/inc/lang/fr/uploadmail.txt
@@ -0,0 +1,10 @@
+Un fichier a été envoyé dans votre wiki. Voici les détails :
+
+Fichier     : @MEDIA@
+Date        : @DATE@
+Navigateur  : @BROWSER@
+Adresse IP  : @IPADDRESS@
+Nom d'hôte  : @HOSTNAME@
+Taille      : @SIZE@
+Type MIME   : @MIME@
+Utilisateur : @USER@
diff --git a/wiki/inc/lang/gl/admin.txt b/wiki/inc/lang/gl/admin.txt
new file mode 100644
index 0000000..eeaed99
--- /dev/null
+++ b/wiki/inc/lang/gl/admin.txt
@@ -0,0 +1,4 @@
+====== Administración ======
+
+De seguido podes atopar unha lista de tarefas administrativas dispoñíbeis no DokuWiki.
+
diff --git a/wiki/inc/lang/gl/adminplugins.txt b/wiki/inc/lang/gl/adminplugins.txt
new file mode 100644
index 0000000..e52172e
--- /dev/null
+++ b/wiki/inc/lang/gl/adminplugins.txt
@@ -0,0 +1 @@
+===== Extensións adicionais =====
\ No newline at end of file
diff --git a/wiki/inc/lang/gl/backlinks.txt b/wiki/inc/lang/gl/backlinks.txt
new file mode 100644
index 0000000..f77b74b
--- /dev/null
+++ b/wiki/inc/lang/gl/backlinks.txt
@@ -0,0 +1,4 @@
+====== Ligazóns entrantes ======
+
+Isto é unha listaxe de páxinas que semellan ligar coa páxina actual.
+
diff --git a/wiki/inc/lang/gl/conflict.txt b/wiki/inc/lang/gl/conflict.txt
new file mode 100644
index 0000000..dcd87c7
--- /dev/null
+++ b/wiki/inc/lang/gl/conflict.txt
@@ -0,0 +1,6 @@
+====== Hai unha versión máis nova ======
+
+Hai unha versión máis nova do documento que editaches. Isto sucede cando outro usuario mudou o documento mentres ti estabas a editalo.
+
+Examina as diferenzas amosadas embaixo polo miúdo, e logo decide que versión queres manter. Se escolleres ''Gardar'', gardarase a túa versión. Preme en ''Cancelar'' para manteres a versión actual.
+
diff --git a/wiki/inc/lang/gl/denied.txt b/wiki/inc/lang/gl/denied.txt
new file mode 100644
index 0000000..ef37a06
--- /dev/null
+++ b/wiki/inc/lang/gl/denied.txt
@@ -0,0 +1,4 @@
+====== Permiso Denegado ======
+
+Sentímolo, mais non tes permisos de abondo para continuares.
+
diff --git a/wiki/inc/lang/gl/diff.txt b/wiki/inc/lang/gl/diff.txt
new file mode 100644
index 0000000..df87707
--- /dev/null
+++ b/wiki/inc/lang/gl/diff.txt
@@ -0,0 +1,4 @@
+====== Diferenzas ======
+
+Isto amosa as diferenzas entre a revisión seleccionada e a versión actual da páxina.
+
diff --git a/wiki/inc/lang/gl/draft.txt b/wiki/inc/lang/gl/draft.txt
new file mode 100644
index 0000000..ac36dc0
--- /dev/null
+++ b/wiki/inc/lang/gl/draft.txt
@@ -0,0 +1,6 @@
+====== Arquivo de rascuño atopado ======
+
+A túa última sesión de edición desta páxina non foi completada de xeito correcto. O DokuWiki gravou automaticamente un rascuño durante o teu traballo que agora podes usar para continuares coa edición. De seguido podes ver os datos que foron gardados da túa última sesión.
+
+Por favor, escolle se queres //Recuperar// a túa sesión de edición perdida, //Eliminar// o borrador autogardado ou //Cancelar// o proceso de edición.
+
diff --git a/wiki/inc/lang/gl/edit.txt b/wiki/inc/lang/gl/edit.txt
new file mode 100644
index 0000000..1cc1243
--- /dev/null
+++ b/wiki/inc/lang/gl/edit.txt
@@ -0,0 +1,2 @@
+Edita a páxina e preme en ''Gardar''. Bótalle un ollo á [[wiki:syntax|sintaxe]] para veres a sintaxe do Wiki. Por favor, edita a páxina só se podes **mellorala**. Se quixeres facer probas, aprende como levar a cabo os teus primeiros pasos na [[playground:playground|eira]].
+
diff --git a/wiki/inc/lang/gl/editrev.txt b/wiki/inc/lang/gl/editrev.txt
new file mode 100644
index 0000000..d6a0490
--- /dev/null
+++ b/wiki/inc/lang/gl/editrev.txt
@@ -0,0 +1,2 @@
+**Cargaches unha revisión antiga do documento!** Se o gardares, crearás unha nova versión con estes datos.
+----
diff --git a/wiki/inc/lang/gl/index.txt b/wiki/inc/lang/gl/index.txt
new file mode 100644
index 0000000..b0b100b
--- /dev/null
+++ b/wiki/inc/lang/gl/index.txt
@@ -0,0 +1,4 @@
+====== Índice ======
+
+Isto é un índice de todas as páxinas dispoñíbeis, ordenadas por [[doku>namespaces|nomes de espazo]].
+
diff --git a/wiki/inc/lang/gl/install.html b/wiki/inc/lang/gl/install.html
new file mode 100644
index 0000000..fdaaa17
--- /dev/null
+++ b/wiki/inc/lang/gl/install.html
@@ -0,0 +1,25 @@
+<p>Esta páxina é unha axuda na primeira vez que se instala e configura o
+<a href="http://dokuwiki.org">Dokuwiki</a>. Se queres máis información
+verbo deste instalador está dispoñible na súa propia
+<a href="http://dokuwiki.org/installer">páxina de documentación</a>.</p>
+
+<p>O DokuWiki emprega arquivos normais para a almacenaxe das páxinas do wiki
+e outra información asociada coas mesmas (p.e. imaxes, índices de procura,
+revisións antigas, etc).  Por iso, para poder operar correctamente, o DokuWiki
+<strong>precisa</strong> ter acceso de escritura aos directorios que conteñen
+eses arquivos. Este instalador non é quen de configurar os permisos dos directorios.
+Isto debe facerse normalmente de xeito directo na liña de comandos ou, se estás a
+usar unha hospedaxe, a través do FTP ou do panel de control da túa hospedaxe (p.e.
+o cPanel).</p>
+
+<p>Este instalador configurará o teu DokuWiki para o uso da
+<abbr title="access control list">ACL</abbr>, o cal permitirá ao administrador
+iniciar sesión e acceder ao menú de administración do DokuWiki para instalar extensións,
+xestionar usuarios e accesos ás páxinas do wiki, ademais de modificar a configuración.
+Non é imprescindíbel para o funcionamento do DokuWiki, porén, fai moito máis doada a
+administración do mesmo.</p>
+
+<p>Os usuarios expertos ou con requisitos especiais de configuración poden visitar
+as seguintes ligazóns para obter pormenores relativos ás
+<a href="http://dokuwiki.org/install">instruccións de instalación</a>
+e á <a href="http://dokuwiki.org/config">configuración</a>.</p>
diff --git a/wiki/inc/lang/gl/jquery.ui.datepicker.js b/wiki/inc/lang/gl/jquery.ui.datepicker.js
new file mode 100644
index 0000000..2765230
--- /dev/null
+++ b/wiki/inc/lang/gl/jquery.ui.datepicker.js
@@ -0,0 +1,37 @@
+/* Galician localization for 'UI date picker' jQuery extension. */
+/* Translated by Jorge Barreiro <yortx.barry@gmail.com>. */
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "../widgets/datepicker" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery.datepicker );
+	}
+}( function( datepicker ) {
+
+datepicker.regional.gl = {
+	closeText: "Pechar",
+	prevText: "&#x3C;Ant",
+	nextText: "Seg&#x3E;",
+	currentText: "Hoxe",
+	monthNames: [ "Xaneiro","Febreiro","Marzo","Abril","Maio","Xuño",
+	"Xullo","Agosto","Setembro","Outubro","Novembro","Decembro" ],
+	monthNamesShort: [ "Xan","Feb","Mar","Abr","Mai","Xuñ",
+	"Xul","Ago","Set","Out","Nov","Dec" ],
+	dayNames: [ "Domingo","Luns","Martes","Mércores","Xoves","Venres","Sábado" ],
+	dayNamesShort: [ "Dom","Lun","Mar","Mér","Xov","Ven","Sáb" ],
+	dayNamesMin: [ "Do","Lu","Ma","Mé","Xo","Ve","Sá" ],
+	weekHeader: "Sm",
+	dateFormat: "dd/mm/yy",
+	firstDay: 1,
+	isRTL: false,
+	showMonthAfterYear: false,
+	yearSuffix: "" };
+datepicker.setDefaults( datepicker.regional.gl );
+
+return datepicker.regional.gl;
+
+} ) );
diff --git a/wiki/inc/lang/gl/lang.php b/wiki/inc/lang/gl/lang.php
new file mode 100644
index 0000000..a83279e
--- /dev/null
+++ b/wiki/inc/lang/gl/lang.php
@@ -0,0 +1,318 @@
+<?php
+/**
+ * galician language file
+ *
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Medúlio <medulio@ciberirmandade.org>
+ * @author Oscar M. Lage <r0sk10@gmail.com>
+ * @author Rodrigo Rega <rodrigorega@gmail.com>
+ */
+$lang['encoding']              = 'utf-8';
+$lang['direction']             = 'ltr';
+$lang['doublequoteopening']    = '“';
+$lang['doublequoteclosing']    = '”';
+$lang['singlequoteopening']    = '‘';
+$lang['singlequoteclosing']    = '’';
+$lang['apostrophe']            = '’';
+$lang['btn_edit']              = 'Editar esta páxina';
+$lang['btn_source']            = 'Amosar a fonte da páxina';
+$lang['btn_show']              = 'Amosar páxina';
+$lang['btn_create']            = 'Crear esta páxina';
+$lang['btn_search']            = 'Procurar';
+$lang['btn_save']              = 'Gardar';
+$lang['btn_preview']           = 'Previsualizar';
+$lang['btn_top']               = 'Comezo da páxina';
+$lang['btn_newer']             = '<< máis recente';
+$lang['btn_older']             = 'menos recente >>';
+$lang['btn_revs']              = 'Revisións antigas';
+$lang['btn_recent']            = 'Trocos recentes';
+$lang['btn_upload']            = 'Subir';
+$lang['btn_cancel']            = 'Cancelar';
+$lang['btn_index']             = 'Índice';
+$lang['btn_secedit']           = 'Editar';
+$lang['btn_login']             = 'Iniciar sesión';
+$lang['btn_logout']            = 'Rematar sesión';
+$lang['btn_admin']             = 'Administración';
+$lang['btn_update']            = 'Actualizar';
+$lang['btn_delete']            = 'Borrar';
+$lang['btn_back']              = 'Atrás';
+$lang['btn_backlink']          = 'Ligazóns con isto';
+$lang['btn_subscribe']         = 'Avísame dos trocos na páxina';
+$lang['btn_profile']           = 'Actualizar Perfil';
+$lang['btn_reset']             = 'Reiniciar';
+$lang['btn_resendpwd']         = 'Establecer novo contrasinal';
+$lang['btn_draft']             = 'Editar borrador';
+$lang['btn_recover']           = 'Recuperar borrador';
+$lang['btn_draftdel']          = 'Eliminar borrador';
+$lang['btn_revert']            = 'Restaurar';
+$lang['btn_register']          = 'Rexístrate';
+$lang['btn_apply']             = 'Aplicar';
+$lang['btn_media']             = 'Xestor de Arquivos-Media';
+$lang['loggedinas']            = 'Iniciaches sesión como:';
+$lang['user']                  = 'Nome de Usuario';
+$lang['pass']                  = 'Contrasinal';
+$lang['newpass']               = 'Novo Contrasinal';
+$lang['oldpass']               = 'Confirmar contrasinal actual';
+$lang['passchk']               = 'de novo';
+$lang['remember']              = 'Lémbrame';
+$lang['fullname']              = 'Nome Completo';
+$lang['email']                 = 'Correo-e';
+$lang['profile']               = 'Perfil de Usuario';
+$lang['badlogin']              = 'Sentímolo, mais o nome de usuario ou o contrasinal non son correctos.';
+$lang['minoredit']             = 'Trocos Menores';
+$lang['draftdate']             = 'Borrador gardado automaticamente en';
+$lang['nosecedit']             = 'A páxina mudou entrementres, a información da sección estaba desfasada polo que se cargou a páxina completa no seu lugar.';
+$lang['regmissing']            = 'Sentímolo, mais tes que cubrir todos os campos.';
+$lang['reguexists']            = 'Sentímolo, mais xa existe un usuario con ese nome.';
+$lang['regsuccess']            = 'O usuario foi creado e o contrasinal enviado por correo-e.';
+$lang['regsuccess2']           = 'O usuario foi creado.';
+$lang['regmailfail']           = 'Semella que houbo un erro ao tentar enviar o correo-e co contrasinal. Por favor, contacta co administrador!';
+$lang['regbadmail']            = 'O enderezo de correo-e proporcionado semella incorrecto - se consideras que isto é un erro, contacta co administrador';
+$lang['regbadpass']            = 'Os dous contrasinais inseridos non coinciden, por favor téntao de novo.';
+$lang['regpwmail']             = 'O teu contrasinal do DokuWiki';
+$lang['reghere']               = 'Aínda non tes unha conta? Crea a túa';
+$lang['profna']                = 'Este wiki non permite modificacións dos perfís';
+$lang['profnochange']          = 'Non hai trocos, nada que facer.';
+$lang['profnoempty']           = 'Non se permite un nome ou un enderezo de correo-e baleiros.';
+$lang['profchanged']           = 'Perfil de usuario actualizado correctamente.';
+$lang['pwdforget']             = 'Esqueceches o teu contrasinal? Consegue un novo';
+$lang['resendna']              = 'Este wiki non permite o reenvío de contrasinais.';
+$lang['resendpwd']             = 'Establecer novo contrasinal para';
+$lang['resendpwdmissing']      = 'Sentímolo, tes que cubrir todos os campos.';
+$lang['resendpwdnouser']       = 'Sentímolo, non atopamos este usuario no noso banco de datos.';
+$lang['resendpwdbadauth']      = 'Sentímolo, mais este código de autorización non é válido. Asegúrate de que usaches a ligazón completa de confirmación.';
+$lang['resendpwdconfirm']      = 'Enviouse unha ligazón de confirmación por correo-e.';
+$lang['resendpwdsuccess']      = 'O teu novo contrasinal foi enviado por correo-e.';
+$lang['license']               = 'O contido deste wiki, agás onde se indique o contrario, ofrécese baixo da seguinte licenza:';
+$lang['licenseok']             = 'Nota: Ao editares esta páxina estás a aceptar o licenciamento do contido baixo da seguinte licenza:';
+$lang['searchmedia']           = 'Procurar nome de arquivo:';
+$lang['searchmedia_in']        = 'Procurar en %s';
+$lang['txt_upload']            = 'Escolle o arquivo para subir:';
+$lang['txt_filename']          = 'Subir como (opcional):';
+$lang['txt_overwrt']           = 'Sobrescribir arquivo existente';
+$lang['maxuploadsize']         = 'Subida máxima %s por arquivo.';
+$lang['lockedby']              = 'Bloqueado actualmente por:';
+$lang['lockexpire']            = 'O bloqueo remata o:';
+$lang['js']['willexpire']      = 'O teu bloqueo para editares esta páxina vai caducar nun minuto.\nPara de evitar conflitos, emprega o botón de previsualización para reiniciares o contador do tempo de bloqueo.';
+$lang['js']['notsavedyet']     = 'Perderanse os trocos non gardados.
+Está certo de quereres continuar?';
+$lang['js']['searchmedia']     = 'Procurar ficheiros';
+$lang['js']['keepopen']        = 'Manter a fiestra aberta na selección';
+$lang['js']['hidedetails']     = 'Agochar Pormenores';
+$lang['js']['mediatitle']      = 'Configuración de ligazón';
+$lang['js']['mediadisplay']    = 'Tipo de ligazón';
+$lang['js']['mediaalign']      = 'Aliñamento';
+$lang['js']['mediasize']       = 'Tamaño de imaxe';
+$lang['js']['mediatarget']     = 'Albo da ligazón';
+$lang['js']['mediaclose']      = 'Fechar';
+$lang['js']['mediainsert']     = 'Inserir';
+$lang['js']['mediadisplayimg'] = 'Amosar a imaxe';
+$lang['js']['mediadisplaylnk'] = 'Amosar só a ligazón';
+$lang['js']['mediasmall']      = 'Versión reducida';
+$lang['js']['mediamedium']     = 'Versión media';
+$lang['js']['medialarge']      = 'Versión grande';
+$lang['js']['mediaoriginal']   = 'Versión orixinal';
+$lang['js']['medialnk']        = 'Ligazón para a páxina de pormenores';
+$lang['js']['mediadirect']     = 'Ligazón directa para o orixinal';
+$lang['js']['medianolnk']      = 'Sen ligazón';
+$lang['js']['medianolink']     = 'Non ligar a imaxe';
+$lang['js']['medialeft']       = 'Aliñar a imaxe á esquerda';
+$lang['js']['mediaright']      = 'Aliñar a imaxe á dereita';
+$lang['js']['mediacenter']     = 'Aliñar a iamxe ao medio';
+$lang['js']['medianoalign']    = 'Non empregar aliñamento';
+$lang['js']['nosmblinks']      = 'A ligazón aos compartidos do Windows só funciona no Microsoft Internet Explorer.
+Sempre podes copiar e colar a ligazón.';
+$lang['js']['linkwiz']         = 'Asistente de ligazóns';
+$lang['js']['linkto']          = 'Ligazón para:';
+$lang['js']['del_confirm']     = 'Estás certo de quereres eliminar os elementos seleccionados?';
+$lang['js']['restore_confirm'] = 'Realmente desexas restaurar esta versión?';
+$lang['js']['media_diff']      = 'Ver as diferencias:';
+$lang['js']['media_diff_both'] = 'Cara a Cara';
+$lang['js']['media_diff_opacity'] = 'Opacidade';
+$lang['js']['media_diff_portions'] = 'Porcións';
+$lang['js']['media_select']    = 'Selecciona arquivos...';
+$lang['js']['media_upload_btn'] = 'Subir';
+$lang['js']['media_done_btn']  = 'Feito';
+$lang['js']['media_drop']      = 'Solta aquí os arquivos a subir';
+$lang['js']['media_cancel']    = 'eliminar';
+$lang['js']['media_overwrt']   = 'Sobreescribir os arquivos existentes';
+$lang['rssfailed']             = 'Houbo un erro ao tentar obter esta corrente RSS: ';
+$lang['nothingfound']          = 'Non se atopou nada.';
+$lang['mediaselect']           = 'Arquivos-Media';
+$lang['uploadsucc']            = 'Subida correcta';
+$lang['uploadfail']            = 'Erra na subida. Pode que sexa un problema de permisos?';
+$lang['uploadwrong']           = 'Subida denegada. Esta extensión de arquivo non está permitida!';
+$lang['uploadexist']           = 'Xa existe o arquivo. Non se fixo nada.';
+$lang['uploadbadcontent']      = 'O contido subido non concorda coa extensión do arquivo %s.';
+$lang['uploadspam']            = 'A subida foi bloqueada pola lista negra de correo-lixo.';
+$lang['uploadxss']             = 'A subida foi bloqueada por un posíbel contido malicioso.';
+$lang['uploadsize']            = 'O arquivo subido é grande de máis. (máx. %s)';
+$lang['deletesucc']            = 'O arquivo "%s" foi eliminado.';
+$lang['deletefail']            = '"%s" non puido ser eliminado - comproba os permisos.';
+$lang['mediainuse']            = 'O arquivo "%s" non foi eliminado - aínda está en uso.';
+$lang['namespaces']            = 'Nomes de espazos';
+$lang['mediafiles']            = 'Arquivos dispoñíbeis en';
+$lang['accessdenied']          = 'Non tes permitido ver esta páxina.';
+$lang['mediausage']            = 'Emprega a seguinte sintaxe para inserires unha referencia a este arquivo:';
+$lang['mediaview']             = 'Ver arquivo orixinal';
+$lang['mediaroot']             = 'raigaña';
+$lang['mediaupload']           = 'Sube aquí un arquivo ao nome de espazo actual. Para creares sub-nomes de espazos deberás antepoñelos ao nome indicado en "Subir como" separados por dous puntos.';
+$lang['mediaextchange']        = 'Extensión de arquivo mudada de .%s a .%s!';
+$lang['reference']             = 'Referencias para';
+$lang['ref_inuse']             = 'O arquivo non pode ser eliminado, xa que aínda está a ser usado polas seguintes páxinas:';
+$lang['ref_hidden']            = 'Algunhas referencias están en páxinas para as cales non tes permisos de lectura';
+$lang['hits']                  = 'Vistas';
+$lang['quickhits']             = 'Nomes de páxinas coincidentes';
+$lang['toc']                   = 'Táboa de Contidos';
+$lang['current']               = 'actual';
+$lang['yours']                 = 'A túa Versión';
+$lang['diff']                  = 'Amosar diferenzas coa versión actual';
+$lang['diff2']                 = 'Amosar diferenzas entre as revisións seleccionadas';
+$lang['difflink']              = 'Enlazar a esta vista de comparación';
+$lang['diff_type']             = 'Ver diferenzas:';
+$lang['diff_inline']           = 'Por liña';
+$lang['diff_side']             = 'Cara a Cara';
+$lang['line']                  = 'Liña';
+$lang['breadcrumb']            = 'Trazado:';
+$lang['youarehere']            = 'Estás aquí:';
+$lang['lastmod']               = 'Última modificación:';
+$lang['by']                    = 'por';
+$lang['deleted']               = 'eliminado';
+$lang['created']               = 'creado';
+$lang['restored']              = 'revisión antiga restaurada (%s)';
+$lang['external_edit']         = 'edición externa';
+$lang['summary']               = 'Resumo da edición';
+$lang['noflash']               = 'Precísase o <a href="http://www.adobe.com/products/flashplayer/">Extensión Adobe Flash</a> para amosar este contido.';
+$lang['download']              = 'Descargar Retallo (Snippet)';
+$lang['tools']                 = 'Ferramentas';
+$lang['user_tools']            = 'Ferramentas de usuario';
+$lang['site_tools']            = 'Ferramentas do sitio';
+$lang['page_tools']            = 'Ferramentas de páxina';
+$lang['skip_to_content']       = 'Pasar ao contido';
+$lang['sidebar']               = 'Barra lateral';
+$lang['mail_newpage']          = 'páxina engadida:';
+$lang['mail_changed']          = 'páxina mudada:';
+$lang['mail_subscribe_list']   = 'páxinas mudadas en nome de espazo:';
+$lang['mail_new_user']         = 'Novo usuario:';
+$lang['mail_upload']           = 'arquivo subido:';
+$lang['changes_type']          = 'Ver cambios';
+$lang['pages_changes']         = 'Páxinas';
+$lang['media_changes']         = 'Arquivos-Media';
+$lang['both_changes']          = 'Ambos, páxinas e arquivos-media';
+$lang['qb_bold']               = 'Texto Resaltado';
+$lang['qb_italic']             = 'Texto en Cursiva';
+$lang['qb_underl']             = 'Texto Subliñado';
+$lang['qb_code']               = 'Texto de Código';
+$lang['qb_strike']             = 'Texto Riscado';
+$lang['qb_h1']                 = 'Liña de Cabeceira de Nivel 1';
+$lang['qb_h2']                 = 'Liña de Cabeceira de Nivel 2';
+$lang['qb_h3']                 = 'Liña de Cabeceira de Nivel 3';
+$lang['qb_h4']                 = 'Liña de Cabeceira de Nivel 4';
+$lang['qb_h5']                 = 'Liña de Cabeceira de Nivel 5';
+$lang['qb_h']                  = 'Liña de Cabeceira';
+$lang['qb_hs']                 = 'Escoller Liña de Cabeceira';
+$lang['qb_hplus']              = 'Liña de Cabeceira Máis Alta';
+$lang['qb_hminus']             = 'Liña de Cabeceira Máis Baixa';
+$lang['qb_hequal']             = 'Liña de Cabeceira ao Mesmo Nivel';
+$lang['qb_link']               = 'Ligazón Interna';
+$lang['qb_extlink']            = 'Ligazón Externa';
+$lang['qb_hr']                 = 'Liña Horizontal';
+$lang['qb_ol']                 = 'Elemento de Lista Ordenada';
+$lang['qb_ul']                 = 'Elemento de Lista Desordenada';
+$lang['qb_media']              = 'Engadir Imaxes e Outros Arquivos';
+$lang['qb_sig']                = 'Inserir Sinatura';
+$lang['qb_smileys']            = 'Risoños';
+$lang['qb_chars']              = 'Caracteres Especiais';
+$lang['upperns']               = 'choutar ao nome de espazo pai';
+$lang['metaedit']              = 'Editar Metadatos';
+$lang['metasaveerr']           = 'Non se puideron escribir os metadatos';
+$lang['metasaveok']            = 'Metadatos gardados';
+$lang['btn_img_backto']            = 'Volver a %s';
+$lang['img_title']             = 'Título:';
+$lang['img_caption']           = 'Lenda:';
+$lang['img_date']              = 'Data:';
+$lang['img_fname']             = 'Nome de arquivo:';
+$lang['img_fsize']             = 'Tamaño:';
+$lang['img_artist']            = 'Fotógrafo:';
+$lang['img_copyr']             = 'Copyright:';
+$lang['img_format']            = 'Formato:';
+$lang['img_camera']            = 'Cámara:';
+$lang['img_keywords']          = 'Verbas chave:';
+$lang['img_width']             = 'Ancho:';
+$lang['img_height']            = 'Alto:';
+$lang['btn_mediaManager']           = 'Ver no xestor de arquivos-media';
+$lang['subscr_subscribe_success'] = 'Engadido %s á lista de subscrición para %s';
+$lang['subscr_subscribe_error'] = 'Erro ao tentar engadir %s á lista de subscrición para %s';
+$lang['subscr_subscribe_noaddress'] = 'Non hai enderezos asociados co teu inicio de sesión, non é posíbel engadirte á lista de subscrición';
+$lang['subscr_unsubscribe_success'] = 'Eliminado %s da lista de subscrición para %s';
+$lang['subscr_unsubscribe_error'] = 'Erro ao tentar eliminar %s da lista de subscrición para %s';
+$lang['subscr_already_subscribed'] = '%s xa está subscrito a %s';
+$lang['subscr_not_subscribed'] = '%s non está subscrito a %s';
+$lang['subscr_m_not_subscribed'] = 'Agora mesmo non estás subscrito á páxina ou nome de espazo actual';
+$lang['subscr_m_new_header']   = 'Engadir subscrición';
+$lang['subscr_m_current_header'] = 'Subscricións actuais';
+$lang['subscr_m_unsubscribe']  = 'Desubscribir';
+$lang['subscr_m_subscribe']    = 'Subscribir';
+$lang['subscr_m_receive']      = 'Recibir';
+$lang['subscr_style_every']    = 'correo-e en cada troco';
+$lang['authtempfail']          = 'A autenticación de usuario non está dispoñible de xeito temporal. De persistir esta situación, por favor, informa ao Administrador do teu Wiki.';
+$lang['i_chooselang']          = 'Escolle o teu idioma';
+$lang['i_installer']           = 'Instalador do DokuWiki';
+$lang['i_wikiname']            = 'Nome do Wiki';
+$lang['i_enableacl']           = 'Activar ACL (recomendado)';
+$lang['i_superuser']           = 'Super-usuario';
+$lang['i_problems']            = 'O instalador atopou algúns problemas, que se amosan de seguido. Non poderás continuar até que os soluciones.';
+$lang['i_modified']            = 'Por razóns de seguridade este script só funcionará cunha instalación nova e sen modificar do Dokuwiki.
+                         Podes ou ben extraer de novo os arquivos dende o paquete descargado ou consultar as
+                         <a href="http://dokuwiki.org/install">instruccións completas de instalación do Dokuwiki</a>';
+$lang['i_funcna']              = 'A función <code>%s</code> do PHP non está dispoñíbel. Pode que o teu provedor de hospedaxe a desactivase por algún motivo?';
+$lang['i_phpver']              = 'A túa versión <code>%s</code> do PHP é inferior á <code>%s</code> precisa. Debes actualizar a túa instalación do PHP.';
+$lang['i_permfail']            = '<code>%s</code> non é escribíbel polo DokuWiki. Debes corrixir a configuración de permisos deste directorio!';
+$lang['i_confexists']          = '<code>%s</code> xa existe';
+$lang['i_writeerr']            = 'Non se puido crear <code>%s</code>. Terás de comprobar os permisos do directorio/arquivo e crear o ficheiro de xeito manual.';
+$lang['i_badhash']             = 'dokuwiki.php irrecoñecíbel ou modificado (hash=<code>%s</code>)';
+$lang['i_badval']              = '<code>%s</code> - ilegal ou valor baleiro';
+$lang['i_success']             = 'A configuración rematou correctamente. Agora podes eliminar o arquivo install.php. Continúa deica o
+                        <a href="doku.php?id=wiki:welcome">teu novo DokuWiki</a>.';
+$lang['i_failure']             = 'Houbo algúns erros ao tentar escribir os arquivos de configuración. Pode que precises solucionalos de xeito manual antes
+                         de poderes empregar <a href="doku.php?id=wiki:welcome">o teu novo DokuWiki</a>.';
+$lang['i_policy']              = 'Regras iniciais da ACL';
+$lang['i_pol0']                = 'Wiki Aberto (lectura, escritura, subida de arquivos para todas as persoas)';
+$lang['i_pol1']                = 'Wiki Público (lectura para todas as persoas, escritura e subida de arquivos para usuarios rexistrados)';
+$lang['i_pol2']                = 'Wiki Fechado (lectura, escritura, subida de arquivos só para usuarios rexistrados)';
+$lang['i_retry']               = 'Tentar de novo';
+$lang['i_license']             = 'Por favor escolla a licenza para o contido:';
+$lang['recent_global']         = 'Agora mesmo estás a ver os trocos no nome de espazo <b>%s</b>. Tamén podes <a href="%s">ver os trocos recentes no Wiki enteiro</a>.';
+$lang['years']                 = 'hai %d anos';
+$lang['months']                = 'hai %d meses';
+$lang['weeks']                 = 'hai %d semanas';
+$lang['days']                  = 'hai %d días';
+$lang['hours']                 = 'hai %d horas';
+$lang['minutes']               = 'hai %d minutos';
+$lang['seconds']               = 'hai %d segundos';
+$lang['wordblock']             = 'Non se gardaron os cambios porque conteñen texto bloqueado (spam).';
+$lang['media_uploadtab']       = 'Subir';
+$lang['media_searchtab']       = 'Buscar';
+$lang['media_file']            = 'Arquivo';
+$lang['media_viewtab']         = 'Ver';
+$lang['media_edittab']         = 'Editar';
+$lang['media_historytab']      = 'Histórico';
+$lang['media_list_thumbs']     = 'Miniaturas';
+$lang['media_list_rows']       = 'Filas';
+$lang['media_sort_name']       = 'Nome';
+$lang['media_sort_date']       = 'Data';
+$lang['media_namespaces']      = 'Escolla espazo';
+$lang['media_files']           = 'Arquivos en %s';
+$lang['media_upload']          = 'Subir a %s';
+$lang['media_search']          = 'Buscar en %s';
+$lang['media_view']            = '%s';
+$lang['media_viewold']         = '%s en %s';
+$lang['media_edit']            = 'Editar %s';
+$lang['media_history']         = 'Historia de %s';
+$lang['media_meta_edited']     = 'datos meta editados';
+$lang['media_perm_read']       = 'Sentímolo, non tes permisos suficientes para ler arquivos.';
+$lang['media_perm_upload']     = 'Sentímolo, non tes permisos suficientes para subir arquivos.';
+$lang['media_update']          = 'Subir nova versión';
+$lang['media_restore']         = 'Restaurar esta versión';
+$lang['email_signature_text'] = 'Este correo foi xerado polo DokuWiki en
+@DOKUWIKIURL@';
diff --git a/wiki/inc/lang/gl/locked.txt b/wiki/inc/lang/gl/locked.txt
new file mode 100644
index 0000000..90f9ab0
--- /dev/null
+++ b/wiki/inc/lang/gl/locked.txt
@@ -0,0 +1,3 @@
+====== Páxina bloqueada ======
+
+Esta páxina está actualmente bloqueada para a edición por outro usuario. Terás que agardar até que este usuario remate coa edición ou a que expire o bloqueo.
diff --git a/wiki/inc/lang/gl/login.txt b/wiki/inc/lang/gl/login.txt
new file mode 100644
index 0000000..506b30c
--- /dev/null
+++ b/wiki/inc/lang/gl/login.txt
@@ -0,0 +1,4 @@
+====== Inicio de Sesión ======
+
+Actualmente non iniciaches sesión ningunha! Insire as túas credenciais de identificación para iniciares a sesión. Debes ter as cookies activadas para poderes iniciar unha sesión.
+
diff --git a/wiki/inc/lang/gl/mailtext.txt b/wiki/inc/lang/gl/mailtext.txt
new file mode 100644
index 0000000..bf102e1
--- /dev/null
+++ b/wiki/inc/lang/gl/mailtext.txt
@@ -0,0 +1,12 @@
+Engadiuse ou mudouse unha páxina no teu DokuWiki. Aquí van os pormenores:
+
+Data              : @DATE@
+Navegador         : @BROWSER@
+Enderezo IP       : @IPADDRESS@
+Nome do Host      : @HOSTNAME@
+Revisión Antiga   : @OLDPAGE@
+Revision Nova     : @NEWPAGE@
+Resumo da Edición : @SUMMARY@
+Usuario         : @USER@
+
+@DIFF@
diff --git a/wiki/inc/lang/gl/mailwrap.html b/wiki/inc/lang/gl/mailwrap.html
new file mode 100644
index 0000000..d257190
--- /dev/null
+++ b/wiki/inc/lang/gl/mailwrap.html
@@ -0,0 +1,13 @@
+<html>
+<head>
+<title>@TITLE@</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+</head>
+<body>
+
+@HTMLBODY@
+
+<br /><hr />
+<small>@EMAILSIGNATURE@</small>
+</body>
+</html>
\ No newline at end of file
diff --git a/wiki/inc/lang/gl/newpage.txt b/wiki/inc/lang/gl/newpage.txt
new file mode 100644
index 0000000..c073f11
--- /dev/null
+++ b/wiki/inc/lang/gl/newpage.txt
@@ -0,0 +1,4 @@
+====== Este tema aínda non existe ======
+
+Seguiches unha ligazón deica un tema que aínda non existe. Se tes permisos axeitados, podes crealo ti premendo no botón ''Crear esta páxina''.
+
diff --git a/wiki/inc/lang/gl/norev.txt b/wiki/inc/lang/gl/norev.txt
new file mode 100644
index 0000000..af7383d
--- /dev/null
+++ b/wiki/inc/lang/gl/norev.txt
@@ -0,0 +1,4 @@
+======Non hai tal revisión======
+
+A revisión especificada non existe. Utiliza o botón de ''Revisións Antigas'' para obteres unha listaxe das revisións antigas deste documento.
+
diff --git a/wiki/inc/lang/gl/password.txt b/wiki/inc/lang/gl/password.txt
new file mode 100644
index 0000000..36f8562
--- /dev/null
+++ b/wiki/inc/lang/gl/password.txt
@@ -0,0 +1,6 @@
+Ola @FULLNAME@!
+
+Aquí tes os teus datos de usuario para @TITLE@ en @DOKUWIKIURL@
+
+Usuario    : @LOGIN@
+Contrasinal : @PASSWORD@
diff --git a/wiki/inc/lang/gl/preview.txt b/wiki/inc/lang/gl/preview.txt
new file mode 100644
index 0000000..e0f749f
--- /dev/null
+++ b/wiki/inc/lang/gl/preview.txt
@@ -0,0 +1,4 @@
+====== Previsualización ======
+
+Isto é unha previsualización de como aparecerá o teu texto. Lembra: **Non está gardado** aínda!
+
diff --git a/wiki/inc/lang/gl/pwconfirm.txt b/wiki/inc/lang/gl/pwconfirm.txt
new file mode 100644
index 0000000..8185560
--- /dev/null
+++ b/wiki/inc/lang/gl/pwconfirm.txt
@@ -0,0 +1,11 @@
+Ola @FULLNAME@!
+
+Alguén solicitou un novo contrasinal para o teu inicio de sesión
+@TITLE@ en @DOKUWIKIURL@
+
+Se non fuches ti quen o fixo podes ignorar este correo-e.
+
+Para confirmares que esta solicitude foi realmente enviada por ti,
+por favor, visita a seguinte ligazón.
+
+@CONFIRM@
diff --git a/wiki/inc/lang/gl/read.txt b/wiki/inc/lang/gl/read.txt
new file mode 100644
index 0000000..28f3e1a
--- /dev/null
+++ b/wiki/inc/lang/gl/read.txt
@@ -0,0 +1,2 @@
+Esta páxina é só de lectura. Podes ver o código fonte, mais non podes mudala. Coméntallo ao teu administrador se consideras que é un erro.
+
diff --git a/wiki/inc/lang/gl/recent.txt b/wiki/inc/lang/gl/recent.txt
new file mode 100644
index 0000000..622e4d9
--- /dev/null
+++ b/wiki/inc/lang/gl/recent.txt
@@ -0,0 +1,5 @@
+====== Trocos Recentes ======
+
+As seguintes páxinas foron mudadas recentemente.
+
+
diff --git a/wiki/inc/lang/gl/register.txt b/wiki/inc/lang/gl/register.txt
new file mode 100644
index 0000000..4f51f38
--- /dev/null
+++ b/wiki/inc/lang/gl/register.txt
@@ -0,0 +1,4 @@
+====== Rexistro como novo usuario ======
+
+Cubre toda a información requirida a continuación para creares unha nova conta neste wiki. Asegúrate de forneceres un **enderezo de correo-e válido** - se non se che pide aquí que insiras un contrasinal, recibirás un novo nese enderezo. O nome de usuario deberá ser un [[doku>pagename|nome de páxina]] válido.
+
diff --git a/wiki/inc/lang/gl/registermail.txt b/wiki/inc/lang/gl/registermail.txt
new file mode 100644
index 0000000..aad8481
--- /dev/null
+++ b/wiki/inc/lang/gl/registermail.txt
@@ -0,0 +1,10 @@
+Rexistrouse un novo usuario. Aquí van os pormenores:
+
+Nome de usuario   : @NEWUSER@
+Nome completo	  : @NEWNAME@
+Correo-e	      : @NEWEMAIL@
+
+Data	        : @DATE@
+Navegador     	: @BROWSER@
+Enderezo IP		: @IPADDRESS@
+Nome do Host	: @HOSTNAME@
diff --git a/wiki/inc/lang/gl/resendpwd.txt b/wiki/inc/lang/gl/resendpwd.txt
new file mode 100644
index 0000000..0ee2d6c
--- /dev/null
+++ b/wiki/inc/lang/gl/resendpwd.txt
@@ -0,0 +1,3 @@
+====== Enviar novo contrasinal ======
+
+Insire o teu nome de usuario no seguinte formulario para obteres un novo contrasinal da túa conta neste wiki. Enviarase unha ligazón de confirmación ao teu enderezo rexistrado de correo-e.
diff --git a/wiki/inc/lang/gl/resetpwd.txt b/wiki/inc/lang/gl/resetpwd.txt
new file mode 100644
index 0000000..d3d64e9
--- /dev/null
+++ b/wiki/inc/lang/gl/resetpwd.txt
@@ -0,0 +1,3 @@
+====== Establecer novo contrasinal ======
+
+Por favor introduzca un novo contrasinal para a súa conta neste wiki.
\ No newline at end of file
diff --git a/wiki/inc/lang/gl/revisions.txt b/wiki/inc/lang/gl/revisions.txt
new file mode 100644
index 0000000..3d5cccd
--- /dev/null
+++ b/wiki/inc/lang/gl/revisions.txt
@@ -0,0 +1,4 @@
+======Revisións Antigas======
+
+Estas son as revisións antigas do documento actual. Para retomar unha revisión antiga selecciónaa na seguinte lista, preme en ''Editar esta páxina'' e gárdaa.
+
diff --git a/wiki/inc/lang/gl/searchpage.txt b/wiki/inc/lang/gl/searchpage.txt
new file mode 100644
index 0000000..6c88493
--- /dev/null
+++ b/wiki/inc/lang/gl/searchpage.txt
@@ -0,0 +1,4 @@
+====== Procura ======
+
+Podes atopar os resultados da túa procura a continuación. @CREATEPAGEINFO@
+
diff --git a/wiki/inc/lang/gl/showrev.txt b/wiki/inc/lang/gl/showrev.txt
new file mode 100644
index 0000000..88fb0c3
--- /dev/null
+++ b/wiki/inc/lang/gl/showrev.txt
@@ -0,0 +1,2 @@
+**Esta é unha revisión antiga do documento!**
+----
diff --git a/wiki/inc/lang/gl/stopwords.txt b/wiki/inc/lang/gl/stopwords.txt
new file mode 100644
index 0000000..5520cd2
--- /dev/null
+++ b/wiki/inc/lang/gl/stopwords.txt
@@ -0,0 +1,692 @@
+# Isto é unha lista das verbas que o indexador ignora, unha por liña
+# Cando edites este arquivo asegúrate de usar remates de liña UNIX (nova liña única)
+# Non precisas incluír verbas de menos de 3 caracteres - estas son ignoradas de todas formas
+# Esta lista está baseada nas atopadas en http://www.ranks.nl/stopwords/ (en proceso aínda)
+aberto
+abonda
+abrir
+acabo
+acceder
+acceso
+acordo
+actitude
+actividade
+actividades
+actual
+actualización
+actualizar
+actualmente
+ademais
+ademáis
+adiante
+agardar
+agora
+agás
+ainda
+aínda
+aiquí
+algo
+alguen
+algun
+algunha
+algunhas
+alguén
+algún
+algúns
+alta
+amigos
+ando
+anima
+anos
+ante
+anterior
+anteriores
+antes
+aparece
+aparecen
+apartado
+aperta
+apertas
+apoio
+aqui
+aquí
+arquivo
+arquivos
+artigo
+artigos
+asunto
+atención
+atopar
+atopei
+axuda
+axudar
+baixo
+banda
+base
+bastante
+benvido
+boas
+botar
+buscador
+buscar
+cabo
+cada
+cadra
+caixa
+cales
+calidade
+calquer
+calquera
+cambio
+camiño
+campanha
+campaña
+campañas
+campo
+cando
+cantidade
+canto
+cantos
+cara
+carallo
+cartos
+casa
+case
+caso
+casos
+catro
+centro
+certo
+chea
+chega
+chegar
+chisco
+cidade
+civil
+claro
+coas
+coido
+colaboración
+colaborar
+coma
+comentar
+comentario
+comentarios
+comezar
+como
+comunicación
+comunidade
+común
+concreto
+condicións
+conforme
+conseguir
+conta
+contactar
+contacto
+contas
+contido
+contidos
+contra
+contrario
+control
+copia
+correcto
+correio
+correo
+correoe
+correos
+correspondente
+cousa
+cousas
+coñecemento
+coñezo
+crear
+creo
+cuestión
+cuestións
+cunha
+curioso
+dabondo
+dacordo
+dados
+darlle
+data
+datos
+debate
+debe
+debemos
+deben
+deberiamos
+debería
+decidir
+decisión
+defecto
+defensa
+deica
+deixa
+deixar
+deixo
+deles
+demais
+demasiado
+demáis
+dende
+dentro
+dereitos
+desde
+dese
+deseño
+despois
+desta
+deste
+destes
+diante
+dias
+dicir
+diferentes
+difícil
+digo
+dirección
+directamente
+directorio
+discusión
+discutir
+distintas
+distintos
+distribución
+dixen
+dixo
+doado
+dous
+duas
+dunha
+durante
+días
+dúas
+dúbida
+efectivamente
+eiqui
+eiquí
+eles
+eliminar
+email
+empregar
+emprego
+empresa
+empresas
+enderezo
+enderezos
+engadir
+enlace
+enquisa
+enriba
+entendo
+entidades
+entrada
+entrar
+entre
+entón
+enviar
+envio
+eran
+erro
+erros
+esas
+escribir
+eses
+especial
+especialmente
+espero
+esta
+estaba
+estades
+estado
+estamos
+estan
+estar
+estaría
+estas
+este
+estea
+estes
+estilo
+estiven
+esto
+estou
+está
+están
+estás
+evidentemente
+evitar
+exactamente
+exemplo
+existe
+facelo
+facemos
+facendo
+facer
+faga
+fagan
+fago
+fala
+falamos
+falando
+falar
+falla
+falo
+falta
+favor
+fazer
+feita
+feito
+ferreira
+final
+finalmente
+fios
+fixen
+fixo
+fondo
+fora
+forma
+formas
+foro
+foron
+foros
+fose
+fotos
+funciona
+funcionamento
+futuro
+fóra
+gracias
+gran
+grande
+grandes
+grazas
+grupo
+grupos
+gusta
+haber
+haberá
+habería
+había
+haxa
+historia
+home
+hora
+horas
+houbese
+houbo
+hoxe
+idea
+ideas
+ideia
+igual
+imos
+importancia
+importante
+importantes
+inda
+info
+información
+informar
+informe
+inicial
+iniciativa
+inicio
+intención
+interesa
+interesante
+interese
+iste
+isto
+lado
+lembro
+letras
+leva
+levamos
+levar
+libre
+libro
+lista
+listas
+liña
+liñas
+lles
+local
+logo
+longo
+lugar
+lugo
+maior
+maiores
+maioría
+mais
+mandar
+maneira
+manter
+marcha
+material
+mañá
+media
+mediante
+medida
+medio
+mellor
+membros
+menos
+mensaxe
+mensaxes
+mentres
+menú
+mesa
+meses
+mesma
+mesmo
+mesmos
+meter
+meus
+milhor
+millor
+minha
+mirar
+miña
+modificar
+moita
+moitas
+moito
+moitos
+momento
+mudar
+mundo
+máis
+mínimo
+nada
+nbsp
+necesario
+necesidade
+nese
+nesta
+neste
+nestes
+ningunha
+ninguén
+ningún
+noite
+nome
+normal
+nosa
+nosas
+noso
+nosos
+nota
+nova
+novas
+novo
+novos
+nunca
+nunha
+número
+ofrece
+ofrecer
+ollo
+onde
+onte
+oops
+opción
+opcións
+opinión
+orixinal
+outra
+outras
+outro
+outros
+paga
+palabras
+para
+parabens
+parece
+pareceme
+parte
+partes
+participación
+participar
+partido
+paréceme
+pasa
+pasado
+pasar
+paso
+pedir
+pena
+pendente
+pendentes
+pensades
+pensando
+pensar
+penso
+pequena
+pequeno
+perfectamente
+perfecto
+permite
+pero
+persoa
+persoal
+persoas
+pode
+podedes
+podemos
+poden
+poder
+poderiamos
+podería
+poderíamos
+podes
+podo
+poida
+poidan
+pois
+pola
+polas
+polo
+polos
+por
+porque
+porén
+posibel
+posibilidade
+posibilidades
+posible
+posta
+posto
+pouco
+poucos
+poñer
+precisamente
+preciso
+pregos
+pregunta
+presente
+primeira
+primeiro
+principal
+principio
+proba
+probar
+probas
+problema
+problemas
+proceso
+prol
+propia
+propio
+proposta
+propostas
+propoño
+propoñovos
+proxecto
+proxectos
+publicar
+punto
+pódese
+queda
+quedar
+quedou
+queira
+quen
+quere
+queredes
+queremos
+queren
+queres
+quero
+quizáis
+quot
+razón
+real
+realidade
+realmente
+recibir
+referencia
+relación
+rematar
+remate
+respecto
+resposta
+respostar
+respostas
+resto
+resulta
+resultado
+revisar
+revisión
+riba
+sabe
+sabedes
+saber
+sacar
+saúdo
+saúdos
+segue
+seguinte
+seguintes
+seguir
+segunda
+segundo
+seguramente
+seguro
+seica
+semana
+semanas
+semella
+semellante
+sempre
+sendo
+senon
+sentido
+senón
+seria
+serie
+será
+serán
+sería
+seus
+sexa
+sexan
+similar
+simplemente
+sitio
+sitios
+situación
+soamente
+sobre
+solución
+somos
+suas
+superior
+suponho
+suposto
+supoño
+sábado
+súas
+tamen
+tampouco
+tamén
+tanto
+tarde
+tedes
+temos
+tempo
+tempos
+tendo
+tenho
+tentar
+tería
+teña
+teñamos
+teñan
+teñen
+teño
+timos
+tipo
+tiven
+tiña
+toda
+todas
+todo
+todos
+tomar
+total
+totalmente
+trabalho
+traballando
+traballar
+traballo
+traballos
+tras
+trata
+través
+tres
+troco
+trocos
+troques
+tódalas
+tódolos
+última
+último
+últimos
+unha
+unhas
+única
+únicamente
+únicousar
+usuario
+usuarios
+utilizar
+vaia
+vale
+vamos
+varias
+varios
+veces
+verdade
+vexo
+veño
+vida
+vindeiro
+visitantes
+visitas
+vista
+visto
+volta
+vosa
+wink
+xeito
+xeitos
+xente
+xerais
+xeral
+xunto
+zona
diff --git a/wiki/inc/lang/gl/subscr_digest.txt b/wiki/inc/lang/gl/subscr_digest.txt
new file mode 100644
index 0000000..275a7d5
--- /dev/null
+++ b/wiki/inc/lang/gl/subscr_digest.txt
@@ -0,0 +1,16 @@
+Ola.
+
+Houbo mudanzas na páxina @PAGE@ do wiki @TITLE@.
+Estes son os trocos:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Revisión Antiga: @OLDPAGE@
+Revisión Nova: @NEWPAGE@
+
+Para cancelares as notificacións da páxina inicia sesión no wiki en
+@DOKUWIKIURL@ e logo visita
+@SUBSCRIBE@
+e desubscríbete do seguimento dos trocos da páxina e/ou nome de espazo.
diff --git a/wiki/inc/lang/gl/subscr_form.txt b/wiki/inc/lang/gl/subscr_form.txt
new file mode 100644
index 0000000..e8a6fe6
--- /dev/null
+++ b/wiki/inc/lang/gl/subscr_form.txt
@@ -0,0 +1,3 @@
+====== Xestión de Subscrición ======
+
+Esta páxina permíteche xestionar as túas subscricións para a páxina e nome de espazo actuais.
\ No newline at end of file
diff --git a/wiki/inc/lang/gl/subscr_list.txt b/wiki/inc/lang/gl/subscr_list.txt
new file mode 100644
index 0000000..8ee1a7a
--- /dev/null
+++ b/wiki/inc/lang/gl/subscr_list.txt
@@ -0,0 +1,13 @@
+Ola.
+
+Houbo trocos en páxinas do nome de espazo @PAGE@ do wiki @TITLE@.
+Estas son as páxinas que mudaron:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Para cancelares as notificacións da páxina inicia sesión no wiki en
+@DOKUWIKIURL@ e logo visita
+@SUBSCRIBE@
+e desubscríbete do seguimento dos trocos da páxina e/ou nome de espazo.
diff --git a/wiki/inc/lang/gl/subscr_single.txt b/wiki/inc/lang/gl/subscr_single.txt
new file mode 100644
index 0000000..b30c817
--- /dev/null
+++ b/wiki/inc/lang/gl/subscr_single.txt
@@ -0,0 +1,19 @@
+Ola.
+
+Houbo trocos na páxina @PAGE@ do wiki @TITLE@.
+Estes son os trocos:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Data : @DATE@
+Usuario : @USER@
+Resumo do Edición: @SUMMARY@
+Revisión Antiga: @OLDPAGE@
+Revisión Nova: @NEWPAGE@
+
+Para cancelares as notificacións da páxina inicia sesión no wiki en
+@DOKUWIKIURL@ e logo visita
+@SUBSCRIBE@
+e desubscríbete do seguimento dos trocos da páxina e/ou nome de espazo.
diff --git a/wiki/inc/lang/gl/updateprofile.txt b/wiki/inc/lang/gl/updateprofile.txt
new file mode 100644
index 0000000..8620dea
--- /dev/null
+++ b/wiki/inc/lang/gl/updateprofile.txt
@@ -0,0 +1,5 @@
+====== Actualizar o perfil da túa conta ======
+
+Só precisas cubrir os campos que desexes mudar.  Non podes mudar o teu nome de usuario.
+
+
diff --git a/wiki/inc/lang/gl/uploadmail.txt b/wiki/inc/lang/gl/uploadmail.txt
new file mode 100644
index 0000000..c01bc7d
--- /dev/null
+++ b/wiki/inc/lang/gl/uploadmail.txt
@@ -0,0 +1,10 @@
+Subiuse un arquivo ao teu DokuWiki. Aquí van os pormenores:
+
+Arquivo : @MEDIA@
+Data : @DATE@
+Navegador : @BROWSER@
+Enderezo IP : @IPADDRESS@
+Nome do Host : @HOSTNAME@
+Tamaño : @SIZE@
+Tipo MIME : @MIME@
+Usuario : @USER@
diff --git a/wiki/inc/lang/gl/wordblock.txt b/wiki/inc/lang/gl/wordblock.txt
new file mode 100644
index 0000000..ec8d67a
--- /dev/null
+++ b/wiki/inc/lang/gl/wordblock.txt
@@ -0,0 +1,4 @@
+====== Bloqueo por Correo-lixo ======
+
+Os teus trocos **non** foron gardados porque conteñen unha ou varias verbas bloqueadas. Se tentaches deixar correo-lixo no wiki -- Estívoche ben! Se consideras que é un erro, contacta co administrador deste Wiki.
+
diff --git a/wiki/inc/lang/he/admin.txt b/wiki/inc/lang/he/admin.txt
new file mode 100644
index 0000000..ada73e5
--- /dev/null
+++ b/wiki/inc/lang/he/admin.txt
@@ -0,0 +1,4 @@
+====== ניהול ======
+
+ניתן למצוא מטה רשימה של משימות ניהול זמינות ב-DokuWiki.
+
diff --git a/wiki/inc/lang/he/adminplugins.txt b/wiki/inc/lang/he/adminplugins.txt
new file mode 100644
index 0000000..a7a6471
--- /dev/null
+++ b/wiki/inc/lang/he/adminplugins.txt
@@ -0,0 +1 @@
+===== תוספים נוספים =====
\ No newline at end of file
diff --git a/wiki/inc/lang/he/backlinks.txt b/wiki/inc/lang/he/backlinks.txt
new file mode 100644
index 0000000..dfcdd22
--- /dev/null
+++ b/wiki/inc/lang/he/backlinks.txt
@@ -0,0 +1,3 @@
+====== קישורים לאחור ======
+
+זוהי רשימת דפים אשר נראה כי הם מקשרים לדף ממנו הגעת.
diff --git a/wiki/inc/lang/he/conflict.txt b/wiki/inc/lang/he/conflict.txt
new file mode 100644
index 0000000..c1cccdf
--- /dev/null
+++ b/wiki/inc/lang/he/conflict.txt
@@ -0,0 +1,6 @@
+====== קיימת גרסה עדכנית יותר של הקובץ ======
+
+ישנה גרסה עדכנית יותר של המסמך. מצב כזה קורה כאשר משתמש אחר שינה את המסמך בזמן שערכת אותו.
+
+מומלץ לעיין בהבדלים המופיעים להלן ולאחר מכן להחליט איזו גרסה כדאי לשמור. לחיצה על הכפתור "שמירה" תשמור את הגרסה שערכת. לחיצה על הכפתור "ביטול" תשמור את הגרסה הקיימת.
+
diff --git a/wiki/inc/lang/he/denied.txt b/wiki/inc/lang/he/denied.txt
new file mode 100644
index 0000000..a2e19f3
--- /dev/null
+++ b/wiki/inc/lang/he/denied.txt
@@ -0,0 +1,4 @@
+====== הרשאה נדחתה ======
+
+אנו מצטערים אך אין לך הרשאות מתאימות כדי להמשיך.
+
diff --git a/wiki/inc/lang/he/diff.txt b/wiki/inc/lang/he/diff.txt
new file mode 100644
index 0000000..f1216bb
--- /dev/null
+++ b/wiki/inc/lang/he/diff.txt
@@ -0,0 +1,4 @@
+====== הבדלים ======
+
+כאן מוצגים ההבדלים בין הגרסה שנבחרה והגרסה הנוכחית של הדף.
+
diff --git a/wiki/inc/lang/he/draft.txt b/wiki/inc/lang/he/draft.txt
new file mode 100644
index 0000000..b999cc1
--- /dev/null
+++ b/wiki/inc/lang/he/draft.txt
@@ -0,0 +1,5 @@
+====== נמצא קובץ טיוטה ======
+
+העריכה האחרונה שבוצעה לדף זה לא הושלמה כראוי. DokuWiki שמר באופן אוטומטי טיוטה של העבודה ובאפשרותך להשתמש בה  כדי להמשיך את העריכה. ניתן לראות להלן את הנתונים שנשמרו מהפעם הקודמת.
+
+באפשרותך לבחור ב//שחזור הטיוטה// של אותה עריכה //מחיקת הטיוטה// או //ביטול// העריכה כליל.
\ No newline at end of file
diff --git a/wiki/inc/lang/he/edit.txt b/wiki/inc/lang/he/edit.txt
new file mode 100644
index 0000000..74b3cef
--- /dev/null
+++ b/wiki/inc/lang/he/edit.txt
@@ -0,0 +1 @@
+עריכת הדף ולחיצה על הלחצן "שמירה" תעדכן את תוכנו. מומלץ לעיין בדף ה[[wiki:syntax|תחביר]] כדי להכיר את כללי תחביר הוויקי. נא לערוך את הדף רק אם הדבר נעשה כדי **לשפר** אותו. אם העריכה היא לצורך התנסות מומלץ לבקר ב[[playground:playground|ארגז החול]].
diff --git a/wiki/inc/lang/he/editrev.txt b/wiki/inc/lang/he/editrev.txt
new file mode 100644
index 0000000..e33001f
--- /dev/null
+++ b/wiki/inc/lang/he/editrev.txt
@@ -0,0 +1,2 @@
+**הדף שנפתח הוא גרסה ישנה של המסמך!** לחיצה על הלחצן "שמירה" תשחזר את המסמך לגרסה המוצגת כעת.
+----
\ No newline at end of file
diff --git a/wiki/inc/lang/he/index.txt b/wiki/inc/lang/he/index.txt
new file mode 100644
index 0000000..4b0623f
--- /dev/null
+++ b/wiki/inc/lang/he/index.txt
@@ -0,0 +1,4 @@
+====== מפת אתר ======
+
+זהו קובץ מפת אתר הנמצא מעל לכל הדפים המאורגנים ב[[ויקי:דוקיוויקי]].
+
diff --git a/wiki/inc/lang/he/install.html b/wiki/inc/lang/he/install.html
new file mode 100644
index 0000000..e2cc179
--- /dev/null
+++ b/wiki/inc/lang/he/install.html
@@ -0,0 +1,13 @@
+<p>דף זה מסייע בהליכי ההתקנה וההגדרה הראשוניים של
+<a href="http://dokuwiki.org">Dokuwiki</a>. מידע נוסף על תכנית התקנה זו זמין בדף
+<a href="http://dokuwiki.org/installer">התיעוד שלו</a>.</p>
+
+<p>DokuWiki עושה שימוש בקבצים רגילים לשמירת דפי ויקי ומידע נוסף הקשור לדפים אלו (לדוגמה: תמונות, רשימות חיפוש, גרסאות קודמות וכו׳).
+לצורך תפקוד תקין DokuWiki <strong>חייב</strong> גישה לכתיבה לתיקיות המכילות קבצים אלו. תכנית התקנה זו אינה יכולה להגדיר הרשאות לתיקיות.
+פעולה זו צריכה בד״כ להתבצע ישירות משורת הפקודה או במקרה שנעשה שימוש בשרת מארח דרך FTP או מנשק הניהול של המארח (cPanell לדוגמה).</p>
+
+<p>מתקין זה יגדיר את תצורת ה־<abbr title="access control list">ACL</abbr> ב-DokuWiki שלך
+, זה בתורו מאפשר גישת מנהל לתפריט הניהול של DokuWiki כדי להתקין הרחבות, לנהל משתמשים, לנהל גישות לדפי ויקי ושינויים בהגדרות התצורה.
+אין הוא הכרחי לתפקוד DokuWiki אך הוא יהפוך את Dokuwiki לפשוט יותר לניהול.</p>
+
+<p>על משתמשים מנוסים או כאלו עם דרישות מיוחדות להתקנה להשתמש בקישורים אלו לפרטים בנוגע ל<a href="http://dokuwiki.org/install">הוראות התקנה</a> ול<a href="http://dokuwiki.org/config">הגדרות תצורה</a>.</p>
diff --git a/wiki/inc/lang/he/jquery.ui.datepicker.js b/wiki/inc/lang/he/jquery.ui.datepicker.js
new file mode 100644
index 0000000..fb6238f
--- /dev/null
+++ b/wiki/inc/lang/he/jquery.ui.datepicker.js
@@ -0,0 +1,37 @@
+/* Hebrew initialisation for the UI Datepicker extension. */
+/* Written by Amir Hardon (ahardon at gmail dot com). */
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "../widgets/datepicker" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery.datepicker );
+	}
+}( function( datepicker ) {
+
+datepicker.regional.he = {
+	closeText: "סגור",
+	prevText: "&#x3C;הקודם",
+	nextText: "הבא&#x3E;",
+	currentText: "היום",
+	monthNames: [ "ינואר","פברואר","מרץ","אפריל","מאי","יוני",
+	"יולי","אוגוסט","ספטמבר","אוקטובר","נובמבר","דצמבר" ],
+	monthNamesShort: [ "ינו","פבר","מרץ","אפר","מאי","יוני",
+	"יולי","אוג","ספט","אוק","נוב","דצמ" ],
+	dayNames: [ "ראשון","שני","שלישי","רביעי","חמישי","שישי","שבת" ],
+	dayNamesShort: [ "א'","ב'","ג'","ד'","ה'","ו'","שבת" ],
+	dayNamesMin: [ "א'","ב'","ג'","ד'","ה'","ו'","שבת" ],
+	weekHeader: "Wk",
+	dateFormat: "dd/mm/yy",
+	firstDay: 0,
+	isRTL: true,
+	showMonthAfterYear: false,
+	yearSuffix: "" };
+datepicker.setDefaults( datepicker.regional.he );
+
+return datepicker.regional.he;
+
+} ) );
diff --git a/wiki/inc/lang/he/lang.php b/wiki/inc/lang/he/lang.php
new file mode 100644
index 0000000..655bc5d
--- /dev/null
+++ b/wiki/inc/lang/he/lang.php
@@ -0,0 +1,353 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Guy Yakobovitch <guy.yakobovitch@gmail.com>
+ * @author גיא שפר <guysoft@ort.org.il>
+ * @author Denis Simakov <akinoame1@gmail.com>
+ * @author Dotan Kamber <kamberd@yahoo.com>
+ * @author Moshe Kaplan <mokplan@gmail.com>
+ * @author Yaron Yogev <yaronyogev@gmail.com>
+ * @author Yaron Shahrabani <sh.yaron@gmail.com>
+ * @author Roy Zahor <roy.zahor@gmail.com>
+ * @author alex <ralexay@gmail.com>
+ * @author matt carroll <matt.carroll@gmail.com>
+ * @author tomer <tomercarolldergicz@gmail.com>
+ * @author itsho <itsho.itsho@gmail.com>
+ * @author Menashe Tomer <menashesite@gmail.com>
+ * @author sagi <sagiyosef@gmail.com>
+ */
+$lang['encoding']              = 'utf-8';
+$lang['direction']             = 'rtl';
+$lang['doublequoteopening']    = '“';
+$lang['doublequoteclosing']    = '”';
+$lang['singlequoteopening']    = '‘';
+$lang['singlequoteclosing']    = '’';
+$lang['apostrophe']            = '\'';
+$lang['btn_edit']              = 'עריכת דף זה';
+$lang['btn_source']            = 'הצגת מקור הדף';
+$lang['btn_show']              = 'הצגת דף';
+$lang['btn_create']            = 'יצירת דף';
+$lang['btn_search']            = 'חיפוש';
+$lang['btn_save']              = 'שמירה';
+$lang['btn_preview']           = 'תצוגה מקדימה';
+$lang['btn_top']               = 'חזרה למעלה';
+$lang['btn_newer']             = '<<  חדש יותר';
+$lang['btn_older']             = 'פחות חדש  >>';
+$lang['btn_revs']              = 'גרסאות קודמות';
+$lang['btn_recent']            = 'שינויים אחרונים';
+$lang['btn_upload']            = 'העלאה';
+$lang['btn_cancel']            = 'ביטול';
+$lang['btn_index']             = 'מפת האתר';
+$lang['btn_secedit']           = 'עריכה';
+$lang['btn_login']             = 'כניסה';
+$lang['btn_logout']            = 'יציאה';
+$lang['btn_admin']             = 'ניהול';
+$lang['btn_update']            = 'עדכון';
+$lang['btn_delete']            = 'מחיקה';
+$lang['btn_back']              = 'חזרה';
+$lang['btn_backlink']          = 'קישורים לכאן';
+$lang['btn_subscribe']         = 'מעקב אחרי שינוים';
+$lang['btn_profile']           = 'עדכון הפרופיל';
+$lang['btn_reset']             = 'איפוס';
+$lang['btn_resendpwd']         = 'הגדר סיסמה חדשה';
+$lang['btn_draft']             = 'עריכת טיוטה';
+$lang['btn_recover']           = 'שחזור טיוטה';
+$lang['btn_draftdel']          = 'מחיקת טיוטה';
+$lang['btn_revert']            = 'שחזור';
+$lang['btn_register']          = 'הרשמה';
+$lang['btn_apply']             = 'ליישם';
+$lang['btn_media']             = 'מנהל המדיה';
+$lang['btn_deleteuser']        = 'להסיר את החשבון שלי';
+$lang['btn_img_backto']        = 'חזרה אל %s';
+$lang['btn_mediaManager']      = 'צפה במנהל מדיה';
+$lang['loggedinas']            = 'נכנסת בשם:';
+$lang['user']                  = 'שם משתמש';
+$lang['pass']                  = 'ססמה';
+$lang['newpass']               = 'ססמה חדשה';
+$lang['oldpass']               = 'אישור הססמה הנוכחית';
+$lang['passchk']               = 'פעם נוספת';
+$lang['remember']              = 'שמירת הפרטים שלי';
+$lang['fullname']              = 'שם מלא';
+$lang['email']                 = 'דוא״ל';
+$lang['profile']               = 'פרופיל המשתמש';
+$lang['badlogin']              = 'שם המשתמש או הססמה שגויים, עמך הסליחה';
+$lang['badpassconfirm']        = 'מצטערים, הסיסמה שגויה';
+$lang['minoredit']             = 'שינוים מזעריים';
+$lang['draftdate']             = 'הטיוטה נשמרה אוטומטית ב־';
+$lang['nosecedit']             = 'הדף השתנה בינתיים, הקטע שערכת אינו מעודכן - העמוד כולו נטען במקום זאת.';
+$lang['regmissing']            = 'עליך למלא את כל השדות, עמך הסליחה.';
+$lang['reguexists']            = 'משתמש בשם זה כבר נרשם, עמך הסליחה.';
+$lang['regsuccess']            = 'ההרשמה הצליחה, המשתמש נרשם והודעה נשלחה בדוא״ל.';
+$lang['regsuccess2']           = 'ההרשמה הצליחה, המשתמש נוצר.';
+$lang['regfail']               = 'אין אפשרות ליצור את המשתמש';
+$lang['regmailfail']           = 'שליחת הודעת הדוא״ל כשלה, נא ליצור קשר עם מנהל האתר!';
+$lang['regbadmail']            = 'יתכן כי כתובת הדוא״ל אינה תקפה, אם לא כך הדבר ליצור קשר עם מנהל האתר';
+$lang['regbadpass']            = 'שתי הססמאות אינן זהות זו לזו, נא לנסות שוב.';
+$lang['regpwmail']             = 'ססמת הדוקוויקי שלך';
+$lang['reghere']               = 'עדיין אין לך חשבון? ההרשמה כאן';
+$lang['profna']                = 'בוויקי הזה לא ניתן לשנות פרופיל';
+$lang['profnochange']          = 'אין שינויים, הפרופיל לא עודכן';
+$lang['profnoempty']           = 'השם וכתובת הדוא״ל לא יכולים להיות ריקים';
+$lang['profchanged']           = 'הפרופיל עודכן בהצלחה';
+$lang['profnodelete']          = 'ויקי  אינה תומכת במחיקת משתמשים';
+$lang['profdeleteuser']        = 'הסר חשבון';
+$lang['profdeleted']           = 'חשבון המשתמש שלך נמחק מויקי זה';
+$lang['profconfdelete']        = 'ברצוני להסיר את החשבון שלי מוויקי זה. <br/> לא ניתן לבטל פעולה זו.';
+$lang['profconfdeletemissing'] = 'תיבת אישור אינו מסומן';
+$lang['proffail']              = 'פרופיל המשתמש לא עודכן';
+$lang['pwdforget']             = 'שכחת את הססמה שלך? ניתן לקבל חדשה';
+$lang['resendna']              = 'הוויקי הזה אינו תומך בחידוש ססמה';
+$lang['resendpwd']             = 'הגדר סיסמא חדשה בעבור';
+$lang['resendpwdmissing']      = 'עליך למלא את כל השדות, עמך הסליחה.';
+$lang['resendpwdnouser']       = 'משתמש בשם זה לא נמצא במסד הנתונים, עמך הסליחה.';
+$lang['resendpwdbadauth']      = 'קוד אימות זה אינו תקף. יש לוודא כי נעשה שימוש בקישור האימות המלא, עמך הסליחה.';
+$lang['resendpwdconfirm']      = 'נשלח קישור לאימות נשלח בדוא״ל.';
+$lang['resendpwdsuccess']      = 'נשלחה ססמה חדשה בדוא״ל';
+$lang['license']               = 'למעט מקרים בהם צוין אחרת, התוכן בוויקי זה זמין לפי הרישיון הבא:';
+$lang['licenseok']             = 'נא לשים לב: עריכת דף זה מהווה הסכמה מצדך להצגת התוכן שהוספת בהתאם הרישיון הבא:';
+$lang['searchmedia']           = 'חיפוש שם קובץ:';
+$lang['searchmedia_in']        = 'חיפוש תחת %s';
+$lang['txt_upload']            = 'בחירת קובץ להעלות:';
+$lang['txt_filename']          = 'העלאה בשם (נתון לבחירה):';
+$lang['txt_overwrt']           = 'שכתוב על קובץ קיים';
+$lang['maxuploadsize']         = 'העלה מקסימום. %s לכל קובץ.';
+$lang['lockedby']              = 'נעול על ידי:';
+$lang['lockexpire']            = 'הנעילה פגה:';
+$lang['js']['willexpire']      = 'הנעילה תחלוף עוד זמן קצר. \nלמניעת התנגשויות יש להשתמש בכפתור הרענון מטה כדי לאפס את מד משך הנעילה.';
+$lang['js']['notsavedyet']     = 'שינויים שלא נשמרו ילכו לאיבוד.';
+$lang['js']['searchmedia']     = 'חיפוש אחר קבצים';
+$lang['js']['keepopen']        = 'השארת חלון פתוח על הבחירה';
+$lang['js']['hidedetails']     = 'הסתרת פרטים';
+$lang['js']['mediatitle']      = 'הגדרות הקישור';
+$lang['js']['mediadisplay']    = 'סוג הקישור';
+$lang['js']['mediaalign']      = 'יישור';
+$lang['js']['mediasize']       = 'גודל התמונה';
+$lang['js']['mediatarget']     = 'יעד הקישור';
+$lang['js']['mediaclose']      = 'סגירה';
+$lang['js']['mediainsert']     = 'הוספה';
+$lang['js']['mediadisplayimg'] = 'הצגת התמונה.';
+$lang['js']['mediadisplaylnk'] = 'הצגת הקישור בלבד.';
+$lang['js']['mediasmall']      = 'גרסה קטנה';
+$lang['js']['mediamedium']     = 'גרסה בינונית';
+$lang['js']['medialarge']      = 'גרסה גדולה';
+$lang['js']['mediaoriginal']   = 'הגרסה המקורית';
+$lang['js']['medialnk']        = 'קישור לעמוד הפרטים';
+$lang['js']['mediadirect']     = 'הקישור הישיר למקור';
+$lang['js']['medianolnk']      = 'אין קישור';
+$lang['js']['medianolink']     = 'אין לקשר לתמונה';
+$lang['js']['medialeft']       = 'יישור התמונה לשמאל.';
+$lang['js']['mediaright']      = 'יישור התמונה לימין.';
+$lang['js']['mediacenter']     = 'מרכוז התמונה.';
+$lang['js']['medianoalign']    = 'לא להשתמש ביישור.';
+$lang['js']['nosmblinks']      = 'קישור לכונני שיתוף של Windows עובד רק באמצעות Microsoft Internet Explorer.
+עדיין ניתן להעתיק ולהדביק את הקישור.';
+$lang['js']['linkwiz']         = 'אשף הקישורים';
+$lang['js']['linkto']          = 'קישור אל:';
+$lang['js']['del_confirm']     = 'באמת למחוק?';
+$lang['js']['restore_confirm'] = 'באמת לשחזר את הגירסא הזאת?';
+$lang['js']['media_diff']      = 'הצגת הבדלים:';
+$lang['js']['media_diff_both'] = 'זה לצד זה';
+$lang['js']['media_diff_opacity'] = 'ניקוי דרך';
+$lang['js']['media_diff_portions'] = 'לחבוט';
+$lang['js']['media_select']    = 'בחר קבצים...';
+$lang['js']['media_upload_btn'] = 'העלאה';
+$lang['js']['media_done_btn']  = 'בוצע';
+$lang['js']['media_drop']      = 'גרור לכאן קבצים בכדי להעלותם';
+$lang['js']['media_cancel']    = 'הסר';
+$lang['js']['media_overwrt']   = 'שכתב קבצים קיימים';
+$lang['rssfailed']             = 'אירע כשל בעת קבלת הזנה זו:';
+$lang['nothingfound']          = 'לא נמצאו תוצאות.';
+$lang['mediaselect']           = 'קובצי מדיה';
+$lang['uploadsucc']            = 'ההעלאה הושלמה בהצלחה';
+$lang['uploadfail']            = 'אירעה שגיאה בעת העלאת הקובץ. היתכן שתקלה זו נוצרה עקב הרשאות שגיות?';
+$lang['uploadwrong']           = 'ההעלאה לא אושרה. קבצים בסיומת זו אסורים!';
+$lang['uploadexist']           = 'הקובץ כבר קיים. הפעולה בוטלה.';
+$lang['uploadbadcontent']      = 'התוכן שהועלה לא תאם את הסיומת %s של הקובץ.';
+$lang['uploadspam']            = 'ההעלאה נחסמה על ידי רשימת חסימת הספאם.';
+$lang['uploadxss']             = 'ההעלאה נחסמה בשל חשד לתוכן זדוני.';
+$lang['uploadsize']            = 'הקובץ שהועלה היה גדול מדי. (%s לכל היותר)';
+$lang['deletesucc']            = 'הקובץ %s נמחק.';
+$lang['deletefail']            = 'לא ניתן למחוק את "%s" -- נא לבדוק את ההרשאות.';
+$lang['mediainuse']            = 'הקובץ "%s" לא נמחק - הוא עדיין בשימוש.';
+$lang['namespaces']            = 'שמות מתחם';
+$lang['mediafiles']            = 'קבצים זמינים תחת';
+$lang['accessdenied']          = 'אין לך הרשאה לצפות בדף זה.';
+$lang['mediausage']            = 'יש להשתמש בתחביר הבא כדי להפנות לקובץ זה:';
+$lang['mediaview']             = 'הצגת  הקובץ המקורי';
+$lang['mediaroot']             = 'root';
+$lang['mediaupload']           = 'כאן ניתן להעלות קובץ למרחב השם הנוכחי. ליצירת תת־מרחבי שם יש לצרף אותם לתחילת שם הקובץ, מופרדים בפסיקים, בשם הקובץ תחת "העלאה בתור".';
+$lang['mediaextchange']        = 'סיומת הקובץ השתנתה מ־‎.%s ל־‎.%s!';
+$lang['reference']             = 'הפניות אל';
+$lang['ref_inuse']             = 'לא ניתן למחוק קובץ זה, כיוון שהדפים הבאים עדיין משתמשים בו:';
+$lang['ref_hidden']            = 'חלק מההפניות נמצאות בדפים שאין לך הרשאות לקרוא אותם';
+$lang['hits']                  = 'ביקורים';
+$lang['quickhits']             = 'שמות דפים שנמצאו';
+$lang['toc']                   = 'תוכן עניינים';
+$lang['current']               = 'הגרסה הנוכחית';
+$lang['yours']                 = 'הגרסה שלך';
+$lang['diff']                  = 'הצגת שינוים מגרסה זו ועד הנוכחית';
+$lang['diff2']                 = 'הצגת הבדלים בין הגרסאות שנבחרו';
+$lang['difflink']              = 'קישור לתצוגה השוואה זו';
+$lang['diff_type']             = 'הצגת הבדלים:';
+$lang['diff_inline']           = 'באותה השורה';
+$lang['diff_side']             = 'זה לצד זה';
+$lang['diffprevrev']           = 'הגירסה הקודמת';
+$lang['diffnextrev']           = 'הגירסה הבאה';
+$lang['difflastrev']           = 'הגירסה האחרונה';
+$lang['diffbothprevrev']       = 'גירסה קודמת בשני הצדדים';
+$lang['diffbothnextrev']       = 'הגירסה הבאה בשני הצדדים';
+$lang['line']                  = 'שורה';
+$lang['breadcrumb']            = 'ביקורים אחרונים:';
+$lang['youarehere']            = 'זהו מיקומך:';
+$lang['lastmod']               = 'מועד השינוי האחרון:';
+$lang['by']                    = 'על ידי';
+$lang['deleted']               = 'נמחק';
+$lang['created']               = 'נוצר';
+$lang['restored']              = 'שוחזר (%s)';
+$lang['external_edit']         = 'עריכה חיצונית';
+$lang['summary']               = 'תקציר העריכה';
+$lang['noflash']               = '<a href="http://www.adobe.com/products/flashplayer/">תוסף פלאש לדפדפן</a> נדרש כדי להציג תוכן זה.';
+$lang['download']              = 'הורדת מקטע';
+$lang['tools']                 = 'כלים';
+$lang['user_tools']            = 'כלים של משתמש';
+$lang['site_tools']            = 'כלים של אתר';
+$lang['page_tools']            = 'כלים של דף';
+$lang['skip_to_content']       = 'עבור לתוכן';
+$lang['sidebar']               = 'הסרגל הצידי';
+$lang['mail_newpage']          = 'דף נוסף:';
+$lang['mail_changed']          = 'דף שונה:';
+$lang['mail_subscribe_list']   = 'דפים שהשתנו במרחב השם:';
+$lang['mail_new_user']         = 'משתמש חדש:';
+$lang['mail_upload']           = 'קובץ הועלה:';
+$lang['changes_type']          = 'צפו בשינויים של';
+$lang['pages_changes']         = 'דפים';
+$lang['media_changes']         = 'קבצי מדיה';
+$lang['both_changes']          = 'קבצי מדיה ודפים ';
+$lang['qb_bold']               = 'טקסט מודגש';
+$lang['qb_italic']             = 'טקסט נטוי';
+$lang['qb_underl']             = 'טקסט עם קו תחתון';
+$lang['qb_code']               = 'קוד';
+$lang['qb_strike']             = 'טקסט מחוק';
+$lang['qb_h1']                 = 'כותרת רמה 1';
+$lang['qb_h2']                 = 'כותרת רמה 2';
+$lang['qb_h3']                 = 'כותרת רמה 3';
+$lang['qb_h4']                 = 'כותרת רמה 4';
+$lang['qb_h5']                 = 'כותרת רמה 5';
+$lang['qb_h']                  = 'כותרת';
+$lang['qb_hs']                 = 'כותרת נבחרת';
+$lang['qb_hplus']              = 'כותרת ברמה גבוהה יותר';
+$lang['qb_hminus']             = 'כותרת ברמה נמוכה יותר';
+$lang['qb_hequal']             = 'כותרת באותה רמה';
+$lang['qb_link']               = 'קישור פנימי';
+$lang['qb_extlink']            = 'קישור חיצוני';
+$lang['qb_hr']                 = 'קו אופקי';
+$lang['qb_ol']                 = 'איבר ברשימה ממוספרת';
+$lang['qb_ul']                 = 'איבר ברשימה לא ממוספרת';
+$lang['qb_media']              = 'תמונות וקבצים אחרים';
+$lang['qb_sig']                = 'הוספת חתימה';
+$lang['qb_smileys']            = 'חייכנים';
+$lang['qb_chars']              = 'תווים מיוחדים';
+$lang['upperns']               = 'מעבר למרחב השם שברמה שמעל הנוכחית';
+$lang['metaedit']              = 'עריכת נתוני העל';
+$lang['metasaveerr']           = 'אירע כשל בשמירת נתוני העל';
+$lang['metasaveok']            = 'נתוני העל נשמרו';
+$lang['img_title']             = 'שם:';
+$lang['img_caption']           = 'כותרת:';
+$lang['img_date']              = 'תאריך:';
+$lang['img_fname']             = 'שם הקובץ:';
+$lang['img_fsize']             = 'גודל:';
+$lang['img_artist']            = 'צלם:';
+$lang['img_copyr']             = 'זכויות יוצרים:';
+$lang['img_format']            = 'מבנה:';
+$lang['img_camera']            = 'מצלמה:';
+$lang['img_keywords']          = 'מילות מפתח:';
+$lang['img_width']             = 'רוחב:';
+$lang['img_height']            = 'גובה:';
+$lang['subscr_subscribe_success'] = '%s נוסף לרשימת המינויים לדף %s';
+$lang['subscr_subscribe_error'] = 'אירעה שגיאה בהוספת %s לרשימת המינויים לדף %s';
+$lang['subscr_subscribe_noaddress'] = 'אין כתובת המשויכת עם הכניסה שלך, נא ניתן להוסיף אותך לרשימת המינויים';
+$lang['subscr_unsubscribe_success'] = 'המשתמש %s הוסר מרשימת המינויים לדף %s';
+$lang['subscr_unsubscribe_error'] = 'אירעה שגיאה בהסרת %s מרשימת המינויים לדף %s';
+$lang['subscr_already_subscribed'] = 'המשתמש %s כבר מנוי לדף %s';
+$lang['subscr_not_subscribed'] = 'המשתמש %s איננו רשום לדף %s';
+$lang['subscr_m_not_subscribed'] = 'המשתמש שלך אינו רשום, נכון לעכשיו, לדף הנוכחי או למרחב השם.';
+$lang['subscr_m_new_header']   = 'הוספת מינוי';
+$lang['subscr_m_current_header'] = 'המינויים הנוכחיים';
+$lang['subscr_m_unsubscribe']  = 'ביטול המינוי';
+$lang['subscr_m_subscribe']    = 'מינוי';
+$lang['subscr_m_receive']      = 'קבלת';
+$lang['subscr_style_every']    = 'דוא״ל עם כל שינוי';
+$lang['subscr_style_digest']   = 'הודעת דוא״ל המציגה את כל השינויים בכל עמוד (בכל %.2f ימים)';
+$lang['subscr_style_list']     = 'רשימת השינויים בדפים מאז הודעת הדוא״ל האחרונה (בכל %.2f ימים)';
+$lang['authtempfail']          = 'אימות משתמשים אינו זמין כרגע. אם מצב זה נמשך נא ליידע את מנהל הוויקי.';
+$lang['i_chooselang']          = 'נא לבחור שפה';
+$lang['i_installer']           = 'תכנית ההתקנה של DokuWiki';
+$lang['i_wikiname']            = 'שם הוויקי';
+$lang['i_enableacl']           = 'הפעלת ACL (מומלץ)';
+$lang['i_superuser']           = 'משתמש־על';
+$lang['i_problems']            = 'תכנית ההתקנה זיהתה מספר בעיות המפורטות להלן. אין באפשרותך להמשיך לפני תיקונן.';
+$lang['i_modified']            = 'משיקולי אבטחה סקריפט זה יעבוד אך ורק עם התקנת DokuWiki חדשה שלא עברה כל שינוי.
+                         עליך לחלץ שנית את הקבצים מהחבילה שהורדה או להיעזר בדף
+                         <a href="http://dokuwiki.org/install">Dokuwiki installation instructions</a>';
+$lang['i_funcna']              = 'פונקציית ה-PHP&#8207; <code>%s</code> אינה זמינה. יתכן כי מארח האתר חסם אותה מסיבה כלשהי?';
+$lang['i_phpver']              = 'גרסת PHP שלך <code>%s</code> נמוכה מ <code>%s</code> הצורך. אתה צריך לשדרג PHP שלך להתקין.';
+$lang['i_mbfuncoverload']      = 'יש לבטל את mbstring.func_overload בphp.ini בכדי להריץ את DokuWiki';
+$lang['i_permfail']            = '<code>%s</code> אינה ניתנת לכתיבה על ידי DokuWiki. עליך לשנות הרשאות תיקייה זו!';
+$lang['i_confexists']          = '<code>%s</code> כבר קיים';
+$lang['i_writeerr']            = 'אין אפשרות ליצור את <code>%s</code>. נא לבדוק את הרשאות הקובץ/תיקייה וליצור את הקובץ ידנית.';
+$lang['i_badhash']             = 'הקובץ Dokuwiki.php אינו מזוהה או שעבר שינויים (hash=<code>%s</code>)';
+$lang['i_badval']              = '<code>%s</code> - הערך אינו חוקי או ריק';
+$lang['i_success']             = 'תהליך ההגדרה הסתיים בהצלחה. כעת ניתן למחוק את הקובץ install.php ולהמשיך אל ה־<a href="doku.php?id=wiki:welcome">DokuWiki החדש שלך</a>.';
+$lang['i_failure']             = 'מספר שגיאות אירעו בעת כתיבת קובצי התצורה. יתכן כי יהיה צורך לתקנם ידנית לפני שניתן יהיה להשתמש ב־<a href="doku.php?id=wiki:welcome">DokuWiki החדש שלך</a>.';
+$lang['i_policy']              = 'מדיניות ACL התחלתית';
+$lang['i_pol0']                = 'ויקי פתוח (קריאה, כתיבה והעלאה לכולם)';
+$lang['i_pol1']                = ' ויקי ציבורי (קריאה לכולם, כתיבה והעלאה למשתמשים רשומים)';
+$lang['i_pol2']                = 'ויקי סגור (קריאה, כתיבה והעלאה למשתמשים רשומים בלבד)';
+$lang['i_allowreg']            = 'אפשר למשתמשים לרשום את עצמם';
+$lang['i_retry']               = 'ניסיון נוסף';
+$lang['i_license']             = 'נא לבחור את הרישיון שיחול על התוכן שבוויקי שלך:';
+$lang['i_license_none']        = 'אל תציג כל מידע רישיון';
+$lang['i_pop_field']           = 'אנא, עזרו לנו לשפר את חווית ה DokuWiki:';
+$lang['i_pop_label']           = 'פעם בחודש, לשלוח את נתוני שימוש אנונימיים למפתחי DokuWiki';
+$lang['recent_global']         = 'נכון לעכשיו מתנהל על ידיך מעקב אחר מרחב השם <b>%s</b>. כמו כן, באפשרותך <a href="%s">לצפות בשינויים האחרונים בוויקי כולו</a>.';
+$lang['years']                 = 'לפני %d שנים';
+$lang['months']                = 'לפני %d חודשים';
+$lang['weeks']                 = 'לפני %d שבועות';
+$lang['days']                  = 'לפני %d ימים';
+$lang['hours']                 = 'לפני %d שעות';
+$lang['minutes']               = 'לפני %d דקות';
+$lang['seconds']               = 'לפני %d שניות';
+$lang['wordblock']             = 'השינויים שלך לא נשמרו כיוון שהם מכילים טקסט חסום (ספאם).';
+$lang['media_uploadtab']       = 'להעלות';
+$lang['media_searchtab']       = 'חיפוש';
+$lang['media_file']            = 'קובץ';
+$lang['media_viewtab']         = 'תצוגה';
+$lang['media_edittab']         = 'עריכה';
+$lang['media_historytab']      = 'היסטוריה';
+$lang['media_list_thumbs']     = 'תמונות ממוזערות';
+$lang['media_list_rows']       = 'שורות';
+$lang['media_sort_name']       = 'שם';
+$lang['media_sort_date']       = 'תאריך';
+$lang['media_namespaces']      = 'בחר מרחב שמות';
+$lang['media_files']           = 'קבצים ב %s';
+$lang['media_upload']          = 'להעלות %s';
+$lang['media_search']          = 'חיפוש ב%s';
+$lang['media_view']            = '%s';
+$lang['media_viewold']         = '%s ב %s';
+$lang['media_edit']            = 'ערוך %s';
+$lang['media_history']         = 'היסטוריה של %s';
+$lang['media_meta_edited']     = 'metadata נערך';
+$lang['media_perm_read']       = 'מצטערים, אין לך הרשאות לקרוא קבצים.';
+$lang['media_perm_upload']     = 'מצטערים, אין לך הרשאות להעלות קבצים.';
+$lang['media_update']          = 'העלה גירסה חדשה';
+$lang['media_restore']         = 'שחזר גירסה זו';
+$lang['media_acl_warning']     = 'רשימה זו עלולה להיות חסרה עכב חוסר בהרשאות או דפים מוסתרים';
+$lang['currentns']             = 'שם מרחב נוכחי';
+$lang['searchresult']          = 'תוצאות חיפוש';
+$lang['plainhtml']             = 'HTML פשוט';
+$lang['page_nonexist_rev']     = 'העמוד לא קיים ב%s. העמוד נוצר במקום זאת ב<a href="%s">%s</a>.';
+$lang['unable_to_parse_date']  = 'לא ניתן לפענח פרמטר "%s".';
+$lang['email_signature_text']  = 'הודעת דוא״ל זו נוצרה על ידי ה־DokuWiki הזמין בכתובת
+@DOKUWIKIURL@';
diff --git a/wiki/inc/lang/he/locked.txt b/wiki/inc/lang/he/locked.txt
new file mode 100644
index 0000000..307874a
--- /dev/null
+++ b/wiki/inc/lang/he/locked.txt
@@ -0,0 +1,3 @@
+====== דף נעול ======
+
+דף זה נעול כרגע לעריכה על ידי משתמש אחר. עליך להמתין עד שהמשתמש יסיים את העריכה או עד שהנעילה תפוג.
diff --git a/wiki/inc/lang/he/login.txt b/wiki/inc/lang/he/login.txt
new file mode 100644
index 0000000..5a575f1
--- /dev/null
+++ b/wiki/inc/lang/he/login.txt
@@ -0,0 +1,3 @@
+====== כניסה ======
+
+אינך ברשומות המערכת כרגע! יש להזין את נתוני ההזדהות מטה לכניסה. יש לאפשר עוגיות (cookies) כדי להכנס.
diff --git a/wiki/inc/lang/he/mailtext.txt b/wiki/inc/lang/he/mailtext.txt
new file mode 100644
index 0000000..f33760e
--- /dev/null
+++ b/wiki/inc/lang/he/mailtext.txt
@@ -0,0 +1,12 @@
+דף בDokuWiki נוסף או שונה. להלן הפרטים:
+
+תאריך        : @DATE@
+דפדפן     : @BROWSER@
+כתובת ה־IP&#8207;  : @IPADDRESS@
+שם המארח    : @HOSTNAME@
+המהדורה הישנה: @OLDPAGE@
+המהדורה החדשה: @NEWPAGE@
+תקציר העריכה: @SUMMARY@
+משתמש        : @USER@
+
+@DIFF@
diff --git a/wiki/inc/lang/he/newpage.txt b/wiki/inc/lang/he/newpage.txt
new file mode 100644
index 0000000..ac6fb73
--- /dev/null
+++ b/wiki/inc/lang/he/newpage.txt
@@ -0,0 +1,3 @@
+====== דף זה עדיין לא קיים ======
+
+הדף אליו הגעת עדיין לא קיים. לחיצה על הכפתור "יצירת דף" תצור אותו.
\ No newline at end of file
diff --git a/wiki/inc/lang/he/norev.txt b/wiki/inc/lang/he/norev.txt
new file mode 100644
index 0000000..3d08e16
--- /dev/null
+++ b/wiki/inc/lang/he/norev.txt
@@ -0,0 +1,4 @@
+====== גרסה לא קיימת ======
+
+הגרסה שהוזנה אינה קיימת. נא להשתמש בכפתור ''גרסאות קודמות'' להצגת רשימת הגרסאות של מסמך זה.
+
diff --git a/wiki/inc/lang/he/password.txt b/wiki/inc/lang/he/password.txt
new file mode 100644
index 0000000..bfa29b6
--- /dev/null
+++ b/wiki/inc/lang/he/password.txt
@@ -0,0 +1,6 @@
+שלום @FULLNAME@!
+
+הנה נתוני המשתמש שלך עבור @TITLE@ ב־@DOKUWIKIURL@
+
+שם כניסה     : @LOGIN@
+ססמה     : @PASSWORD@
diff --git a/wiki/inc/lang/he/preview.txt b/wiki/inc/lang/he/preview.txt
new file mode 100644
index 0000000..1331c23
--- /dev/null
+++ b/wiki/inc/lang/he/preview.txt
@@ -0,0 +1,4 @@
+====== תצוגה מקדימה ======
+
+זו תצוגה מקדימה של הדף לעתיד. להזכירך: **הדף עדיין לא נשמר!**
+
diff --git a/wiki/inc/lang/he/pwconfirm.txt b/wiki/inc/lang/he/pwconfirm.txt
new file mode 100644
index 0000000..3fa786c
--- /dev/null
+++ b/wiki/inc/lang/he/pwconfirm.txt
@@ -0,0 +1,9 @@
+שלום @FULLNAME@!
+
+מישהו ביקש ססמה חדשה עבור שם הכניסה שלך לוויקי @TITLE@ בכתובת @DOKUWIKIURL@
+
+אם לא ביקשת ססמה חדשה באפשרותך פשוט להתעלם מהודעת דוא״ל זו.
+
+כדי לאשר שהבקשה באמת נשלחה על ידך עליך השתמש בקישור הבא.
+
+@CONFIRM@
diff --git a/wiki/inc/lang/he/read.txt b/wiki/inc/lang/he/read.txt
new file mode 100644
index 0000000..18efc5e
--- /dev/null
+++ b/wiki/inc/lang/he/read.txt
@@ -0,0 +1,2 @@
+דף זה הוא דף לקריאה בלבד. ניתן לצפות בקוד המקור שלו, אך לא ניתן לערוך אותו. ניתן לפנות למנהל הוויקי אם לדעתך נפלה טעות.
+
diff --git a/wiki/inc/lang/he/recent.txt b/wiki/inc/lang/he/recent.txt
new file mode 100644
index 0000000..0febd96
--- /dev/null
+++ b/wiki/inc/lang/he/recent.txt
@@ -0,0 +1,5 @@
+====== שינויים אחרונים ======
+
+הדפים הבאים עברו שינויים לאחרונה.
+
+
diff --git a/wiki/inc/lang/he/register.txt b/wiki/inc/lang/he/register.txt
new file mode 100644
index 0000000..c4dfad7
--- /dev/null
+++ b/wiki/inc/lang/he/register.txt
@@ -0,0 +1,3 @@
+====== הרשמה כמשתמש חדש ======
+
+יש למלא את כל המידע להלן כדי ליצור חשבון חדש בוויקי זה. עליך לוודא כי הזנת **כתובת דוא״ל תקפה**- ססמתך החדשה תשלח לכתובת זו. על שם המשתמש להיות [[hdoku>ויקי:שם דף|שם דף]] תקף.
diff --git a/wiki/inc/lang/he/registermail.txt b/wiki/inc/lang/he/registermail.txt
new file mode 100644
index 0000000..2216cb3
--- /dev/null
+++ b/wiki/inc/lang/he/registermail.txt
@@ -0,0 +1,10 @@
+משתמש חדש נרשם. להלן הפרטים:
+
+שם משתמש   : @NEWUSER@
+שם מלא     : @NEWNAME@
+דוא״ל      : @NEWEMAIL@
+
+תאריך      : @DATE@
+דפדפן      : @BROWSER@
+כתובת IP&#8207;  : @IPADDRESS@
+שם המארח   : @HOSTNAME@
diff --git a/wiki/inc/lang/he/resendpwd.txt b/wiki/inc/lang/he/resendpwd.txt
new file mode 100644
index 0000000..8ca2720
--- /dev/null
+++ b/wiki/inc/lang/he/resendpwd.txt
@@ -0,0 +1,4 @@
+====== שליחת ססמה חדשה ======
+
+יש להזין את שם המשתמש בטופס מטה ולבקש ססמה חדשה לחשבון שלך בוויקי זה. הקישור לאימות יישלח לכתובת הדוא״ל באמצעותה נרשמת.
+
diff --git a/wiki/inc/lang/he/resetpwd.txt b/wiki/inc/lang/he/resetpwd.txt
new file mode 100644
index 0000000..bd7b5ac
--- /dev/null
+++ b/wiki/inc/lang/he/resetpwd.txt
@@ -0,0 +1,3 @@
+====== קבע סיסמה חדשה ======
+
+אנא הכנס סיסמה חדשה לחשבון שלך בויקי זה.
\ No newline at end of file
diff --git a/wiki/inc/lang/he/revisions.txt b/wiki/inc/lang/he/revisions.txt
new file mode 100644
index 0000000..6b23402
--- /dev/null
+++ b/wiki/inc/lang/he/revisions.txt
@@ -0,0 +1,4 @@
+====== גרסאות ישנות ======
+
+אלה גרסאות מוקדמות יותר של המסמך הנוכחי. כדי לשחזר גרסה מוקדמת יותר יש ללחוץ על הכפתור ''עריכה'' ולשמור את הדף.
+
diff --git a/wiki/inc/lang/he/searchpage.txt b/wiki/inc/lang/he/searchpage.txt
new file mode 100644
index 0000000..574629b
--- /dev/null
+++ b/wiki/inc/lang/he/searchpage.txt
@@ -0,0 +1,4 @@
+====== חיפוש ======
+
+ניתן לראות את תוצאות החיפוש למטה. @CREATEPAGEINFO@
+
diff --git a/wiki/inc/lang/he/showrev.txt b/wiki/inc/lang/he/showrev.txt
new file mode 100644
index 0000000..22ca0c3
--- /dev/null
+++ b/wiki/inc/lang/he/showrev.txt
@@ -0,0 +1,2 @@
+**זו גרסה ישנה של המסמך!** לחיצה על כותרת המסמך תציג את גרסתו הנוכחית.
+----
\ No newline at end of file
diff --git a/wiki/inc/lang/he/stopwords.txt b/wiki/inc/lang/he/stopwords.txt
new file mode 100644
index 0000000..ca85eb2
--- /dev/null
+++ b/wiki/inc/lang/he/stopwords.txt
@@ -0,0 +1,29 @@
+# זוהי רשימת מילים ממנה מתעלם סורק התוכן, אחת בכל שורה
+# בעורכך קובץ זה עליך לודא כי נעשה שימוש בסימני סוף שורה של UNIX (שורה חדשה ללא החזרת הסמן)
+# אין צורך לכלול מילים בנות פחות משלוש אותיות - אלו נפסחות בכל מקרה
+# רשימה זו מבוססת על אלו הנמצאות ב- http://www.ranks.nl/stopwords
+about
+are
+and
+you
+your
+them
+their
+com
+for
+from
+into
+how
+that
+the
+this
+was
+what
+when
+where
+who
+will
+with
+und
+the
+www
diff --git a/wiki/inc/lang/he/subscr_digest.txt b/wiki/inc/lang/he/subscr_digest.txt
new file mode 100644
index 0000000..5548a70
--- /dev/null
+++ b/wiki/inc/lang/he/subscr_digest.txt
@@ -0,0 +1,16 @@
+שלום!
+
+הדף @PAGE@ שבאתר הוויקי @TITLE@ השתנה.
+להלן השינויים:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+המהדורה הישנה: @OLDPAGE@
+המהדורה החדשה: @NEWPAGE@
+
+כדי לבטל את ההתרעות לשינויי העמוד, יש להיכנס לאתר הוויקי בכתובת
+@DOKUWIKIURL@ ואז לבקר באגף
+@SUBSCRIBE@
+ולבטל את המינוי לשינויים בדף ו/או במרחב השם.
diff --git a/wiki/inc/lang/he/subscr_single.txt b/wiki/inc/lang/he/subscr_single.txt
new file mode 100644
index 0000000..c2ddb72
--- /dev/null
+++ b/wiki/inc/lang/he/subscr_single.txt
@@ -0,0 +1,18 @@
+שלום!
+
+הדף @PAGE@ באתר הוויקי @TITLE@ השתנה.
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+תאריך : @DATE@
+משתמש : @USER@
+תקציר העריכה: @SUMMARY@
+המהדורה הישנה: @OLDPAGE@
+המהדורה החדשה: @NEWPAGE@
+
+לביטול התרעות בנוגע לעמוד, יש להיכנס לאתר הוויקי בכתובת
+@DOKUWIKIURL@ ואז לבקר בדף
+@SUBSCRIBE@
+ולבטל את המינוי לקבלת שינויים בדף ו/או במרחב השם.
diff --git a/wiki/inc/lang/he/updateprofile.txt b/wiki/inc/lang/he/updateprofile.txt
new file mode 100644
index 0000000..494d838
--- /dev/null
+++ b/wiki/inc/lang/he/updateprofile.txt
@@ -0,0 +1,5 @@
+====== עידכון פרטי חשבונך ======
+
+אין צורך למלא מעבר לפרטים המיועדים לשינוי. לא ניתן לשנות את שם המשתמש.
+
+
diff --git a/wiki/inc/lang/he/uploadmail.txt b/wiki/inc/lang/he/uploadmail.txt
new file mode 100644
index 0000000..9c06f13
--- /dev/null
+++ b/wiki/inc/lang/he/uploadmail.txt
@@ -0,0 +1,10 @@
+קובץ הועלה אל הדוקוויקי שלך. הנה פרטיו:
+
+קובץ : @MEDIA@
+תאריך : @DATE@
+דפדפן : @BROWSER@
+כתובת IP : @IPADDRESS@
+מארח : @HOSTNAME@
+גודל : @SIZE@
+סיווג : @MIME@
+משתמש : @USER@
diff --git a/wiki/inc/lang/hi/diff.txt b/wiki/inc/lang/hi/diff.txt
new file mode 100644
index 0000000..6f88c19
--- /dev/null
+++ b/wiki/inc/lang/hi/diff.txt
@@ -0,0 +1,3 @@
+======असमानता======
+
+यह आपको  पृष्ठ के दो संस्करणों के बीच असमानता को दर्शाता है. 
\ No newline at end of file
diff --git a/wiki/inc/lang/hi/jquery.ui.datepicker.js b/wiki/inc/lang/hi/jquery.ui.datepicker.js
new file mode 100644
index 0000000..3b12097
--- /dev/null
+++ b/wiki/inc/lang/hi/jquery.ui.datepicker.js
@@ -0,0 +1,37 @@
+/* Hindi initialisation for the jQuery UI date picker plugin. */
+/* Written by Michael Dawart. */
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "../widgets/datepicker" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery.datepicker );
+	}
+}( function( datepicker ) {
+
+datepicker.regional.hi = {
+	closeText: "बंद",
+	prevText: "पिछला",
+	nextText: "अगला",
+	currentText: "आज",
+	monthNames: [ "जनवरी ","फरवरी","मार्च","अप्रेल","मई","जून",
+	"जूलाई","अगस्त ","सितम्बर","अक्टूबर","नवम्बर","दिसम्बर" ],
+	monthNamesShort: [ "जन", "फर", "मार्च", "अप्रेल", "मई", "जून",
+	"जूलाई", "अग", "सित", "अक्ट", "नव", "दि" ],
+	dayNames: [ "रविवार", "सोमवार", "मंगलवार", "बुधवार", "गुरुवार", "शुक्रवार", "शनिवार" ],
+	dayNamesShort: [ "रवि", "सोम", "मंगल", "बुध", "गुरु", "शुक्र", "शनि" ],
+	dayNamesMin: [ "रवि", "सोम", "मंगल", "बुध", "गुरु", "शुक्र", "शनि" ],
+	weekHeader: "हफ्ता",
+	dateFormat: "dd/mm/yy",
+	firstDay: 1,
+	isRTL: false,
+	showMonthAfterYear: false,
+	yearSuffix: "" };
+datepicker.setDefaults( datepicker.regional.hi );
+
+return datepicker.regional.hi;
+
+} ) );
diff --git a/wiki/inc/lang/hi/lang.php b/wiki/inc/lang/hi/lang.php
new file mode 100644
index 0000000..79bc0a1
--- /dev/null
+++ b/wiki/inc/lang/hi/lang.php
@@ -0,0 +1,116 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * 
+ * @author Abhinav Tyagi <abhinavtyagi11@gmail.com>
+ * @author yndesai@gmail.com
+ * @author Santosh Joshi <sanjujoshhi@gmail.com>
+ */
+$lang['encoding']              = 'utf-8';
+$lang['direction']             = 'ltr';
+$lang['doublequoteopening']    = '“';
+$lang['doublequoteclosing']    = '”';
+$lang['singlequoteopening']    = '‘';
+$lang['singlequoteclosing']    = '’';
+$lang['apostrophe']            = '’';
+$lang['btn_edit']              = 'यह पृष्ठ संपादित करें';
+$lang['btn_source']            = 'पृष्ठ का श्रोत दिखाएँ';
+$lang['btn_show']              = 'पृष्ठ दिखाएँ';
+$lang['btn_create']            = 'इस पृष्ठ को बनायें';
+$lang['btn_search']            = 'खोजें';
+$lang['btn_save']              = 'सुरक्षित करें';
+$lang['btn_preview']           = 'पूर्वावलोकन';
+$lang['btn_top']               = 'वापस शीर्ष पर';
+$lang['btn_newer']             = '<< अधिक विगत';
+$lang['btn_older']             = 'अमूल विगत >>';
+$lang['btn_revs']              = 'पुराने संशोधन';
+$lang['btn_recent']            = 'विगत परिवर्तन';
+$lang['btn_upload']            = 'अपलोड करें';
+$lang['btn_cancel']            = 'रद्द करें';
+$lang['btn_index']             = 'सूचकांक';
+$lang['btn_secedit']           = 'संपादित करें';
+$lang['btn_login']             = 'लॉग इन';
+$lang['btn_logout']            = 'लॉगआउट';
+$lang['btn_admin']             = 'व्यवस्थापक';
+$lang['btn_update']            = 'अद्यतन करना';
+$lang['btn_delete']            = 'मिटाना';
+$lang['btn_back']              = 'पीछे';
+$lang['btn_backlink']          = 'पिछली कड़ियाँ';
+$lang['btn_subscribe']         = 'सदस्यता प्रबंधन';
+$lang['btn_profile']           = 'परिचय संपादित करें';
+$lang['btn_resendpwd']         = 'नया पासवर्ड सेट करें';
+$lang['btn_draft']             = 'प्रारूप सम्पादित करें';
+$lang['btn_draftdel']          = 'प्रारूप मिटायें';
+$lang['btn_revert']            = 'वापस लौटाएं';
+$lang['btn_apply']             = 'लागू करें';
+$lang['btn_deleteuser']        = 'खाता मिटायें';
+$lang['user']                  = 'उपयोगकर्ता का नाम';
+$lang['pass']                  = 'गुप्त शब्द';
+$lang['newpass']               = 'नव गुप्त शब्द';
+$lang['passchk']               = 'पासवर्ड दुबारा लिखें';
+$lang['remember']              = 'मुझे स्मृत रखना';
+$lang['fullname']              = 'सही नाम';
+$lang['email']                 = 'ईमेल';
+$lang['badlogin']              = 'छमा करें, उपयोगकर्ता का नाम व गुप्त शब्द ग़लत था |';
+$lang['minoredit']             = 'अमूल चूल परिवर्तन';
+$lang['regmissing']            = 'छमा करें, आपको सारे रिक्त स्थान भरने पड़ेंगे |';
+$lang['regbadpass']            = 'दोनो दिए गये गुप्तशब्द समान नहीं हैं | दोबारा प्रयास करें |';
+$lang['regpwmail']             = 'आपकी डोकुविकी का गुप्तशब्द';
+$lang['reghere']               = 'आपके पास अभी तक कोई खाता नहीं है? बस एक लें |';
+$lang['profna']                = 'यह विकी प्रोफ़ाइल संशोधन का समर्थन नहीं करता |';
+$lang['profnochange']          = 'कोई परिवर्तन नहीं, कुछ नहीं करना |';
+$lang['resendpwdmissing']      = 'छमा करें, आपको सारे रिक्त स्थान भरने पड़ेंगे |';
+$lang['resendpwdsuccess']      = 'आपका नवगुप्तशब्द ईमेल द्वारा सम्प्रेषित कर दिया गया है |';
+$lang['txt_upload']            = 'अपलोड करने के लिए फ़ाइल चुनें:';
+$lang['txt_filename']          = 'के रूप में अपलोड करें (वैकल्पिक):';
+$lang['txt_overwrt']           = 'अधिलेखित उपस्थित फ़ाइल';
+$lang['lockedby']              = 'इस समय तक बंद:';
+$lang['lockexpire']            = 'बंद समाप्त होगा:';
+$lang['js']['hidedetails']     = 'विवरण छिपाएँ';
+$lang['nothingfound']          = 'कुच्छ नहीं मिला |';
+$lang['uploadexist']           = 'फ़ाइल पहले से उपस्थित है. कुछ भी नहीं किया |';
+$lang['mediafiles']            = 'उपलब्ध फाइलों में';
+$lang['mediaview']             = 'मूल फ़ाइल देखें';
+$lang['reference']             = 'संदर्भ के लिए';
+$lang['ref_hidden']            = 'कुच्छ संदर्भ उन पन्नो पर हैं जिनको पड़ने की आपको अनुमति नहीं है|';
+$lang['toc']                   = 'विषय सूची';
+$lang['current']               = 'वर्तमान';
+$lang['yours']                 = 'आपका संस्करणः';
+$lang['diff']                  = 'वर्तमान संशोधन में मतभेद दिखाइये |';
+$lang['diff2']                 = 'चयनित संशोधन के बीच में मतभेद दिखाइये |';
+$lang['line']                  = 'रेखा';
+$lang['youarehere']            = 'आप यहाँ हैं |:';
+$lang['lastmod']               = 'अंतिम बार संशोधित:';
+$lang['by']                    = 'के द्वारा';
+$lang['deleted']               = 'हटाया';
+$lang['created']               = 'निर्मित';
+$lang['external_edit']         = 'बाह्य सम्पादित';
+$lang['summary']               = 'सारांश संपादित करें';
+$lang['mail_newpage']          = 'पृष्ठ जोड़ा:';
+$lang['mail_changed']          = 'पृष्ठ बदला:';
+$lang['mail_new_user']         = 'नये उपयोगकर्ता:';
+$lang['mail_upload']           = 'अपलोड की गई फ़ाइल:';
+$lang['qb_bold']               = 'बोल्ड पाठ्य';
+$lang['qb_h1']                 = 'स्तर 1 शीर्षपंक्ति';
+$lang['qb_h2']                 = 'स्तर 2 शीर्षपंक्ति';
+$lang['qb_h3']                 = 'स्तर 3 शीर्षपंक्ति';
+$lang['qb_h4']                 = 'स्तर 4 शीर्षपंक्ति';
+$lang['qb_h5']                 = 'स्तर 5 शीर्षपंक्ति';
+$lang['qb_link']               = 'आंतरिक कड़ी';
+$lang['qb_extlink']            = 'बाह्य कड़ी';
+$lang['qb_hr']                 = 'खड़ी रेखा';
+$lang['qb_sig']                = 'हस्ताक्षर डालें';
+$lang['btn_img_backto']            = 'वापस जाना %s';
+$lang['img_title']             = 'शीर्षक:';
+$lang['img_caption']           = 'सहशीर्षक:';
+$lang['img_date']              = 'तिथि:';
+$lang['img_fsize']             = 'आकार:';
+$lang['img_artist']            = 'फोटोग्राफर:';
+$lang['img_format']            = 'प्रारूप:';
+$lang['img_camera']            = 'कैमरा:';
+$lang['i_chooselang']          = 'अपनी भाषा चुनें';
+$lang['i_installer']           = 'डोकुविकी इंस्टॉलर';
+$lang['i_wikiname']            = 'विकी का नाम';
+$lang['i_superuser']           = 'महाउपयोगकर्ता';
+$lang['i_retry']               = 'पुनःप्रयास';
diff --git a/wiki/inc/lang/hr/admin.txt b/wiki/inc/lang/hr/admin.txt
new file mode 100644
index 0000000..eaf4d78
--- /dev/null
+++ b/wiki/inc/lang/hr/admin.txt
@@ -0,0 +1,3 @@
+====== Administracija ======
+
+Slijedi popis svih administracijskih poslova koji su trenutno dostupni.
diff --git a/wiki/inc/lang/hr/adminplugins.txt b/wiki/inc/lang/hr/adminplugins.txt
new file mode 100644
index 0000000..5a7656d
--- /dev/null
+++ b/wiki/inc/lang/hr/adminplugins.txt
@@ -0,0 +1 @@
+===== Dodatni dodatci =====
\ No newline at end of file
diff --git a/wiki/inc/lang/hr/backlinks.txt b/wiki/inc/lang/hr/backlinks.txt
new file mode 100644
index 0000000..0583891
--- /dev/null
+++ b/wiki/inc/lang/hr/backlinks.txt
@@ -0,0 +1,3 @@
+====== Veze na stranicu ======
+
+Slijedi popis svih stranica koje imaju poveznicu na trenutnu stranicu.
diff --git a/wiki/inc/lang/hr/conflict.txt b/wiki/inc/lang/hr/conflict.txt
new file mode 100644
index 0000000..82fdd33
--- /dev/null
+++ b/wiki/inc/lang/hr/conflict.txt
@@ -0,0 +1,5 @@
+====== Postoji novija inačica ======
+
+Već postoji novija inačica dokumenta kojeg ste mijenjali. To se događa jer je neki drugi korisnik snimio dokument za vrijeme dok ste ga Vi mijenjali.
+
+Proučite promjene koje slijede i odaberite koje želite preuzeti. Odaberite ''Pohrani'' da biste snimili Vašu inačicu ili ''Poništi'' da ostavite sačuvanu trenutnu inačicu dokumenta.
diff --git a/wiki/inc/lang/hr/denied.txt b/wiki/inc/lang/hr/denied.txt
new file mode 100644
index 0000000..0613b58
--- /dev/null
+++ b/wiki/inc/lang/hr/denied.txt
@@ -0,0 +1,4 @@
+====== Niste ovlašteni ======
+
+Nemate potrebne ovlasti za nastavak.
+
diff --git a/wiki/inc/lang/hr/diff.txt b/wiki/inc/lang/hr/diff.txt
new file mode 100644
index 0000000..295397a
--- /dev/null
+++ b/wiki/inc/lang/hr/diff.txt
@@ -0,0 +1,3 @@
+====== Razlike ======
+
+Slijede razlike između dviju inačica stranice
diff --git a/wiki/inc/lang/hr/draft.txt b/wiki/inc/lang/hr/draft.txt
new file mode 100644
index 0000000..6caa26e
--- /dev/null
+++ b/wiki/inc/lang/hr/draft.txt
@@ -0,0 +1,4 @@
+====== Pronađen prethodni pokušaj izmjena ======
+
+Vaše zadnje uređivanje ove stranice nije završilo uredno. DokuWiki je automatski pohranio kopiju tijekom rada koju sada možete iskoristiti da nastavite uređivanje. Niže možete vidjeti sadržaj koji je pohranjen pri vašem zadnjem uređivanju.
+Molimo odlučite da li želite //vratiti// ili //obrisati// pohranjeni sadržaj pri vašem zadnjem neuspjelom uređivanju, ili pak želite //odustati// od uređivanja.
diff --git a/wiki/inc/lang/hr/edit.txt b/wiki/inc/lang/hr/edit.txt
new file mode 100644
index 0000000..7ed55d5
--- /dev/null
+++ b/wiki/inc/lang/hr/edit.txt
@@ -0,0 +1 @@
+Uredite stranicu i pritisnite "Pohrani". Pogledajte [[wiki:syntax]] za Wiki sintaksu. Molimo izmijenite samo ako možete unaprijediti sadržaj. Ako trebate testirati ili naučiti kako se nešto radi, molimo koristite za to namijenjene stranice kao što je [[playground:playground|igraonica]].
diff --git a/wiki/inc/lang/hr/editrev.txt b/wiki/inc/lang/hr/editrev.txt
new file mode 100644
index 0000000..9ac656e
--- /dev/null
+++ b/wiki/inc/lang/hr/editrev.txt
@@ -0,0 +1,2 @@
+**Učitali ste stariju inačicu dokumenta!** Ukoliko je pohranite - biti će kreirana nova inačica dokumenta.
+----
\ No newline at end of file
diff --git a/wiki/inc/lang/hr/index.txt b/wiki/inc/lang/hr/index.txt
new file mode 100644
index 0000000..4395994
--- /dev/null
+++ b/wiki/inc/lang/hr/index.txt
@@ -0,0 +1,3 @@
+====== Mapa stranica ======
+
+Ovo je mapa svih dostupnih stranica poredanih po [[doku>namespaces|imenskom prostoru]].
diff --git a/wiki/inc/lang/hr/jquery.ui.datepicker.js b/wiki/inc/lang/hr/jquery.ui.datepicker.js
new file mode 100644
index 0000000..5e218c1
--- /dev/null
+++ b/wiki/inc/lang/hr/jquery.ui.datepicker.js
@@ -0,0 +1,37 @@
+/* Croatian i18n for the jQuery UI date picker plugin. */
+/* Written by Vjekoslav Nesek. */
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "../widgets/datepicker" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery.datepicker );
+	}
+}( function( datepicker ) {
+
+datepicker.regional.hr = {
+	closeText: "Zatvori",
+	prevText: "&#x3C;",
+	nextText: "&#x3E;",
+	currentText: "Danas",
+	monthNames: [ "Siječanj","Veljača","Ožujak","Travanj","Svibanj","Lipanj",
+	"Srpanj","Kolovoz","Rujan","Listopad","Studeni","Prosinac" ],
+	monthNamesShort: [ "Sij","Velj","Ožu","Tra","Svi","Lip",
+	"Srp","Kol","Ruj","Lis","Stu","Pro" ],
+	dayNames: [ "Nedjelja","Ponedjeljak","Utorak","Srijeda","Četvrtak","Petak","Subota" ],
+	dayNamesShort: [ "Ned","Pon","Uto","Sri","Čet","Pet","Sub" ],
+	dayNamesMin: [ "Ne","Po","Ut","Sr","Če","Pe","Su" ],
+	weekHeader: "Tje",
+	dateFormat: "dd.mm.yy.",
+	firstDay: 1,
+	isRTL: false,
+	showMonthAfterYear: false,
+	yearSuffix: "" };
+datepicker.setDefaults( datepicker.regional.hr );
+
+return datepicker.regional.hr;
+
+} ) );
diff --git a/wiki/inc/lang/hr/lang.php b/wiki/inc/lang/hr/lang.php
new file mode 100644
index 0000000..4fdc147
--- /dev/null
+++ b/wiki/inc/lang/hr/lang.php
@@ -0,0 +1,359 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Davor Turkalj <turki.bsc@gmail.com>
+ * @author Tomo Krajina <aaa@puzz.info>
+ * @author Branko Rihtman <theney@gmail.com>
+ * @author Dražen Odobašić <dodobasic@gmail.com>
+ * @author Dejan Igrec <dejan.igrec@gmail.com>
+ */
+$lang['encoding']              = 'utf-8';
+$lang['direction']             = 'ltr';
+$lang['doublequoteopening']    = '“';
+$lang['doublequoteclosing']    = '”';
+$lang['singlequoteopening']    = '‘';
+$lang['singlequoteclosing']    = '’';
+$lang['apostrophe']            = '’';
+$lang['btn_edit']              = 'Izmijeni stranicu';
+$lang['btn_source']            = 'Prikaži kod stranice';
+$lang['btn_show']              = 'Prikaži dokument';
+$lang['btn_create']            = 'Stvori ovu stranicu';
+$lang['btn_search']            = 'Pretraži';
+$lang['btn_save']              = 'Pohrani';
+$lang['btn_preview']           = 'Prikaži';
+$lang['btn_top']               = 'Na vrh';
+$lang['btn_newer']             = '<< noviji';
+$lang['btn_older']             = 'stariji >>';
+$lang['btn_revs']              = 'Stare promjene';
+$lang['btn_recent']            = 'Nedavne izmjene';
+$lang['btn_upload']            = 'Učitaj';
+$lang['btn_cancel']            = 'Odustani';
+$lang['btn_index']             = 'Mapa lokacije';
+$lang['btn_secedit']           = 'Uredi';
+$lang['btn_login']             = 'Prijavi se';
+$lang['btn_logout']            = 'Odjavi se';
+$lang['btn_admin']             = 'Administriranje';
+$lang['btn_update']            = 'Nadogradi';
+$lang['btn_delete']            = 'Obriši';
+$lang['btn_back']              = 'Nazad';
+$lang['btn_backlink']          = 'Povratne veze';
+$lang['btn_subscribe']         = 'Uređivanje pretplata';
+$lang['btn_profile']           = 'Dopuni profil';
+$lang['btn_reset']             = 'Poništi';
+$lang['btn_resendpwd']         = 'Postavi novu lozinku';
+$lang['btn_draft']             = 'Uredi nacrt dokumenta';
+$lang['btn_recover']           = 'Vrati nacrt stranice';
+$lang['btn_draftdel']          = 'Obriši nacrt stranice';
+$lang['btn_revert']            = 'Vrati';
+$lang['btn_register']          = 'Registracija';
+$lang['btn_apply']             = 'Primjeni';
+$lang['btn_media']             = 'Upravitelj datoteka';
+$lang['btn_deleteuser']        = 'Ukloni mog korisnika';
+$lang['btn_img_backto']        = 'Povratak na %s';
+$lang['btn_mediaManager']      = 'Pogledaj u upravitelju datoteka';
+$lang['loggedinas']            = 'Prijavljen kao:';
+$lang['user']                  = 'Korisničko ime';
+$lang['pass']                  = 'Lozinka';
+$lang['newpass']               = 'Nova lozinka';
+$lang['oldpass']               = 'Potvrdi trenutnu lozinku';
+$lang['passchk']               = 'još jednom';
+$lang['remember']              = 'Zapamti me';
+$lang['fullname']              = 'Ime i prezime';
+$lang['email']                 = 'E-pošta';
+$lang['profile']               = 'Korisnički profil';
+$lang['badlogin']              = 'Neispravno korisničko ime ili lozinka.';
+$lang['badpassconfirm']        = 'Nažalost, lozinka nije ispravna';
+$lang['minoredit']             = 'Manje izmjene';
+$lang['draftdate']             = 'Nacrt promjena automatski spremljen u';
+$lang['nosecedit']             = 'Stranica se u međuvremenu promijenila. Informacija o odjeljku je ostarila pa je učitana kompletna stranica.';
+$lang['searchcreatepage']      = 'Ako niste našli ono što ste tražili, možete napraviti ili urediti stranicu %s, imenovanu prema vašoj potrazi.';
+$lang['search_fullresults']    = 'Rezultat u punom tekstu';
+$lang['js']['search_toggle_tools'] = 'Odaberi alat pretrage';
+$lang['js']['willexpire']      = 'Dokument kojeg mijenjate će biti zaključan još 1 minutu.\n Ukoliko želite i dalje raditi izmjene na dokumentu - kliknite na "Pregled".';
+$lang['js']['notsavedyet']     = 'Vaše izmjene će se izgubiti.
+Želite li nastaviti?';
+$lang['js']['searchmedia']     = 'Traži datoteke';
+$lang['js']['keepopen']        = 'Ostavi prozor otvoren nakon izbora';
+$lang['js']['hidedetails']     = 'Sakrij detalje';
+$lang['js']['mediatitle']      = 'Postavke poveznice';
+$lang['js']['mediadisplay']    = 'Vrsta poveznice';
+$lang['js']['mediaalign']      = 'Poravnanje';
+$lang['js']['mediasize']       = 'Veličina slike';
+$lang['js']['mediatarget']     = 'Cilj poveznice';
+$lang['js']['mediaclose']      = 'Zatvori';
+$lang['js']['mediainsert']     = 'Umetni';
+$lang['js']['mediadisplayimg'] = 'Prikaži sliku.';
+$lang['js']['mediadisplaylnk'] = 'Prikaži samo poveznicu.';
+$lang['js']['mediasmall']      = 'Mala inačica.';
+$lang['js']['mediamedium']     = 'Srednja inačica.';
+$lang['js']['medialarge']      = 'Velika inačica.';
+$lang['js']['mediaoriginal']   = 'Originalna inačica.';
+$lang['js']['medialnk']        = 'Poveznica na stranicu s detaljima';
+$lang['js']['mediadirect']     = 'Direktna poveznica na original';
+$lang['js']['medianolnk']      = 'Bez poveznice';
+$lang['js']['medianolink']     = 'Nemoj povezati sliku';
+$lang['js']['medialeft']       = 'Poravnaj sliku lijevo.';
+$lang['js']['mediaright']      = 'Poravnaj sliku desno.';
+$lang['js']['mediacenter']     = 'Poravnaj sliku u sredinu.';
+$lang['js']['medianoalign']    = 'Bez poravnanja.';
+$lang['js']['nosmblinks']      = 'Poveznicei na dijeljene Windows mape rade samo s Internet Explorerom. Poveznicu je još uvijek moguće kopirati i zalijepiti.';
+$lang['js']['linkwiz']         = 'Čarobnjak za poveznice';
+$lang['js']['linkto']          = 'Poveznica na:';
+$lang['js']['del_confirm']     = 'Zbilja želite obrisati odabrane stavke?';
+$lang['js']['restore_confirm'] = 'Zaista želite vratiti ovu inačicu?';
+$lang['js']['media_diff']      = 'Pogledaj razlike:';
+$lang['js']['media_diff_both'] = 'Usporedni prikaz';
+$lang['js']['media_diff_opacity'] = 'Sjaj kroz';
+$lang['js']['media_diff_portions'] = 'Pomakni';
+$lang['js']['media_select']    = 'Odaberi datoteke ...';
+$lang['js']['media_upload_btn'] = 'Učitavanje';
+$lang['js']['media_done_btn']  = 'Gotovo';
+$lang['js']['media_drop']      = 'Ovdje spusti datoteke za učitavanje';
+$lang['js']['media_cancel']    = 'ukloni';
+$lang['js']['media_overwrt']   = 'Prepiši preko postojeće datoteke';
+$lang['search_exact_match']    = 'Potpuno identično';
+$lang['search_starts_with']    = 'Počinje s';
+$lang['search_ends_with']      = 'Završava s';
+$lang['search_contains']       = 'Sadrži';
+$lang['search_custom_match']   = 'Prilagođeno';
+$lang['search_any_ns']         = 'Bilo koji imenski prostor';
+$lang['search_any_time']       = 'Bilo koje vrijeme';
+$lang['search_past_7_days']    = 'Prošli tjedan';
+$lang['search_past_month']     = 'Prošli mjesec';
+$lang['search_past_year']      = 'Prošla godina';
+$lang['search_sort_by_hits']   = 'Poredaj po poklapanju';
+$lang['search_sort_by_mtime']  = 'Poredaj po zadnjoj promjeni';
+$lang['regmissing']            = 'Morate popuniti sva polja.';
+$lang['reguexists']            = 'Korisnik s tim korisničkim imenom već postoji.';
+$lang['regsuccess']            = 'Korisnik je uspješno stvoren i poslana je lozinka emailom.';
+$lang['regsuccess2']           = 'Korisnik je uspješno kreiran.';
+$lang['regfail']               = 'Korisnik ne može biti kreiran.';
+$lang['regmailfail']           = 'Pojavila se greška prilikom slanja lozinke e-poštom. Kontaktirajte administratora!';
+$lang['regbadmail']            = 'Adresa e-pošte nije ispravna, ukoliko ovo smatrate greškom, kontaktirajte administratora.';
+$lang['regbadpass']            = 'Unesene lozinke nisu jednake, pokušajte ponovno.';
+$lang['regpwmail']             = 'Vaša DokuWiki lozinka';
+$lang['reghere']               = 'Još uvijek nemate korisnički račun? Registrirajte se.';
+$lang['profna']                = 'Ovaj wiki ne dopušta izmjene korisničkog profila.';
+$lang['profnochange']          = 'Nema izmjena.';
+$lang['profnoempty']           = 'Prazno korisničko ime ili e-pošta nisu dopušteni.';
+$lang['profchanged']           = 'Korisnički profil je uspješno izmijenjen.';
+$lang['profnodelete']          = 'Ovaj wiki ne podržava brisanje korisnika';
+$lang['profdeleteuser']        = 'Obriši korisnika';
+$lang['profdeleted']           = 'Vaš korisnik je obrisan s ovog wiki-a';
+$lang['profconfdelete']        = 'Želim ukloniti mojeg korisnika s ovog wiki-a. <br/> Ova akcija se ne može poništiti.';
+$lang['profconfdeletemissing'] = 'Kvačica za potvrdu nije označena';
+$lang['proffail']              = 'Profil korisnika nije izmijenjen.';
+$lang['pwdforget']             = 'Izgubili ste lozinku? Zatražite novu';
+$lang['resendna']              = 'Ovaj wiki ne podržava ponovno slanje lozinke e-poštom.';
+$lang['resendpwd']             = 'Postavi novu lozinku za';
+$lang['resendpwdmissing']      = 'Ispunite sva polja.';
+$lang['resendpwdnouser']       = 'Nije moguće pronaći korisnika.';
+$lang['resendpwdbadauth']      = 'Neispravan autorizacijski kod. Provjerite da li ste koristili potpunu poveznicu za potvrdu.';
+$lang['resendpwdconfirm']      = 'Poveznica za potvrdu je poslana e-poštom.';
+$lang['resendpwdsuccess']      = 'Nova lozinka je poslana e-poštom.';
+$lang['license']               = 'Osim na mjestima gdje je naznačeno drugačije, sadržaj ovog wikija je licenciran sljedećom licencom:';
+$lang['licenseok']             = 'Pažnja: promjenom ovog dokumenta pristajete licencirati sadržaj sljedećom licencom: ';
+$lang['searchmedia']           = 'Traži naziv datoteke:';
+$lang['searchmedia_in']        = 'Traži u %s';
+$lang['txt_upload']            = 'Odaberite datoteku za učitavanje:';
+$lang['txt_filename']          = 'Učitaj kao (nije obavezno):';
+$lang['txt_overwrt']           = 'Prepiši postojeću datoteku';
+$lang['maxuploadsize']         = 'Moguće je učitati maks. %s po datoteci.';
+$lang['lockedby']              = 'Trenutno zaključao:';
+$lang['lockexpire']            = 'Zaključano do:';
+$lang['rssfailed']             = 'Došlo je do greške prilikom preuzimanja feed-a: ';
+$lang['nothingfound']          = 'Traženi dokumetni nisu pronađeni.';
+$lang['mediaselect']           = 'Datoteke';
+$lang['uploadsucc']            = 'Učitavanje uspješno';
+$lang['uploadfail']            = 'Neuspješno učitavanje. Možda dozvole na poslužitelju nisu ispravne?';
+$lang['uploadwrong']           = 'Učitavanje nije dopušteno. Nastavak datoteke je zabranjen!';
+$lang['uploadexist']           = 'Datoteka već postoji.';
+$lang['uploadbadcontent']      = 'Učitani sadržaj ne odgovara ekstenziji %s datoteke.';
+$lang['uploadspam']            = 'Učitavanje je spriječeno od spam crne liste.';
+$lang['uploadxss']             = 'Učitavanje je spriječeno zbog mogućeg zlonamjernog sadržaja.';
+$lang['uploadsize']            = 'Učitana datoteka je prevelika (max. %s)';
+$lang['deletesucc']            = 'Datoteka "%s" je obrisana.';
+$lang['deletefail']            = '"%s" se ne može obrisati - provjerite dozvole na poslužitelju.';
+$lang['mediainuse']            = 'Datoteka "%s" nije obrisana - još uvijek se koristi.';
+$lang['namespaces']            = 'Imenski prostori';
+$lang['mediafiles']            = 'Datoteke u';
+$lang['accessdenied']          = 'Nemate potrebne dozvole za pregled ove stranice.';
+$lang['mediausage']            = 'Koristi sljedeću sintaksu za referenciranje ove datoteke:';
+$lang['mediaview']             = 'Vidi izvornu datoteku';
+$lang['mediaroot']             = 'root';
+$lang['mediaupload']           = 'Postavi datoteku u odabrani imenski prostor. Podimenski prostori se stvaraju dodavanjem istih kao prefiks naziva datoteke u "Postavi kao" polju, tako da se odvoje dvotočkama.';
+$lang['mediaextchange']        = 'Nastavak datoteke promijenjen iz .%s u .%s!';
+$lang['reference']             = 'Poveznice za';
+$lang['ref_inuse']             = 'Datoteka se ne može obrisati jer se još uvijek koristi u sljedećim dokumentima:';
+$lang['ref_hidden']            = 'Neke poveznice se nalaze na dokumentima koje nemate dozvolu čitati';
+$lang['hits']                  = 'Pronađeno';
+$lang['quickhits']             = 'Pronađeno po nazivima dokumenata';
+$lang['toc']                   = 'Sadržaj';
+$lang['current']               = 'trenutno';
+$lang['yours']                 = 'Vaša inačica';
+$lang['diff']                  = 'Prikaži razlike u odnosu na zadnje stanje';
+$lang['diff2']                 = 'Pokaži razlike između odabranih izmjena';
+$lang['difflink']              = 'Poveznica na ovu usporedbu';
+$lang['diff_type']             = 'Vidi razlike:';
+$lang['diff_inline']           = 'U istoj razini';
+$lang['diff_side']             = 'Usporedo';
+$lang['diffprevrev']           = 'Starija izmjena';
+$lang['diffnextrev']           = 'Novija izmjena';
+$lang['difflastrev']           = 'Zadnja izmjena';
+$lang['diffbothprevrev']       = 'Starije izmjene na obje strane';
+$lang['diffbothnextrev']       = 'Novije izmjene na obje strane';
+$lang['line']                  = 'Redak';
+$lang['breadcrumb']            = 'Zadnje viđeno:';
+$lang['youarehere']            = 'Vi ste ovdje:';
+$lang['lastmod']               = 'Zadnja izmjena:';
+$lang['by']                    = 'od';
+$lang['deleted']               = 'obrisano';
+$lang['created']               = 'stvoreno';
+$lang['restored']              = 'vraćeno na prijašnju izmjenu (%s)';
+$lang['external_edit']         = 'vanjsko uređivanje';
+$lang['summary']               = 'Sažetak izmjena';
+$lang['noflash']               = 'Za prikazivanje ovog sadržaja potreban je <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a>';
+$lang['download']              = 'Preuzmi isječak';
+$lang['tools']                 = 'Alati';
+$lang['user_tools']            = 'Korisnički alati';
+$lang['site_tools']            = 'Site alati';
+$lang['page_tools']            = 'Stranični alati';
+$lang['skip_to_content']       = 'preskoči na sadržaj';
+$lang['sidebar']               = 'Bočna traka';
+$lang['mail_newpage']          = 'stranica dodana:';
+$lang['mail_changed']          = 'stranica izmijenjena:';
+$lang['mail_subscribe_list']   = 'stranice promijenjene u imenskom prostoru:';
+$lang['mail_new_user']         = 'novi korisnik:';
+$lang['mail_upload']           = 'datoteka učitana:';
+$lang['changes_type']          = 'Vidi promjene od';
+$lang['pages_changes']         = 'Stranice';
+$lang['media_changes']         = 'Datoteke';
+$lang['both_changes']          = 'Zajedno stranice i datoteke';
+$lang['qb_bold']               = 'Podebljani tekst';
+$lang['qb_italic']             = 'Ukošeni tekst';
+$lang['qb_underl']             = 'Podcrtani tekst';
+$lang['qb_code']               = 'Kod';
+$lang['qb_strike']             = 'Precrtani tekst';
+$lang['qb_h1']                 = 'Naslov 1. razine';
+$lang['qb_h2']                 = 'Naslov 2. razine';
+$lang['qb_h3']                 = 'Naslov 3. razine';
+$lang['qb_h4']                 = 'Naslov 4. razine';
+$lang['qb_h5']                 = 'Naslov 5. razine';
+$lang['qb_h']                  = 'Naslov';
+$lang['qb_hs']                 = 'Odaberite naslov';
+$lang['qb_hplus']              = 'Naslov više razine';
+$lang['qb_hminus']             = 'Naslov niže razine';
+$lang['qb_hequal']             = 'Naslov iste razine';
+$lang['qb_link']               = 'Interna poveznica';
+$lang['qb_extlink']            = 'Vanjska poveznica';
+$lang['qb_hr']                 = 'Vodoravna crta';
+$lang['qb_ol']                 = 'Element brojane liste';
+$lang['qb_ul']                 = 'Element obične liste';
+$lang['qb_media']              = 'Dodaj slike i ostale datoteke (prikaz u novom prozoru)';
+$lang['qb_sig']                = 'Ubaci potpis';
+$lang['qb_smileys']            = 'Smiješkići';
+$lang['qb_chars']              = 'Posebni znakovi';
+$lang['upperns']               = 'Skoči u nadređeni imenski prostor';
+$lang['metaedit']              = 'Uredi metapodatake';
+$lang['metasaveerr']           = 'Neuspješno zapisivanje metapodataka';
+$lang['metasaveok']            = 'Spremljeni metapdaci';
+$lang['img_title']             = 'Naziv:';
+$lang['img_caption']           = 'Naslov:';
+$lang['img_date']              = 'Datum:';
+$lang['img_fname']             = 'Ime datoteke:';
+$lang['img_fsize']             = 'Veličina:';
+$lang['img_artist']            = 'Fotograf:';
+$lang['img_copyr']             = 'Autorsko pravo:';
+$lang['img_format']            = 'Format:';
+$lang['img_camera']            = 'Kamera:';
+$lang['img_keywords']          = 'Ključne riječi:';
+$lang['img_width']             = 'Širina:';
+$lang['img_height']            = 'Visina:';
+$lang['subscr_subscribe_success'] = 'Dodan %s u listu pretplatnika za %s';
+$lang['subscr_subscribe_error'] = 'Greška kod dodavanja %s u listu pretplatnika za %s';
+$lang['subscr_subscribe_noaddress'] = 'Ne postoji adresa povezana sa vašim podacima za prijavu, stoga ne možete biti dodani u listu pretplatnika';
+$lang['subscr_unsubscribe_success'] = 'Uklonjen %s iz liste pretplatnika za %s';
+$lang['subscr_unsubscribe_error'] = 'Greška prilikom uklanjanja %s iz liste pretplatnika za %s';
+$lang['subscr_already_subscribed'] = '%s je već pretplaćen na %s';
+$lang['subscr_not_subscribed'] = '%s nije pretplaćen na %s';
+$lang['subscr_m_not_subscribed'] = 'Trenutno niste pretplaćeni na trenutnu stranicu ili imenski prostor.';
+$lang['subscr_m_new_header']   = 'Dodaj pretplatu';
+$lang['subscr_m_current_header'] = 'Trenutne pretplate';
+$lang['subscr_m_unsubscribe']  = 'Odjavi pretplatu';
+$lang['subscr_m_subscribe']    = 'Pretplati se';
+$lang['subscr_m_receive']      = 'Primi';
+$lang['subscr_style_every']    = 'e-pošta za svaku promjenu';
+$lang['subscr_style_digest']   = 'e-pošta s kratakim prikazom promjena za svaku stranicu (svaka %.2f dana)';
+$lang['subscr_style_list']     = 'listu promijenjenih stranica od zadnje primljene e-pošte (svaka %.2f dana)';
+$lang['authtempfail']          = 'Prijava korisnika je privremeno nedostupna. Molimo Vas da kontaktirate administratora, ako ovo potraje.';
+$lang['i_chooselang']          = 'Izaberite vaš jezik';
+$lang['i_installer']           = 'DokuWiki postavljanje';
+$lang['i_wikiname']            = 'Naziv Wikija';
+$lang['i_enableacl']           = 'Omogući ACL (preporučeno)';
+$lang['i_superuser']           = 'Superkorisnik';
+$lang['i_problems']            = 'Instalacija je pronašla probleme koji su naznačeni ispod. Nije moguće nastaviti dok se ti problemi ne riješe.';
+$lang['i_modified']            = 'Zbog sigurnosnih razlog, ova skripta raditi će samo sa novim i neizmijenjenim DokuWiki instalacijama.
+      Molimo ponovno prekopirajte datoteke iz preuzetoga paketa ili pogledajte detaljno <a href="http://dokuwiki.org/install">Uputstvo za postavljanje DokuWiki-a</a>';
+$lang['i_funcna']              = 'PHP funkcija <code>%s</code> nije dostupna. Možda ju je vaš pružatelj hostinga onemogućio iz nekog razloga?';
+$lang['i_phpver']              = 'Vaša PHP inačica <code>%s</code> je niža od potrebne <code>%s</code>. Trebate nadograditi vašu PHP instalaciju.';
+$lang['i_mbfuncoverload']      = 'mbstring.func_overload mora biti onemogućena u php.ini da bi ste pokrenuli DokuWiki.';
+$lang['i_permfail']            = '<code>%s</code> nema dozvolu pisanja od strane DokuWiki. Trebate podesiti dozvole pristupa tom direktoriju.';
+$lang['i_confexists']          = '<code>%s</code> već postoji';
+$lang['i_writeerr']            = 'Ne može se kreirati <code>%s</code>. Trebate provjeriti dozvole direktorija/datoteke i kreirati dokument ručno.';
+$lang['i_badhash']             = 'neprepoznat ili promijenjen dokuwiki.php (hash=<code>%s</code>)';
+$lang['i_badval']              = '<code>%s</code> - nedozvoljena ili prazna vrijednost';
+$lang['i_success']             = 'Podešavanje je uspješno završeno. Sada možete obrisati install.php datoteku. Nastavite na <a href="doku.php?id=wiki:welcome">vaš novi DokuWiki</a>.';
+$lang['i_failure']             = 'Pojavile su se neke greške prilikom pisanja konfiguracijskih datoteka. Morati ćete ih ručno ispraviti da bi mogli koristiti <a href="doku.php?id=wiki:welcome">vaš novi DokuWiki</a>.';
+$lang['i_policy']              = 'Inicijalna ACL politika';
+$lang['i_pol0']                = 'Otvoreni Wiki (čitanje, pisanje, učitavanje za sve)';
+$lang['i_pol1']                = 'Javni Wiki (čitanje za sve, pisanje i učitavanje za registrirane korisnike)';
+$lang['i_pol2']                = 'Zatvoreni Wiki (čitanje, pisanje, učitavanje samo za registrirane korisnike)';
+$lang['i_allowreg']            = 'Dopusti da korisnici sami sebe registriraju';
+$lang['i_retry']               = 'Pokušaj ponovo';
+$lang['i_license']             = 'Molim odaberite licencu pod kojom želite postavljati vaš sadržaj:';
+$lang['i_license_none']        = 'Ne prikazuj nikakve licenčne informacije.';
+$lang['i_pop_field']           = 'Molimo, pomozite na da unaprijedimo DokuWiki:';
+$lang['i_pop_label']           = 'Jednom na mjesec, pošalji anonimne podatke o korištenju DokuWiki razvojnom timu';
+$lang['recent_global']         = 'Trenutno gledate promjene unutar <b>%s</b> imenskog prostora. Također možete <a href="%s">vidjeti zadnje promjene cijelog wiki-a</a>';
+$lang['years']                 = '%d godina prije';
+$lang['months']                = '%d mjeseci prije';
+$lang['weeks']                 = '%d tjedana prije';
+$lang['days']                  = '%d dana prije';
+$lang['hours']                 = '%d sati prije';
+$lang['minutes']               = '%d minuta prije';
+$lang['seconds']               = '%d sekundi prije';
+$lang['wordblock']             = 'Vaša promjena nije spremljena jer sadrži blokirani tekst (spam).';
+$lang['media_uploadtab']       = 'Učitavanje';
+$lang['media_searchtab']       = 'Traženje';
+$lang['media_file']            = 'Datoteka';
+$lang['media_viewtab']         = 'Pogled';
+$lang['media_edittab']         = 'Uredi';
+$lang['media_historytab']      = 'Povijest';
+$lang['media_list_thumbs']     = 'Ikone';
+$lang['media_list_rows']       = 'Redovi';
+$lang['media_sort_name']       = 'Naziv';
+$lang['media_sort_date']       = 'Datum';
+$lang['media_namespaces']      = 'Odaberi imenski prostor';
+$lang['media_files']           = 'Datoteke u %s';
+$lang['media_upload']          = 'Učitaj u %s';
+$lang['media_search']          = 'Potraži u %s';
+$lang['media_view']            = '%s';
+$lang['media_viewold']         = '%s na %s';
+$lang['media_edit']            = 'Uredi %s';
+$lang['media_history']         = 'Povijest %s';
+$lang['media_meta_edited']     = 'meta podaci uređeni';
+$lang['media_perm_read']       = 'Nažalost, nemate prava za čitanje datoteka.';
+$lang['media_perm_upload']     = 'Nažalost, nemate prava za učitavanje datoteka.';
+$lang['media_update']          = 'Učitaj novu inačicu';
+$lang['media_restore']         = 'Vrati ovu inačicu';
+$lang['media_acl_warning']     = 'Ova lista moguće da nije kompletna zbog ograničenja ovlasti i skrivenih stranica.';
+$lang['currentns']             = 'Tekući imenički prostor';
+$lang['searchresult']          = 'Rezultati pretraživanja';
+$lang['plainhtml']             = 'Čisti HTML';
+$lang['wikimarkup']            = 'Wiki kod';
+$lang['page_nonexist_rev']     = 'Stranica ne postoji na %s. Ona je naknadno napravljena na <a href="%s">%s</a>.';
+$lang['unable_to_parse_date']  = 'Ne mogu analizirati parametar "%s".';
+$lang['email_signature_text']  = 'Ovaj email je poslan na
+@DOKUWIKIURL@';
diff --git a/wiki/inc/lang/hr/locked.txt b/wiki/inc/lang/hr/locked.txt
new file mode 100644
index 0000000..ff081aa
--- /dev/null
+++ b/wiki/inc/lang/hr/locked.txt
@@ -0,0 +1,3 @@
+====== Dokument zaključan ======
+
+Mijenjanje ovog dokumenta je trenutno onemogućeno jer je otvoren od strane nekog drugog korisnika. Morate pričekati da on završi sa svojim izmjenama.
diff --git a/wiki/inc/lang/hr/login.txt b/wiki/inc/lang/hr/login.txt
new file mode 100644
index 0000000..216af13
--- /dev/null
+++ b/wiki/inc/lang/hr/login.txt
@@ -0,0 +1,3 @@
+====== Prijava ======
+
+Upišite korisničko ime i lozinku da biste se prijavili.
diff --git a/wiki/inc/lang/hr/mailtext.txt b/wiki/inc/lang/hr/mailtext.txt
new file mode 100644
index 0000000..1719fd5
--- /dev/null
+++ b/wiki/inc/lang/hr/mailtext.txt
@@ -0,0 +1,12 @@
+Dokument na Vašem wiki-ju je promijenjen ili dodan:
+
+Datum             : @DATE@
+Preglednik        : @BROWSER@
+IP-Adresa         : @IPADDRESS@
+Host              : @HOSTNAME@
+Prijašnja izmjena : @OLDPAGE@
+Nova izmjena      : @NEWPAGE@
+Opis izmjene      : @SUMMARY@
+Korisnik          : @USER@
+
+@DIFF@
diff --git a/wiki/inc/lang/hr/newpage.txt b/wiki/inc/lang/hr/newpage.txt
new file mode 100644
index 0000000..3934658
--- /dev/null
+++ b/wiki/inc/lang/hr/newpage.txt
@@ -0,0 +1,3 @@
+====== Dokument ne postoji ======
+
+Traženi dokument (još) ne postoji. Ukoliko ga želite otvoriti kliknite na ''Novi dokument''.
diff --git a/wiki/inc/lang/hr/norev.txt b/wiki/inc/lang/hr/norev.txt
new file mode 100644
index 0000000..8c9178e
--- /dev/null
+++ b/wiki/inc/lang/hr/norev.txt
@@ -0,0 +1,3 @@
+====== Nepostojeća inačica ======
+
+Tražena izmjena ne postoji. Pritisnite "Stare promjene" za listu starih promjena dokumenta.
diff --git a/wiki/inc/lang/hr/password.txt b/wiki/inc/lang/hr/password.txt
new file mode 100644
index 0000000..76cccbd
--- /dev/null
+++ b/wiki/inc/lang/hr/password.txt
@@ -0,0 +1,6 @@
+Pozdrav @FULLNAME@!
+
+Slijede podaci za @TITLE@ sa @DOKUWIKIURL@
+
+Korisničko ime : @LOGIN@
+Lozinka        : @PASSWORD@
diff --git a/wiki/inc/lang/hr/preview.txt b/wiki/inc/lang/hr/preview.txt
new file mode 100644
index 0000000..4289f4d
--- /dev/null
+++ b/wiki/inc/lang/hr/preview.txt
@@ -0,0 +1,3 @@
+====== Pregled ======
+
+Ovo je pregled kako će izgledati Vaš dokument nakon što se pohrani.
diff --git a/wiki/inc/lang/hr/pwconfirm.txt b/wiki/inc/lang/hr/pwconfirm.txt
new file mode 100644
index 0000000..506e98e
--- /dev/null
+++ b/wiki/inc/lang/hr/pwconfirm.txt
@@ -0,0 +1,9 @@
+Pozdrav @FULLNAME@!
+
+Netko je zatražio novu lozinku za vašu @TITLE@ prijavu na @DOKUWIKIURL@.
+
+Ako to niste bili Vi, molimo da samo ignorirate ovu poruku.
+
+Da bi ste potvrdili da ste to ipak bili Vi, molimo slijedite link u nastavku:
+
+@CONFIRM@
diff --git a/wiki/inc/lang/hr/read.txt b/wiki/inc/lang/hr/read.txt
new file mode 100644
index 0000000..221f1b2
--- /dev/null
+++ b/wiki/inc/lang/hr/read.txt
@@ -0,0 +1 @@
+Ova stranica se može samo čitati. Možete vidjeti kod, ali ga ne možete mijenjati. Javite se vašem administratoru ako se s tim ne slažete.
\ No newline at end of file
diff --git a/wiki/inc/lang/hr/recent.txt b/wiki/inc/lang/hr/recent.txt
new file mode 100644
index 0000000..4145ca1
--- /dev/null
+++ b/wiki/inc/lang/hr/recent.txt
@@ -0,0 +1,3 @@
+====== Nedavne izmjene ======
+
+Stranice koje su nedavno promijenjene.
diff --git a/wiki/inc/lang/hr/register.txt b/wiki/inc/lang/hr/register.txt
new file mode 100644
index 0000000..32a5489
--- /dev/null
+++ b/wiki/inc/lang/hr/register.txt
@@ -0,0 +1,3 @@
+====== Prijava novog korisnika ======
+
+Ispunite potrebne podatke da biste dobili korisnički račun na wikiju. Posebno obratite pažnju da ste unijeli valjani email.
diff --git a/wiki/inc/lang/hr/registermail.txt b/wiki/inc/lang/hr/registermail.txt
new file mode 100644
index 0000000..9c556d9
--- /dev/null
+++ b/wiki/inc/lang/hr/registermail.txt
@@ -0,0 +1,10 @@
+Novi korisnik je registriran. Ovdje su detalji:
+
+Korisničko ime : @NEWUSER@
+Puno ime       : @NEWNAME@
+e-pošta        : @NEWEMAIL@
+
+Datum      : @DATE@
+Preglednik : @BROWSER@
+IP-Adresa  : @IPADDRESS@
+Računalo   : @HOSTNAME@
diff --git a/wiki/inc/lang/hr/resendpwd.txt b/wiki/inc/lang/hr/resendpwd.txt
new file mode 100644
index 0000000..d5b2e65
--- /dev/null
+++ b/wiki/inc/lang/hr/resendpwd.txt
@@ -0,0 +1,3 @@
+====== Slanje nove lozinke ======
+
+Ispunite potrebne podatke da biste dobili novu lozinku za Vaš korisnički račun. Poveznica za potvrdu biti će poslana na Vašu adresu e-pošte.
diff --git a/wiki/inc/lang/hr/resetpwd.txt b/wiki/inc/lang/hr/resetpwd.txt
new file mode 100644
index 0000000..8d92e51
--- /dev/null
+++ b/wiki/inc/lang/hr/resetpwd.txt
@@ -0,0 +1,3 @@
+====== Postavi novu lozinku ======
+
+Molimo unesite novu lozinku za Vašu korisničku prijavu na ovom wiki-u. 
\ No newline at end of file
diff --git a/wiki/inc/lang/hr/revisions.txt b/wiki/inc/lang/hr/revisions.txt
new file mode 100644
index 0000000..990d50b
--- /dev/null
+++ b/wiki/inc/lang/hr/revisions.txt
@@ -0,0 +1,3 @@
+====== Stare izmjene ======
+
+Slijedi popis starijih izmjena za trenutni dokument. Da bi ste se vratili na neku od njih, odaberite ju, pritisnite Uređivanje i pohranite ju.
diff --git a/wiki/inc/lang/hr/searchpage.txt b/wiki/inc/lang/hr/searchpage.txt
new file mode 100644
index 0000000..14c0509
--- /dev/null
+++ b/wiki/inc/lang/hr/searchpage.txt
@@ -0,0 +1,4 @@
+====== Pretraživanja ======
+
+Možete naći rezultat vaše pretrage u nastavku. @CREATEPAGEINFO@
+
diff --git a/wiki/inc/lang/hr/showrev.txt b/wiki/inc/lang/hr/showrev.txt
new file mode 100644
index 0000000..86c1a02
--- /dev/null
+++ b/wiki/inc/lang/hr/showrev.txt
@@ -0,0 +1,2 @@
+**Ovo je stara izmjena dokumenta!**
+----
diff --git a/wiki/inc/lang/hr/stopwords.txt b/wiki/inc/lang/hr/stopwords.txt
new file mode 100644
index 0000000..5b1bb20
--- /dev/null
+++ b/wiki/inc/lang/hr/stopwords.txt
@@ -0,0 +1,29 @@
+# Ovo je popis riječi koje indekser ignorira, jedna riječ po retku
+# Kada mijenjate ovu datoteku budite sigurni da koristite UNIX oznaku kraja retka (jedan newline znak)
+# Nije potrebno navoditi riječi kraće od 3 znaka - one su svakako ignorirane
+# Ova lista je bazirana na onoj nađenoj na http://www.ranks.nlstopwords/
+about
+are
+and
+you
+your
+them
+their
+com
+for
+from
+into
+how
+that
+the
+this
+was
+what
+when
+where
+who
+will
+with
+und
+the
+www
diff --git a/wiki/inc/lang/hr/subscr_digest.txt b/wiki/inc/lang/hr/subscr_digest.txt
new file mode 100644
index 0000000..b58836d
--- /dev/null
+++ b/wiki/inc/lang/hr/subscr_digest.txt
@@ -0,0 +1,15 @@
+Pozdrav !
+
+Stranica @PAGE@ u @TITLE@ wiki-u je promijenjena.
+Ovdje su promjene:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Stara izmjena: @OLDPAGE@
+Nova izmjena: @NEWPAGE@
+
+Da poništite obavijesti o izmjenama prijavite se na wiki @DOKUWIKIURL@ i zatim posjetite
+@SUBSCRIBE@
+i odjavite se s promjena na stranici i/ili imeničkom prostoru.
diff --git a/wiki/inc/lang/hr/subscr_form.txt b/wiki/inc/lang/hr/subscr_form.txt
new file mode 100644
index 0000000..95b2cd0
--- /dev/null
+++ b/wiki/inc/lang/hr/subscr_form.txt
@@ -0,0 +1,3 @@
+====== Uređivanje pretplata ======
+
+Ova stranica omogućuje Vam da uredite svoju pretplatu na promjene za tekuću stranicu ili imenički prostor.
\ No newline at end of file
diff --git a/wiki/inc/lang/hr/subscr_list.txt b/wiki/inc/lang/hr/subscr_list.txt
new file mode 100644
index 0000000..75a4340
--- /dev/null
+++ b/wiki/inc/lang/hr/subscr_list.txt
@@ -0,0 +1,11 @@
+Pozdrav !
+
+Stranice u imeničkom prostoru @PAGE@ na @TITLE@ wiki-u su izmijenjene. Ovo su izmijenjene stranice:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Da poništite obavijesti o izmjenama prijavite se na wiki @DOKUWIKIURL@ i zatim posjetite
+@SUBSCRIBE@
+i odjavite se s promjena na stranici i/ili imeničkom prostoru.
diff --git a/wiki/inc/lang/hr/subscr_single.txt b/wiki/inc/lang/hr/subscr_single.txt
new file mode 100644
index 0000000..4c7b329
--- /dev/null
+++ b/wiki/inc/lang/hr/subscr_single.txt
@@ -0,0 +1,18 @@
+Pozdrav !
+
+Stranica @PAGE@ na @TITLE@ wiki-u je izmijenjena.
+Ovo su promjene:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Datum  : @DATE@
+Korisnik: @USER@
+Sažetak izmjena: @SUMMARY@
+Stara izmjena: @OLDPAGE@
+Nova izmjena : @NEWPAGE@
+
+Da poništite obavijesti o izmjenama prijavite se na wiki @DOKUWIKIURL@ i zatim posjetite
+@SUBSCRIBE@
+i odjavite se s promjena na stranici i/ili imeničkom prostoru.
diff --git a/wiki/inc/lang/hr/updateprofile.txt b/wiki/inc/lang/hr/updateprofile.txt
new file mode 100644
index 0000000..8eab906
--- /dev/null
+++ b/wiki/inc/lang/hr/updateprofile.txt
@@ -0,0 +1,3 @@
+====== Izmjena korisničkog profila ======
+
+Ispunite samo polja koja želite mijenjati. Ne može se mijenjati korisničko ime.
diff --git a/wiki/inc/lang/hr/uploadmail.txt b/wiki/inc/lang/hr/uploadmail.txt
new file mode 100644
index 0000000..f4ab91e
--- /dev/null
+++ b/wiki/inc/lang/hr/uploadmail.txt
@@ -0,0 +1,11 @@
+Datoteka je učitana na Vaš DokuWiki. Ovdje su detalji:
+
+Datoteka     : @MEDIA@
+Stara izmjena: @OLD@
+Datum        : @DATE@
+Preglednik   : @BROWSER@
+IP-Adresa    : @IPADDRESS@
+Računalo     : @HOSTNAME@
+Veličina     : @SIZE@
+MIME Tip     : @MIME@
+Korisnik     : @USER@
diff --git a/wiki/inc/lang/hu-formal/admin.txt b/wiki/inc/lang/hu-formal/admin.txt
new file mode 100644
index 0000000..b661bfb
--- /dev/null
+++ b/wiki/inc/lang/hu-formal/admin.txt
@@ -0,0 +1,3 @@
+===== Beállítások =====
+
+Alább találja a DokuWiki-ben elérhető beállítási lehetőségek listáját.
\ No newline at end of file
diff --git a/wiki/inc/lang/hu-formal/adminplugins.txt b/wiki/inc/lang/hu-formal/adminplugins.txt
new file mode 100644
index 0000000..b077521
--- /dev/null
+++ b/wiki/inc/lang/hu-formal/adminplugins.txt
@@ -0,0 +1 @@
+===== További bővítmények =====
\ No newline at end of file
diff --git a/wiki/inc/lang/hu-formal/backlinks.txt b/wiki/inc/lang/hu-formal/backlinks.txt
new file mode 100644
index 0000000..437eb2e
--- /dev/null
+++ b/wiki/inc/lang/hu-formal/backlinks.txt
@@ -0,0 +1,3 @@
+====== Hivatkozások ======
+
+Mindazon oldalak listája, amelyek az aktuális oldalra hivatkoznak.
\ No newline at end of file
diff --git a/wiki/inc/lang/hu-formal/conflict.txt b/wiki/inc/lang/hu-formal/conflict.txt
new file mode 100644
index 0000000..6718d67
--- /dev/null
+++ b/wiki/inc/lang/hu-formal/conflict.txt
@@ -0,0 +1,5 @@
+====== Újabb változat érhető el ======
+
+Az Ön által szerkesztett oldalnak már egy újabb változata érhető el. Ez akkor fordulhat elő, ha egy másik felhasználó módosította a dokumtemot, mialatt Ön is szerkesztette azt.
+
+Vizsgálja meg az alább látható eltéréseket, majd döntse el, melyik változatot tartja meg. Ha a "Mentés" gombot választja, az Ön verziója mentődik el. Kattintson a "Mégsem" gombra a jelenlegi változat megtartásához.
\ No newline at end of file
diff --git a/wiki/inc/lang/hu-formal/denied.txt b/wiki/inc/lang/hu-formal/denied.txt
new file mode 100644
index 0000000..d56a181
--- /dev/null
+++ b/wiki/inc/lang/hu-formal/denied.txt
@@ -0,0 +1,4 @@
+====== Hozzáférés megtadadva ======
+
+Sajnáljuk, de nincs joga a folytatáshoz.
+
diff --git a/wiki/inc/lang/hu-formal/diff.txt b/wiki/inc/lang/hu-formal/diff.txt
new file mode 100644
index 0000000..f922a50
--- /dev/null
+++ b/wiki/inc/lang/hu-formal/diff.txt
@@ -0,0 +1,3 @@
+====== Eltérések ======
+
+Az oldal két változata közötti különbségek az alábbiak.
\ No newline at end of file
diff --git a/wiki/inc/lang/hu-formal/draft.txt b/wiki/inc/lang/hu-formal/draft.txt
new file mode 100644
index 0000000..9233eac
--- /dev/null
+++ b/wiki/inc/lang/hu-formal/draft.txt
@@ -0,0 +1,5 @@
+===== Piszkozatot találtam =====
+
+Az Ön ezen az oldalon végzett utolsó szerkesztési művelete helytelenül fejeződött be. A DokuWiki automatikusan elmentett egy piszkozatot az Ön munkája során. Alább láthatók az utolsó munkafázis mentett adatai.
+
+Kérjük, döntse el, hogy //helyreállítja-e// a befejezetlen módosításokat, vagy //törli// az automatikusan mentett piszkozatot, vagy //megszakítja// a szerkesztési folyamatot.
\ No newline at end of file
diff --git a/wiki/inc/lang/hu-formal/edit.txt b/wiki/inc/lang/hu-formal/edit.txt
new file mode 100644
index 0000000..08f648b
--- /dev/null
+++ b/wiki/inc/lang/hu-formal/edit.txt
@@ -0,0 +1 @@
+Módosítsa az oldalt, majd kattintson a "Mentés" gombra. A wiki-szintaxishoz nézze meg a [[wiki:syntax|szintaxis]] oldalt. Kérjük, csak akkor módosítsa az oldalt, ha **tökéletesíteni**, **javítani** tudja. Amennyiben szeretne kipróbálni ezt-azt, a [[playground:playground|játszótéren]] megtanulhatja az első lépéseket.
\ No newline at end of file
diff --git a/wiki/inc/lang/hu-formal/editrev.txt b/wiki/inc/lang/hu-formal/editrev.txt
new file mode 100644
index 0000000..2eca33c
--- /dev/null
+++ b/wiki/inc/lang/hu-formal/editrev.txt
@@ -0,0 +1,2 @@
+**A dokumentum egy korábbi változatát töltötte be!** Ha az oldalt elmenti, akkor egy új változat jön létre belőle.
+----
\ No newline at end of file
diff --git a/wiki/inc/lang/hu-formal/index.txt b/wiki/inc/lang/hu-formal/index.txt
new file mode 100644
index 0000000..0f2b18f
--- /dev/null
+++ b/wiki/inc/lang/hu-formal/index.txt
@@ -0,0 +1,3 @@
+====== Oldaltérkép (tartalom) ======
+
+Az összes elérhető oldal [[doku>namespaces|névterek]] szerint rendezett oldaltérképe.
\ No newline at end of file
diff --git a/wiki/inc/lang/hu-formal/lang.php b/wiki/inc/lang/hu-formal/lang.php
new file mode 100644
index 0000000..66ff893
--- /dev/null
+++ b/wiki/inc/lang/hu-formal/lang.php
@@ -0,0 +1,29 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Marina Vladi <deldadam@gmail.com>
+ */
+$lang['encoding']              = 'utf-8';
+$lang['direction']             = 'ltr';
+$lang['doublequoteopening']    = '„';
+$lang['doublequoteclosing']    = '”';
+$lang['singlequoteopening']    = '‚';
+$lang['singlequoteclosing']    = '’';
+$lang['apostrophe']            = '’';
+$lang['btn_edit']              = 'Oldal módosítása';
+$lang['btn_source']            = 'Forrás megtekintése';
+$lang['btn_show']              = 'Oldal megtekintése';
+$lang['btn_create']            = 'Oldal létrehozása';
+$lang['btn_search']            = 'Keresés';
+$lang['btn_save']              = 'Mentés';
+$lang['btn_preview']           = 'Előnézet';
+$lang['btn_top']               = 'Oldal tetejére';
+$lang['btn_newer']             = '<< újabb';
+$lang['btn_older']             = 'régebbi >>';
+$lang['btn_revs']              = 'Korábbi változatok';
+$lang['btn_recent']            = 'Legújabb változások';
+$lang['btn_upload']            = 'Feltöltés';
+$lang['email_signature_text'] = 'Ezt a levelet a DokuWiki generálta
+@DOKUWIKIURL@';
diff --git a/wiki/inc/lang/hu/admin.txt b/wiki/inc/lang/hu/admin.txt
new file mode 100644
index 0000000..51b13eb
--- /dev/null
+++ b/wiki/inc/lang/hu/admin.txt
@@ -0,0 +1,3 @@
+===== Adminisztráció =====
+
+Itt találod a DokuWiki adminisztrációs lehetőségeit.
diff --git a/wiki/inc/lang/hu/adminplugins.txt b/wiki/inc/lang/hu/adminplugins.txt
new file mode 100644
index 0000000..89fe373
--- /dev/null
+++ b/wiki/inc/lang/hu/adminplugins.txt
@@ -0,0 +1 @@
+===== További modulok =====
\ No newline at end of file
diff --git a/wiki/inc/lang/hu/backlinks.txt b/wiki/inc/lang/hu/backlinks.txt
new file mode 100644
index 0000000..d457ab7
--- /dev/null
+++ b/wiki/inc/lang/hu/backlinks.txt
@@ -0,0 +1,5 @@
+====== Hivatkozások ======
+
+Ez azoknak az oldalaknak a listája, amelyek erre az oldalra "visszamutatnak" (hivatkoznak).
+
+
diff --git a/wiki/inc/lang/hu/conflict.txt b/wiki/inc/lang/hu/conflict.txt
new file mode 100644
index 0000000..b823465
--- /dev/null
+++ b/wiki/inc/lang/hu/conflict.txt
@@ -0,0 +1,7 @@
+====== Újabb változat létezik ======
+
+Az általad szerkesztett dokumentumnak egy újabb változata létezik. Ez akkor történik, ha egy másik felhasználó megváltoztatta a dokumentumot, amíg szerkesztetted.
+
+Nézd át gondosan a lenti eltéréseket, aztán dönts arról, melyik változatot tartod meg. Ha ''Mentés'' gombot választod, akkor a Te változatod kerül mentésre. Nyomj ''Mégsem'' gombot a jelenlegi változat megtartásához.
+
+
diff --git a/wiki/inc/lang/hu/denied.txt b/wiki/inc/lang/hu/denied.txt
new file mode 100644
index 0000000..922cbb8
--- /dev/null
+++ b/wiki/inc/lang/hu/denied.txt
@@ -0,0 +1,4 @@
+====== Hozzáférés megtagadva ======
+
+Sajnáljuk, nincs jogod a folytatáshoz.
+
diff --git a/wiki/inc/lang/hu/diff.txt b/wiki/inc/lang/hu/diff.txt
new file mode 100644
index 0000000..50bd067
--- /dev/null
+++ b/wiki/inc/lang/hu/diff.txt
@@ -0,0 +1,4 @@
+====== Különbségek ======
+
+A kiválasztott változat és az aktuális verzió közötti különbségek a következők.
+
diff --git a/wiki/inc/lang/hu/draft.txt b/wiki/inc/lang/hu/draft.txt
new file mode 100644
index 0000000..cae980a
--- /dev/null
+++ b/wiki/inc/lang/hu/draft.txt
@@ -0,0 +1,5 @@
+===== Piszkozatot találtunk =====
+
+Az oldal utolsó szerkesztését nem fejezted be rendesen. A DokuWiki elmentette piszkozatként, így most folytathatod a szerkesztést. Lent látható, amit az utolsó szerkesztésből elmentettünk.
+
+Válassz a //helyreállítás// vagy a //törlés// opciók közül a piszkozat sorsát illetően vagy //megszakíthatod// a szerkesztési folyamatot.
\ No newline at end of file
diff --git a/wiki/inc/lang/hu/edit.txt b/wiki/inc/lang/hu/edit.txt
new file mode 100644
index 0000000..0992723
--- /dev/null
+++ b/wiki/inc/lang/hu/edit.txt
@@ -0,0 +1 @@
+Szerkeszd az oldalt majd kattints a ''Mentés'' gombra! Lásd a [[wiki:syntax|formázás]] oldalt a formázási lehetőségekért. Kérünk, hogy csak akkor szerkeszd az oldalt ha **javítani** tudsz rajta. Ha ki akarsz próbálni dolgokat, akkor az első lépéseid a [[playground:playground|játszótéren]] tedd.
diff --git a/wiki/inc/lang/hu/editrev.txt b/wiki/inc/lang/hu/editrev.txt
new file mode 100644
index 0000000..e17662e
--- /dev/null
+++ b/wiki/inc/lang/hu/editrev.txt
@@ -0,0 +1,2 @@
+**Egy korábbi változatot töltöttél be!** Ha elmented, akkor egy újabb aktuális verzió jön létre ezzel a tartalommal.
+----
diff --git a/wiki/inc/lang/hu/index.txt b/wiki/inc/lang/hu/index.txt
new file mode 100644
index 0000000..ebf1514
--- /dev/null
+++ b/wiki/inc/lang/hu/index.txt
@@ -0,0 +1,4 @@
+====== Áttekintő (index) ======
+
+Az összes elérhető oldal áttekintése [[doku>namespaces|névterek]] szerint rendezve.
+
diff --git a/wiki/inc/lang/hu/install.html b/wiki/inc/lang/hu/install.html
new file mode 100644
index 0000000..c037393
--- /dev/null
+++ b/wiki/inc/lang/hu/install.html
@@ -0,0 +1,26 @@
+<p>Ez az oldal segít a <a href="http://dokuwiki.org">DokuWiki</a> kezdeti
+beállításában és a konfigurálásban. További információ
+<a href="http://dokuwiki.org/installer">ezen az oldalon</a>
+található.</p>
+
+<p>A DokuWiki hagyományos fájlokat használ a wiki oldalak és a hozzájuk
+kapcsolódó információk (pl. képek, keresési indexek, korábbi változatok stb.)
+tárolásához. Emiatt a sikeres működés érdekében a DokuWikinek írási joggal
+<strong>kell</strong> rendelkeznie azokon a könyvtárakon, ahová ezek a
+fájlok kerülnek. Ez a Beállító Varázsló nem képes beállítani a könyvtárakhoz
+a szükséges jogosultságokat, azokat közvetlenül parancssorból kell megtenni,
+illetve tárhelyszolgáltatás igénybevétele esetén FTP kliens segítségével,
+vagy a tárhelyszolgáltató által rendelkezésre bocsátott beállítóeszköz
+(pl. cPanel) segítségével.</p>
+
+<p>A Beállító Varázsló felkészíti ezt a DokuWikit a hozzáférési listák
+(<abbr title="access control list">ACL</abbr>-ek) használatára. Így
+az Adminisztrátor felhasználóval hozzáférünk az admin menühöz, mellyel
+bővítményeket telepíthetünk, felhasználókat és hozzáférési jogokat
+kezelhetünk, valamint változtathatunk a konfigurációs beállításokon.
+Ez tulajdonképpen nem szükséges a DokuWiki működéséhez, de megkönnyíti
+az adminisztrációt.</p>
+
+<p>Szakértők illetve speciális beállítást igénylő felhasználók további információkat
+találnak a következő oldalakon a <a href="http://dokuwiki.org/install">telepítéssel</a>
+és <a href="http://dokuwiki.org/config">konfigurálási lehetőségekkel</a> kapcsolatban.</p>
diff --git a/wiki/inc/lang/hu/jquery.ui.datepicker.js b/wiki/inc/lang/hu/jquery.ui.datepicker.js
new file mode 100644
index 0000000..22bbe70
--- /dev/null
+++ b/wiki/inc/lang/hu/jquery.ui.datepicker.js
@@ -0,0 +1,36 @@
+/* Hungarian initialisation for the jQuery UI date picker plugin. */
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "../widgets/datepicker" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery.datepicker );
+	}
+}( function( datepicker ) {
+
+datepicker.regional.hu = {
+	closeText: "bezár",
+	prevText: "vissza",
+	nextText: "előre",
+	currentText: "ma",
+	monthNames: [ "Január", "Február", "Március", "Április", "Május", "Június",
+	"Július", "Augusztus", "Szeptember", "Október", "November", "December" ],
+	monthNamesShort: [ "Jan", "Feb", "Már", "Ápr", "Máj", "Jún",
+	"Júl", "Aug", "Szep", "Okt", "Nov", "Dec" ],
+	dayNames: [ "Vasárnap", "Hétfő", "Kedd", "Szerda", "Csütörtök", "Péntek", "Szombat" ],
+	dayNamesShort: [ "Vas", "Hét", "Ked", "Sze", "Csü", "Pén", "Szo" ],
+	dayNamesMin: [ "V", "H", "K", "Sze", "Cs", "P", "Szo" ],
+	weekHeader: "Hét",
+	dateFormat: "yy.mm.dd.",
+	firstDay: 1,
+	isRTL: false,
+	showMonthAfterYear: true,
+	yearSuffix: "" };
+datepicker.setDefaults( datepicker.regional.hu );
+
+return datepicker.regional.hu;
+
+} ) );
diff --git a/wiki/inc/lang/hu/lang.php b/wiki/inc/lang/hu/lang.php
new file mode 100644
index 0000000..e13c1ec
--- /dev/null
+++ b/wiki/inc/lang/hu/lang.php
@@ -0,0 +1,350 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Ziegler Gábor <gziegler@freemail.hu>
+ * @author Sandor TIHANYI <stihanyi+dw@gmail.com>
+ * @author Siaynoq Mage <siaynoqmage@gmail.com>
+ * @author schilling.janos@gmail.com
+ * @author Szabó Dávid <szabo.david@gyumolcstarhely.hu>
+ * @author Sándor TIHANYI <stihanyi+dw@gmail.com>
+ * @author David Szabo <szabo.david@gyumolcstarhely.hu>
+ * @author Marton Sebok <sebokmarton@gmail.com>
+ * @author Serenity87HUN <anikototh87@gmail.com>
+ * @author Marina Vladi <deldadam@gmail.com>
+ * @author Mátyás Jani <jzombi@gmail.com>
+ */
+$lang['encoding']              = 'utf-8';
+$lang['direction']             = 'ltr';
+$lang['doublequoteopening']    = '„';
+$lang['doublequoteclosing']    = '”';
+$lang['singlequoteopening']    = '‚';
+$lang['singlequoteclosing']    = '’';
+$lang['apostrophe']            = '’';
+$lang['btn_edit']              = 'Oldal szerkesztése';
+$lang['btn_source']            = 'Oldalforrás megtekintése';
+$lang['btn_show']              = 'Oldal megtekintése';
+$lang['btn_create']            = 'Oldal létrehozása';
+$lang['btn_search']            = 'Keresés';
+$lang['btn_save']              = 'Mentés';
+$lang['btn_preview']           = 'Előnézet';
+$lang['btn_top']               = 'Vissza a tetejére';
+$lang['btn_newer']             = '<< Újabb változat';
+$lang['btn_older']             = 'Régebbi változat >>';
+$lang['btn_revs']              = 'Korábbi változatok';
+$lang['btn_recent']            = 'Legfrissebb változások';
+$lang['btn_upload']            = 'Feltöltés';
+$lang['btn_cancel']            = 'Mégsem';
+$lang['btn_index']             = 'Áttekintő';
+$lang['btn_secedit']           = 'Szerkesztés';
+$lang['btn_login']             = 'Bejelentkezés';
+$lang['btn_logout']            = 'Kijelentkezés';
+$lang['btn_admin']             = 'Admin';
+$lang['btn_update']            = 'Frissítés';
+$lang['btn_delete']            = 'Törlés';
+$lang['btn_back']              = 'Vissza';
+$lang['btn_backlink']          = 'Hivatkozások';
+$lang['btn_subscribe']         = 'Feliratkozás az oldalváltozásokra';
+$lang['btn_profile']           = 'Személyes beállítások';
+$lang['btn_reset']             = 'Alaphelyzet';
+$lang['btn_resendpwd']         = 'Jelszóváltoztatás';
+$lang['btn_draft']             = 'Piszkozat szerkesztése';
+$lang['btn_recover']           = 'Piszkozat folytatása';
+$lang['btn_draftdel']          = 'Piszkozat törlése';
+$lang['btn_revert']            = 'Helyreállítás';
+$lang['btn_register']          = 'Regisztráció';
+$lang['btn_apply']             = 'Alkalmaz';
+$lang['btn_media']             = 'Médiakezelő';
+$lang['btn_deleteuser']        = 'Felhasználói fiókom eltávolítása';
+$lang['btn_img_backto']        = 'Vissza %s';
+$lang['btn_mediaManager']      = 'Megtekintés a médiakezelőben';
+$lang['loggedinas']            = 'Belépett felhasználó';
+$lang['user']                  = 'Azonosító';
+$lang['pass']                  = 'Jelszó';
+$lang['newpass']               = 'Új jelszó';
+$lang['oldpass']               = 'Régi jelszó';
+$lang['passchk']               = 'még egyszer';
+$lang['remember']              = 'Emlékezz rám';
+$lang['fullname']              = 'Teljes név';
+$lang['email']                 = 'E-Mail';
+$lang['profile']               = 'Személyes beállítások';
+$lang['badlogin']              = 'Sajnáljuk, az azonosító vagy a jelszó nem jó.';
+$lang['badpassconfirm']        = 'Hibás jelszó';
+$lang['minoredit']             = 'Apróbb változások';
+$lang['draftdate']             = 'Piszkozat elmentve:';
+$lang['nosecedit']             = 'Időközben megváltozott az oldal, emiatt a szakasz nem friss. Töltsd újra az egész oldalt!';
+$lang['regmissing']            = 'Sajnáljuk, az összes mezőt ki kell töltened.';
+$lang['reguexists']            = 'Sajnáljuk, ilyen azonosítójú felhasználónk már van.';
+$lang['regsuccess']            = 'A felhasználói azonosítót létrehoztuk. A jelszót postáztuk.';
+$lang['regsuccess2']           = 'A felhasználói azonosítót létrehoztuk.';
+$lang['regfail']               = 'A felhasználó létrehozása sikertelen.';
+$lang['regmailfail']           = 'Úgy tűnik hiba történt a jelszó postázása során. Kérjük lépj kapcsolatba az Adminisztrátorokkal!';
+$lang['regbadmail']            = 'A megadott e-mail cím érvénytelennek tűnik. Ha úgy gondolod ez hiba, lépj kapcsolatba az Adminisztrátorokkal!';
+$lang['regbadpass']            = 'A két megadott jelszó nem egyezik, próbáld újra!';
+$lang['regpwmail']             = 'A DokuWiki jelszavad';
+$lang['reghere']               = 'Még nincs azonosítód? Itt kérhetsz';
+$lang['profna']                = 'Ez a wiki nem támogatja a személyes beállítások módosítását.';
+$lang['profnochange']          = 'Nem történt változás.';
+$lang['profnoempty']           = 'A név és e-mail mező nem maradhat üresen!';
+$lang['profchanged']           = 'A személyes beállítások változtatása megtörtént.';
+$lang['profnodelete']          = 'Ez a wiki nem támogatja a felhasználói fiókok törlését';
+$lang['profdeleteuser']        = 'Felhasználói fiók törlése';
+$lang['profdeleted']           = 'Felhasználói fiókodat eltávolítottuk erről a wiki-ről.';
+$lang['profconfdelete']        = 'Szeretném eltávolítani a felhasználói fiókomat erről a wikiről. <br/> Ez a cselekvés nem visszavonható.';
+$lang['profconfdeletemissing'] = 'A megerősítő négyzet nincs bepipálva';
+$lang['proffail']              = 'A profil frissítése sikertelen.';
+$lang['pwdforget']             = 'Elfelejtetted a jelszavad? Itt kérhetsz újat';
+$lang['resendna']              = 'Ez a wiki nem támogatja a jelszó újraküldést.';
+$lang['resendpwd']             = 'Új jelszó beállítása a következőhöz:';
+$lang['resendpwdmissing']      = 'Sajnáljuk, az összes mezőt ki kell töltened.';
+$lang['resendpwdnouser']       = 'Sajnáljuk, ilyen azonosítójú felhasználónk nem létezik.';
+$lang['resendpwdbadauth']      = 'Sajnáljuk, ez a megerősítő kód nem helyes. Biztos, hogy a teljes megerősítő linket pontosan beírtad?';
+$lang['resendpwdconfirm']      = 'A megerősítő linket e-mailben elküldtük.';
+$lang['resendpwdsuccess']      = 'Az új jelszavadat elküldtük e-mailben.';
+$lang['license']               = 'Hacsak máshol nincs egyéb rendelkezés, ezen wiki tartalma a következő licenc alatt érhető el:';
+$lang['licenseok']             = 'Megjegyzés: az oldal szerkesztésével elfogadja, hogy a tartalom a következő licenc alatt lesz elérhető:';
+$lang['searchmedia']           = 'Keresett fájl neve:';
+$lang['searchmedia_in']        = 'Keresés a következőben: %s';
+$lang['txt_upload']            = 'Válaszd ki a feltöltendő fájlt:';
+$lang['txt_filename']          = 'Feltöltési név (elhagyható):';
+$lang['txt_overwrt']           = 'Létező fájl felülírása';
+$lang['maxuploadsize']         = 'Maximum %s méretű fájlokat tölthetsz fel.';
+$lang['lockedby']              = 'Jelenleg zárolta:';
+$lang['lockexpire']            = 'A zárolás lejár:';
+$lang['js']['willexpire']      = 'Az oldalszerkesztési zárolásod körülbelül egy percen belül lejár.\nAz ütközések elkerülése végett használd az előnézet gombot a zárolásod frissítéséhez.';
+$lang['js']['notsavedyet']     = 'Elmentetlen változások vannak, amelyek el fognak veszni.
+Tényleg ezt akarod?';
+$lang['js']['searchmedia']     = 'Fájlok keresése';
+$lang['js']['keepopen']        = 'Tartsd nyitva ezt az ablakot a kijelöléshez!';
+$lang['js']['hidedetails']     = 'Részletek elrejtése';
+$lang['js']['mediatitle']      = 'Link beállítások';
+$lang['js']['mediadisplay']    = 'Link típusa';
+$lang['js']['mediaalign']      = 'Igazítás';
+$lang['js']['mediasize']       = 'Képméret';
+$lang['js']['mediatarget']     = 'Link célja';
+$lang['js']['mediaclose']      = 'Bezárás';
+$lang['js']['mediainsert']     = 'Beillesztés';
+$lang['js']['mediadisplayimg'] = 'Kép megtekintése.';
+$lang['js']['mediadisplaylnk'] = 'Link megtekintése.';
+$lang['js']['mediasmall']      = 'Kis méret';
+$lang['js']['mediamedium']     = 'Közepes méret';
+$lang['js']['medialarge']      = 'Nagy méret';
+$lang['js']['mediaoriginal']   = 'Eredeti verzió';
+$lang['js']['medialnk']        = 'Link a részletekre';
+$lang['js']['mediadirect']     = 'Közvetlen link az eredetire';
+$lang['js']['medianolnk']      = 'Nincs link';
+$lang['js']['medianolink']     = 'Ne linkelje a képet';
+$lang['js']['medialeft']       = 'Kép igazítása balra.';
+$lang['js']['mediaright']      = 'Kép igazítása jobbra.';
+$lang['js']['mediacenter']     = 'Kép igazítása középre.';
+$lang['js']['medianoalign']    = 'Nem legyen igazítás.';
+$lang['js']['nosmblinks']      = 'A Windows megosztott könyvtárak kereszthivatkozása csak Microsoft Internet Explorerben működik közvetlenül.\nA hivatkozást másolni és beszúrni ettől függetlenül mindig tudod.';
+$lang['js']['linkwiz']         = 'Hivatkozás varázsló';
+$lang['js']['linkto']          = 'Hivatkozás erre:';
+$lang['js']['del_confirm']     = 'Valóban törölni akarod a kiválasztott elem(ek)et?';
+$lang['js']['restore_confirm'] = 'Valóban visszaállítod ezt a verziót?';
+$lang['js']['media_diff']      = 'Különbségek megtekintése:';
+$lang['js']['media_diff_both'] = 'Egymás mellett';
+$lang['js']['media_diff_opacity'] = 'Áttetszően';
+$lang['js']['media_diff_portions'] = 'Húzással';
+$lang['js']['media_select']    = 'Fájlok kiválasztása...';
+$lang['js']['media_upload_btn'] = 'Feltöltés';
+$lang['js']['media_done_btn']  = 'Kész';
+$lang['js']['media_drop']      = 'Húzd ide a fájlokat a feltöltéshez';
+$lang['js']['media_cancel']    = 'eltávolítás';
+$lang['js']['media_overwrt']   = 'Meglévő fájlok felülírása';
+$lang['rssfailed']             = 'Hiba történt a hírfolyam betöltésekor: ';
+$lang['nothingfound']          = 'Üres mappa.';
+$lang['mediaselect']           = 'Médiafájl kiválasztása';
+$lang['uploadsucc']            = 'Sikeres feltöltés';
+$lang['uploadfail']            = 'A feltöltés nem sikerült. Talán rosszak a jogosultságok?';
+$lang['uploadwrong']           = 'A feltöltés megtagadva. Ez a fájlkiterjesztés tiltott.';
+$lang['uploadexist']           = 'A fájl már létezik, nem történt semmi.';
+$lang['uploadbadcontent']      = 'A feltöltött tartalom nem egyezik a %s fájlkiterjesztéssel.';
+$lang['uploadspam']            = 'A feltöltést visszautasítottuk spam-gyanú miatt.';
+$lang['uploadxss']             = 'A feltöltést visszautasítottuk, mert lehetséges, hogy kártékony kódot tartalmaz.';
+$lang['uploadsize']            = 'A feltöltött fájl túl nagy. (max. %s)';
+$lang['deletesucc']            = 'A "%s" fájlt töröltük.';
+$lang['deletefail']            = 'A "%s" fájl nem törölhető - ellenőrizd a jogosultságokat!';
+$lang['mediainuse']            = 'A "%s" fájl nem törlődött - még használat alatt van!';
+$lang['namespaces']            = 'Névterek';
+$lang['mediafiles']            = 'Elérhető fájlok itt:';
+$lang['accessdenied']          = 'Nincs jogod az oldal megtekintésére.';
+$lang['mediausage']            = 'A következő formában hivatkozhatsz erre a fájlra:';
+$lang['mediaview']             = 'Eredeti fájl megtekintése';
+$lang['mediaroot']             = 'kiindulási hely';
+$lang['mediaupload']           = 'Itt tölthetsz fel állományt az aktuális névtérbe. Alnévtér létrehozásához a "Feltöltési név" mezőben kell kettősponttal elválasztva megadnod azt.';
+$lang['mediaextchange']        = 'Az állomány kiterjesztése erről: .%s erre: .%s változott!';
+$lang['reference']             = 'Hivatkozások';
+$lang['ref_inuse']             = 'A fájl nem törölhető, mert a következő oldalakon használják:';
+$lang['ref_hidden']            = 'Van néhány hivatkozás az oldalakon, amelyekhez nincs olvasási jogosultságod';
+$lang['hits']                  = 'Találatok';
+$lang['quickhits']             = 'Illeszkedő oldalnevek';
+$lang['toc']                   = 'Tartalomjegyzék';
+$lang['current']               = 'aktuális';
+$lang['yours']                 = 'A Te változatod';
+$lang['diff']                  = 'Különbségek az aktuális változathoz képest';
+$lang['diff2']                 = 'Különbségek a kiválasztott változatok között';
+$lang['difflink']              = 'Összehasonlító nézet linkje';
+$lang['diff_type']             = 'Összehasonlítás módja:';
+$lang['diff_inline']           = 'Sorok között';
+$lang['diff_side']             = 'Egymás mellett';
+$lang['diffprevrev']           = 'Előző változat';
+$lang['diffnextrev']           = 'Következő változat';
+$lang['difflastrev']           = 'Utolsó változat';
+$lang['diffbothprevrev']       = 'Előző változat mindkét oldalon';
+$lang['diffbothnextrev']       = 'Következő változat mindkét oldalon';
+$lang['line']                  = 'Sor';
+$lang['breadcrumb']            = 'Nyomvonal:';
+$lang['youarehere']            = 'Itt vagy:';
+$lang['lastmod']               = 'Utolsó módosítás:';
+$lang['by']                    = 'szerkesztette:';
+$lang['deleted']               = 'eltávolítva';
+$lang['created']               = 'létrehozva';
+$lang['restored']              = 'régebbi változat helyreállítva (%s)';
+$lang['external_edit']         = 'külső szerkesztés';
+$lang['summary']               = 'A változások összefoglalása';
+$lang['noflash']               = 'Ennek a tartalomnak a megtekintéséhez <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> szükséges.';
+$lang['download']              = 'Kódrészlet letöltése';
+$lang['tools']                 = 'Eszközök';
+$lang['user_tools']            = 'Felhasználói eszközök';
+$lang['site_tools']            = 'Eszközök a webhelyen';
+$lang['page_tools']            = 'Eszközök az oldalon';
+$lang['skip_to_content']       = 'ugrás a tartalomhoz';
+$lang['sidebar']               = 'Oldalsáv';
+$lang['mail_newpage']          = 'új oldal jött létre:';
+$lang['mail_changed']          = 'oldal megváltozott:';
+$lang['mail_subscribe_list']   = 'oldalak megváltoztak ebben a névtérben:';
+$lang['mail_new_user']         = 'új felhasználó:';
+$lang['mail_upload']           = 'új állományt töltöttek fel:';
+$lang['changes_type']          = 'A következő változásainak megtekintése:';
+$lang['pages_changes']         = 'Oldalak';
+$lang['media_changes']         = 'Médiafájlok';
+$lang['both_changes']          = 'Oldalak és médiafájlok';
+$lang['qb_bold']               = 'Félkövér szöveg';
+$lang['qb_italic']             = 'Dőlt szöveg';
+$lang['qb_underl']             = 'Aláhúzott szöveg';
+$lang['qb_code']               = 'Forráskód';
+$lang['qb_strike']             = 'Áthúzott szöveg';
+$lang['qb_h1']                 = '1. szintű címsor';
+$lang['qb_h2']                 = '2. szintű címsor';
+$lang['qb_h3']                 = '3. szintű címsor';
+$lang['qb_h4']                 = '4. szintű címsor';
+$lang['qb_h5']                 = '5. szintű címsor';
+$lang['qb_h']                  = 'Címsor';
+$lang['qb_hs']                 = 'Címsor kiválasztása';
+$lang['qb_hplus']              = 'Nagyobb címsor';
+$lang['qb_hminus']             = 'Kisebb címsor';
+$lang['qb_hequal']             = 'Azonos szintű címsor';
+$lang['qb_link']               = 'Belső hivatkozás';
+$lang['qb_extlink']            = 'Külső hivatkozás';
+$lang['qb_hr']                 = 'Vízszintes elválasztó vonal';
+$lang['qb_ol']                 = 'Sorszámozott lista elem';
+$lang['qb_ul']                 = 'Felsorolásos lista elem';
+$lang['qb_media']              = 'Képek és más fájlok hozzáadása';
+$lang['qb_sig']                = 'Aláírás beszúrása';
+$lang['qb_smileys']            = 'Smiley-k';
+$lang['qb_chars']              = 'Speciális karakterek';
+$lang['upperns']               = 'ugrás a tartalmazó névtérhez';
+$lang['metaedit']              = 'Metaadatok szerkesztése';
+$lang['metasaveerr']           = 'A metaadatok írása nem sikerült';
+$lang['metasaveok']            = 'Metaadatok elmentve';
+$lang['img_title']             = 'Cím:';
+$lang['img_caption']           = 'Képaláírás:';
+$lang['img_date']              = 'Dátum:';
+$lang['img_fname']             = 'Fájlnév:';
+$lang['img_fsize']             = 'Méret:';
+$lang['img_artist']            = 'Készítette:';
+$lang['img_copyr']             = 'Szerzői jogok:';
+$lang['img_format']            = 'Formátum:';
+$lang['img_camera']            = 'Fényképezőgép típusa:';
+$lang['img_keywords']          = 'Kulcsszavak:';
+$lang['img_width']             = 'Szélesség:';
+$lang['img_height']            = 'Magasság:';
+$lang['subscr_subscribe_success'] = '%s hozzáadva az értesítési listához: %s';
+$lang['subscr_subscribe_error'] = 'Hiba történt %s hozzáadásakor az értesítési listához: %s';
+$lang['subscr_subscribe_noaddress'] = 'Nincs e-mail cím megadva az adataidnál, így a rendszer nem tudott hozzáadni az értesítési listához';
+$lang['subscr_unsubscribe_success'] = '%s eltávolítva az értesítési listából: %s';
+$lang['subscr_unsubscribe_error'] = 'Hiba történt %s eltávolításakor az értesítési listából: %s';
+$lang['subscr_already_subscribed'] = '%s már feliratkozott erre: %s';
+$lang['subscr_not_subscribed'] = '%s nincs feliratkozva erre: %s';
+$lang['subscr_m_not_subscribed'] = 'Jelenleg nem vagy feliratkozva erre az oldalra vagy névtérre';
+$lang['subscr_m_new_header']   = 'Feliratkozás hozzáadása';
+$lang['subscr_m_current_header'] = 'Feliratkozások';
+$lang['subscr_m_unsubscribe']  = 'Leiratkozás';
+$lang['subscr_m_subscribe']    = 'Feliratkozás';
+$lang['subscr_m_receive']      = 'Küldj';
+$lang['subscr_style_every']    = 'e-mailt minden változásról';
+$lang['subscr_style_digest']   = 'összefoglaló e-mailt oldalanként (minden %.2f nap)';
+$lang['subscr_style_list']     = 'egy listát a módosított oldalakról a legutóbbi e-mail óta (minden %.2f nap)';
+$lang['authtempfail']          = 'A felhasználó azonosítás átmenetileg nem működik. Ha sokáig így lenne, légy szíves értesítsd az Adminisztrátorokat!';
+$lang['i_chooselang']          = 'Válassz nyelvet';
+$lang['i_installer']           = 'DokuWiki Beállító Varázsló';
+$lang['i_wikiname']            = 'A Wiki neve';
+$lang['i_enableacl']           = 'Hozzáférési listák engedélyezése (ajánlott)';
+$lang['i_superuser']           = 'Adminisztrátor';
+$lang['i_problems']            = 'A Beállító Varázsló a következő problémák miatt megakadt. Nem tudjuk folytatni, amíg ezek nincsenek elhárítva!';
+$lang['i_modified']            = 'Biztonsági okokból ez a Varázsló csak új és módosítatlan DokuWiki változaton működik.
+Csomagold ki újra a fájlokat a letöltött csomagból, vagy nézd meg a teljes <a href="http://dokuwiki.org/install">Dokuwiki telepítési útmutatót</a>.';
+$lang['i_funcna']              = 'A <code>%s</code> PHP funkció nem elérhető. Esetleg a tárhelyszolgáltató letiltotta biztonsági okok miatt?';
+$lang['i_phpver']              = 'A PHP <code>%s</code> verziója alacsonyabb, mint ami szükséges lenne: <code>%s</code>. Frissítsd a PHP-det újabb verzióra!';
+$lang['i_mbfuncoverload']      = 'A DokuWiki futtatásához az mbstring.func_overload opciót ki kell kapcsolni a php.ini-ben.';
+$lang['i_permfail']            = 'A DokiWiki nem tudja írni a <code>%s</code> könyvtárat. Be kell állítanod ehhez a könyvtárhoz a megfelelő jogosultságokat!';
+$lang['i_confexists']          = '<code>%s</code> már létezik.';
+$lang['i_writeerr']            = 'Nem tudom ezt létrehozni: <code>%s</code>. Ellenőrizd a könyvtár/fájl jogosultságokat, és hozd létre az állományt kézzel.';
+$lang['i_badhash']             = 'A dokuwiki.php nem felismerhető vagy módosított (hash=<code>%s</code>)';
+$lang['i_badval']              = '<code>%s</code> - nem helyes vagy üres érték';
+$lang['i_success']             = 'A beállítás sikeresen befejeződött. Most már letörölhető az install.php fájl. Látogasd meg az <a href="doku.php?id=wiki:welcome">új DokuWikidet</a>!';
+$lang['i_failure']             = 'Hiba lépett fel a konfigurációs állományok írásakor. Ki kell javítanod kézzel, mielőtt használni kezded az <a href="doku.php?id=wiki:welcome">új DokuWikidet</a>.';
+$lang['i_policy']              = 'Kezdeti hozzáférési lista házirend';
+$lang['i_pol0']                = 'Nyitott wiki (mindenki olvashatja, írhatja és fájlokat tölthet fel)';
+$lang['i_pol1']                = 'Publikus wiki (mindenki olvashatja, de csak regisztrált felhasználók írhatják és tölthetnek fel fájlokat)';
+$lang['i_pol2']                = 'Zárt wiki (csak regisztrált felhasználók olvashatják, írhatják és tölthetnek fel fájlokat)';
+$lang['i_allowreg']            = 'A felhasználók saját maguk is regisztrálhatnak';
+$lang['i_retry']               = 'Újra';
+$lang['i_license']             = 'Kérlek, válassz licencet a feltöltött tartalomhoz:';
+$lang['i_license_none']        = 'Ne jelenítsen meg licenc információt';
+$lang['i_pop_field']           = 'Kérjük, segíts a DokuWiki továbbfejlesztésében:';
+$lang['i_pop_label']           = 'Havonta egyszer névtelen üzenet küldése a DokuWiki fejlesztőinek';
+$lang['recent_global']         = 'Jelenleg csak a <b>%s</b> névtér friss változásai látszanak. Megtekinthetők <a href="%s">a teljes wiki friss változásai</a> is.';
+$lang['years']                 = '%d évvel ezelőtt';
+$lang['months']                = '%d hónappal ezelőtt';
+$lang['weeks']                 = '%d héttel ezelőtt';
+$lang['days']                  = '%d nappal ezelőtt';
+$lang['hours']                 = '%d órával ezelőtt';
+$lang['minutes']               = '%d perccel ezelőtt';
+$lang['seconds']               = '%d másodperccel ezelőtt';
+$lang['wordblock']             = 'A változásokat nem sikerült menteni, mert tiltott tartalom van benne (spam).';
+$lang['media_uploadtab']       = 'Feltöltés';
+$lang['media_searchtab']       = 'Keresés';
+$lang['media_file']            = 'Fájl';
+$lang['media_viewtab']         = 'Megtekintés';
+$lang['media_edittab']         = 'Szerkesztés';
+$lang['media_historytab']      = 'Korábbi változatok';
+$lang['media_list_thumbs']     = 'Bélyegképek';
+$lang['media_list_rows']       = 'Sorok';
+$lang['media_sort_name']       = 'Név';
+$lang['media_sort_date']       = 'Dátum';
+$lang['media_namespaces']      = 'Névtér kiválasztása';
+$lang['media_files']           = 'Fájlok itt: %s';
+$lang['media_upload']          = 'Feltöltés ide: %s';
+$lang['media_search']          = 'Keresés itt: %s';
+$lang['media_view']            = '%s';
+$lang['media_viewold']         = '%s itt: %s';
+$lang['media_edit']            = '%s szerkesztése';
+$lang['media_history']         = '%s korábbi változatai';
+$lang['media_meta_edited']     = 'metaadatot szerkesztve';
+$lang['media_perm_read']       = 'Sajnáljuk, nincs jogod a fájlok olvasásához.';
+$lang['media_perm_upload']     = 'Sajnáljuk, nincs jogod a feltöltéshez.';
+$lang['media_update']          = 'Új verzió feltöltése';
+$lang['media_restore']         = 'Ezen verzió visszaállítása';
+$lang['media_acl_warning']     = 'Ez a lista hiányos lehet a hozzáférési listák (ACL) korlátozásai és a rejtett oldalak miatt.';
+$lang['currentns']             = 'Aktuális névtér';
+$lang['searchresult']          = 'Keresés eredménye';
+$lang['plainhtml']             = 'Sima HTML';
+$lang['wikimarkup']            = 'Wiki-jelölőnyelv';
+$lang['email_signature_text']       = 'Ezt a levelet a DokuWiki generálta
+@DOKUWIKIURL@';
+$lang['page_nonexist_rev']     = 'A(z) %s oldal nem létezik. Később lett létrehozva a(z) <a href="%s">%s</a> helyen.';
+$lang['unable_to_parse_date']  = 'A "%s" paraméter feldolgozása sikertelen.';
diff --git a/wiki/inc/lang/hu/locked.txt b/wiki/inc/lang/hu/locked.txt
new file mode 100644
index 0000000..004c461
--- /dev/null
+++ b/wiki/inc/lang/hu/locked.txt
@@ -0,0 +1,4 @@
+====== Az oldal zárolva ======
+
+Ezt az oldalt épp szerkeszti egy másik felhasználó. Várnod kell, amíg a másik felhasználó befejezi, vagy amíg a zárolási ideje le nem jár.
+
diff --git a/wiki/inc/lang/hu/login.txt b/wiki/inc/lang/hu/login.txt
new file mode 100644
index 0000000..3f7e62e
--- /dev/null
+++ b/wiki/inc/lang/hu/login.txt
@@ -0,0 +1,5 @@
+====== Belépés ======
+
+Nem vagy bejelentkezve! Add meg az azonosítási adataid a belépéshez lentebb! A böngésződben engedélyezned kell a sütik (cookies) fogadását a belépéshez.
+
+
diff --git a/wiki/inc/lang/hu/mailtext.txt b/wiki/inc/lang/hu/mailtext.txt
new file mode 100644
index 0000000..d8d0336
--- /dev/null
+++ b/wiki/inc/lang/hu/mailtext.txt
@@ -0,0 +1,12 @@
+A DokuWikidben egy oldalt létrejött, vagy megváltozott. A részletek:
+
+Dátum: @DATE@
+Böngésző: @BROWSER@
+IP-cím: @IPADDRESS@
+Gép neve: @HOSTNAME@
+Előző változat: @OLDPAGE@
+Új változat: @NEWPAGE@
+Összefoglaló: @SUMMARY@
+Felhasználó: @USER@
+
+@DIFF@
diff --git a/wiki/inc/lang/hu/mailwrap.html b/wiki/inc/lang/hu/mailwrap.html
new file mode 100644
index 0000000..d257190
--- /dev/null
+++ b/wiki/inc/lang/hu/mailwrap.html
@@ -0,0 +1,13 @@
+<html>
+<head>
+<title>@TITLE@</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+</head>
+<body>
+
+@HTMLBODY@
+
+<br /><hr />
+<small>@EMAILSIGNATURE@</small>
+</body>
+</html>
\ No newline at end of file
diff --git a/wiki/inc/lang/hu/newpage.txt b/wiki/inc/lang/hu/newpage.txt
new file mode 100644
index 0000000..de5a34d
--- /dev/null
+++ b/wiki/inc/lang/hu/newpage.txt
@@ -0,0 +1,3 @@
+====== Ilyen oldal még nem létezik ======
+
+Egy nem létező oldalra tévedtél. Létrehozhatod az ''Oldal létrehozása'' gombra kattintva.
\ No newline at end of file
diff --git a/wiki/inc/lang/hu/norev.txt b/wiki/inc/lang/hu/norev.txt
new file mode 100644
index 0000000..1f4e672
--- /dev/null
+++ b/wiki/inc/lang/hu/norev.txt
@@ -0,0 +1,5 @@
+====== Nincs ilyen változat ======
+
+A megadott változat nem létezik. Használd az ''Előző változatok'' gombot az előzmények listájának megtekintéséhez.
+
+
diff --git a/wiki/inc/lang/hu/password.txt b/wiki/inc/lang/hu/password.txt
new file mode 100644
index 0000000..49cf69f
--- /dev/null
+++ b/wiki/inc/lang/hu/password.txt
@@ -0,0 +1,6 @@
+Kedves @FULLNAME@!
+
+A felhasználói adataid a @TITLE@ wikihez, a következő helyen:  @DOKUWIKIURL@
+
+Azonosító: @LOGIN@
+Jelszó: @PASSWORD@
diff --git a/wiki/inc/lang/hu/preview.txt b/wiki/inc/lang/hu/preview.txt
new file mode 100644
index 0000000..e04b2c8
--- /dev/null
+++ b/wiki/inc/lang/hu/preview.txt
@@ -0,0 +1,3 @@
+====== Előnézet ======
+
+Ez a szöveged előnézete, így fog kinézni élesben. Viszont ez **még nincs elmentve**!
diff --git a/wiki/inc/lang/hu/pwconfirm.txt b/wiki/inc/lang/hu/pwconfirm.txt
new file mode 100644
index 0000000..203dc39
--- /dev/null
+++ b/wiki/inc/lang/hu/pwconfirm.txt
@@ -0,0 +1,11 @@
+Szia @FULLNAME@!
+
+Te vagy más valaki kért egy új jelszót a @DOKUWIKIURL@
+címen lévő @TITLE@ wiki felhasználódhoz.
+
+Ha nem kértél ilyet, hagyd figyelmen kívül ezt a levelet.
+
+Ha Te voltál, az új jelszó kérelmed megerősítéséhez kattints a
+következő linkre vagy másold a böngésződbe:
+
+@CONFIRM@
diff --git a/wiki/inc/lang/hu/read.txt b/wiki/inc/lang/hu/read.txt
new file mode 100644
index 0000000..223a6fe
--- /dev/null
+++ b/wiki/inc/lang/hu/read.txt
@@ -0,0 +1 @@
+Ez az oldal csak olvasható. Megtekintheted a forrását, de nem változtathatod meg. Ha úgy gondolod, hogy ez helytelen, kérdezd az Adminisztrátorokat!
diff --git a/wiki/inc/lang/hu/recent.txt b/wiki/inc/lang/hu/recent.txt
new file mode 100644
index 0000000..4e0c1ec
--- /dev/null
+++ b/wiki/inc/lang/hu/recent.txt
@@ -0,0 +1,5 @@
+====== Legutóbbi változások ======
+
+Az alábbi oldalak változtak legutoljára.
+
+
diff --git a/wiki/inc/lang/hu/register.txt b/wiki/inc/lang/hu/register.txt
new file mode 100644
index 0000000..523b720
--- /dev/null
+++ b/wiki/inc/lang/hu/register.txt
@@ -0,0 +1,4 @@
+====== Új felhasználó regisztrálása ======
+
+Töltsd ki az összes alábbi adatot az új Wiki felhasználói azonosítód létrehozásához. Győződj meg róla, hogy **érvényes e-mail címet** adtál meg, mivel az új jelszavad erre a címre küldjük el. Az azonosítód érvényes [[doku>pagename|oldalnév]] kell legyen.
+
diff --git a/wiki/inc/lang/hu/registermail.txt b/wiki/inc/lang/hu/registermail.txt
new file mode 100644
index 0000000..d37d59b
--- /dev/null
+++ b/wiki/inc/lang/hu/registermail.txt
@@ -0,0 +1,10 @@
+Egy új felhasználó regisztrált a következő adatokkal:
+
+Felhasználói név: @NEWUSER@
+Teljes név: @NEWNAME@
+E-mail: @NEWEMAIL@
+
+Dátum: @DATE@
+Böngésző: @BROWSER@
+IP-cím : @IPADDRESS@
+Gép neve: @HOSTNAME@
diff --git a/wiki/inc/lang/hu/resendpwd.txt b/wiki/inc/lang/hu/resendpwd.txt
new file mode 100644
index 0000000..b73fa42
--- /dev/null
+++ b/wiki/inc/lang/hu/resendpwd.txt
@@ -0,0 +1,3 @@
+===== Új jelszó kérése =====
+
+Kérlek, add meg a felhasználói azonosítód az új jelszó elküldéséhez. A jelszó cseréjéhez szükséges megerősítő linket elküldjük a regisztrált e-mail címedre.
\ No newline at end of file
diff --git a/wiki/inc/lang/hu/resetpwd.txt b/wiki/inc/lang/hu/resetpwd.txt
new file mode 100644
index 0000000..53b28d7
--- /dev/null
+++ b/wiki/inc/lang/hu/resetpwd.txt
@@ -0,0 +1,3 @@
+====== Új jelszó beállítása ======
+
+Kérlek, add meg az új jelszót a felhasználódhoz.
\ No newline at end of file
diff --git a/wiki/inc/lang/hu/revisions.txt b/wiki/inc/lang/hu/revisions.txt
new file mode 100644
index 0000000..3537fd6
--- /dev/null
+++ b/wiki/inc/lang/hu/revisions.txt
@@ -0,0 +1,3 @@
+====== Előző változatok ======
+
+Ezek az előző változatai az aktuális dokumentumnak. Egy előző változathoz való visszatéréshez nyomd meg az ''Oldal szerkesztése'' gombot, majd mentsd el.
diff --git a/wiki/inc/lang/hu/searchpage.txt b/wiki/inc/lang/hu/searchpage.txt
new file mode 100644
index 0000000..6329a46
--- /dev/null
+++ b/wiki/inc/lang/hu/searchpage.txt
@@ -0,0 +1,4 @@
+====== Keresés ======
+
+A keresés eredményét lentebb láthatod. @CREATEPAGEINFO@
+
diff --git a/wiki/inc/lang/hu/showrev.txt b/wiki/inc/lang/hu/showrev.txt
new file mode 100644
index 0000000..2131b4d
--- /dev/null
+++ b/wiki/inc/lang/hu/showrev.txt
@@ -0,0 +1,2 @@
+**Ez a dokumentum egy előző változata!**
+----
diff --git a/wiki/inc/lang/hu/stopwords.txt b/wiki/inc/lang/hu/stopwords.txt
new file mode 100644
index 0000000..a8bd35c
--- /dev/null
+++ b/wiki/inc/lang/hu/stopwords.txt
@@ -0,0 +1,39 @@
+# Ez egy szó-lista (soronként egy szóval), amelyeket az index készítésekor nem veszünk figyelembe.
+# Ha szerkeszted ezt a fájlt, győződj meg arról, hogy UNIX sorvég-jeleket használj! (csak NL karakter)
+# Nincs szükség 3 karakternél rövidebb szavak felsorolására, ezeket egyébként sem vesszük figyelembe.
+# Ez a lista a http://www.ranks.nl/stopwords/ oldalon szereplő alapján készült
+a
+az
+egy
+be
+ki
+le
+fel
+meg
+el
+át
+rá
+ide
+oda
+szét
+össze
+vissza
+de
+hát
+és
+vagy
+hogy
+van
+lesz
+volt
+csak
+nem
+igen
+mint
+én
+te

+mi
+ti
+ők
+ön
diff --git a/wiki/inc/lang/hu/subscr_digest.txt b/wiki/inc/lang/hu/subscr_digest.txt
new file mode 100644
index 0000000..874c934
--- /dev/null
+++ b/wiki/inc/lang/hu/subscr_digest.txt
@@ -0,0 +1,13 @@
+Szia,
+
+A @PAGE@ oldal a @TITLE wikiben megváltozott.
+Itt vannak az eltérések:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Régi verzió: @OLDPAGE@
+Új verzió: @NEWPAGE@
+
+Ha nem szeretnél értesítéseket kapni, jelentkezz be a wiki-be itt: @DOKUWIKIURL@, majd ezen az oldalon tudsz leiratkozni: @SUBSCRIBE@.
diff --git a/wiki/inc/lang/hu/subscr_form.txt b/wiki/inc/lang/hu/subscr_form.txt
new file mode 100644
index 0000000..22fa940
--- /dev/null
+++ b/wiki/inc/lang/hu/subscr_form.txt
@@ -0,0 +1,3 @@
+====== Feliratkozás kezelés ======
+
+Ezen az oldalon van lehetőséged kezelni a feliratkozásaidat az adott oldalra vagy névtérre.
\ No newline at end of file
diff --git a/wiki/inc/lang/hu/subscr_list.txt b/wiki/inc/lang/hu/subscr_list.txt
new file mode 100644
index 0000000..c87d6dc
--- /dev/null
+++ b/wiki/inc/lang/hu/subscr_list.txt
@@ -0,0 +1,10 @@
+Szia,
+
+A @PAGE@ névtérhez tartozó oldalak megváltoztak a @TITLE wikiben.
+A módosított oldalak a következők:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Ha nem szeretnél értesítéseket kapni, jelentkezz be a wiki-be itt: @DOKUWIKIURL@, majd ezen az oldalon tudsz leiratkozni: @SUBSCRIBE@.
diff --git a/wiki/inc/lang/hu/subscr_single.txt b/wiki/inc/lang/hu/subscr_single.txt
new file mode 100644
index 0000000..8d36def
--- /dev/null
+++ b/wiki/inc/lang/hu/subscr_single.txt
@@ -0,0 +1,16 @@
+Szia,
+
+A @PAGE@ oldal a @TITLE wikiben megváltozott.
+Az eltérések a következők:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Dátum: @DATE@
+Felhasználó: @USER@
+Összefoglaló: @SUMMARY@
+Régi verzió: @OLDPAGE@
+Új verzió: @NEWPAGE@
+
+Ha nem szeretnél értesítéseket kapni, jelentkezz be a wiki-be itt: @DOKUWIKIURL@, majd ezen az oldalon tudsz leiratkozni: @NEWPAGE@.
diff --git a/wiki/inc/lang/hu/updateprofile.txt b/wiki/inc/lang/hu/updateprofile.txt
new file mode 100644
index 0000000..50df153
--- /dev/null
+++ b/wiki/inc/lang/hu/updateprofile.txt
@@ -0,0 +1,3 @@
+===== Felhasználói adatok megváltoztatása =====
+
+Csak azt a mezőt kell kitöltened, amit változtatni szeretnél. A felhasználói nevet nem lehet megváltoztatni.
diff --git a/wiki/inc/lang/hu/uploadmail.txt b/wiki/inc/lang/hu/uploadmail.txt
new file mode 100644
index 0000000..62e0c2e
--- /dev/null
+++ b/wiki/inc/lang/hu/uploadmail.txt
@@ -0,0 +1,10 @@
+Fájlfeltöltés történt a DokuWikidben. Részletek:
+
+Állomány: @MEDIA@
+Dátum: @DATE@
+Böngésző: @BROWSER@
+IP-cím: @IPADDRESS@
+Gépnév: @HOSTNAME@
+Méret: @SIZE@
+MIME-típus: @MIME@
+Felhasználó: @USER@
diff --git a/wiki/inc/lang/ia/admin.txt b/wiki/inc/lang/ia/admin.txt
new file mode 100644
index 0000000..f81ff31
--- /dev/null
+++ b/wiki/inc/lang/ia/admin.txt
@@ -0,0 +1,3 @@
+====== Administration ======
+
+Hic infra se trova un lista de cargas administrative disponibile in DokuWiki.
diff --git a/wiki/inc/lang/ia/adminplugins.txt b/wiki/inc/lang/ia/adminplugins.txt
new file mode 100644
index 0000000..ad8f794
--- /dev/null
+++ b/wiki/inc/lang/ia/adminplugins.txt
@@ -0,0 +1 @@
+===== Plug-ins additional =====
\ No newline at end of file
diff --git a/wiki/inc/lang/ia/backlinks.txt b/wiki/inc/lang/ia/backlinks.txt
new file mode 100644
index 0000000..de5d2ac
--- /dev/null
+++ b/wiki/inc/lang/ia/backlinks.txt
@@ -0,0 +1,3 @@
+====== Retroligamines ======
+
+Isto es un lista de paginas que contine ligamines de retorno al pagina actual.
\ No newline at end of file
diff --git a/wiki/inc/lang/ia/conflict.txt b/wiki/inc/lang/ia/conflict.txt
new file mode 100644
index 0000000..576cb7e
--- /dev/null
+++ b/wiki/inc/lang/ia/conflict.txt
@@ -0,0 +1,5 @@
+====== Un version plus nove existe ======
+
+Existe un version plus nove del documento que tu ha modificate. Isto occurre si un altere usator cambia le documento durante que tu lo modifica.
+
+Examina minutiosemente le differentias monstrate hic infra, postea decide qual version debe esser conservate. Si tu selige ''salveguardar'', tu version essera salveguardate. Preme ''cancellar'' pro conservar le version actual.
diff --git a/wiki/inc/lang/ia/denied.txt b/wiki/inc/lang/ia/denied.txt
new file mode 100644
index 0000000..82f2fc6
--- /dev/null
+++ b/wiki/inc/lang/ia/denied.txt
@@ -0,0 +1,4 @@
+====== Permission refusate ======
+
+Pardono, tu non ha le derectos requisite pro continuar.
+
diff --git a/wiki/inc/lang/ia/diff.txt b/wiki/inc/lang/ia/diff.txt
new file mode 100644
index 0000000..dbfa70f
--- /dev/null
+++ b/wiki/inc/lang/ia/diff.txt
@@ -0,0 +1,3 @@
+====== Differentias ======
+
+Isto te monstra le differentias inter duo versiones del pagina.
\ No newline at end of file
diff --git a/wiki/inc/lang/ia/draft.txt b/wiki/inc/lang/ia/draft.txt
new file mode 100644
index 0000000..ae8de13
--- /dev/null
+++ b/wiki/inc/lang/ia/draft.txt
@@ -0,0 +1,5 @@
+====== Version provisori trovate ======
+
+Tu ultime session de modification in iste pagina non ha essite concludite correctemente. DokuWiki ha automaticamente salveguardate un version provisori durante tu labor. Ora tu pote usar iste version provisori pro continuar le modification. Hic infra tu vide le datos salveguardate de tu ultime session.
+
+Per favor decide si tu vole //recuperar// le session de modification perdite, //deler// le version provisori o //cancellar// le processo de modification.
\ No newline at end of file
diff --git a/wiki/inc/lang/ia/edit.txt b/wiki/inc/lang/ia/edit.txt
new file mode 100644
index 0000000..5bc5836
--- /dev/null
+++ b/wiki/inc/lang/ia/edit.txt
@@ -0,0 +1 @@
+Modifica le pagina e preme "Salveguardar". Vide [[wiki:syntax]] pro le syntaxe wiki. Per favor modifica le paginas solmente si tu pote **meliorar** lo. Si tu vole testar alcun cosas, apprende facer tu prime passos in le [[playground:playground|parco de jocos]].
\ No newline at end of file
diff --git a/wiki/inc/lang/ia/editrev.txt b/wiki/inc/lang/ia/editrev.txt
new file mode 100644
index 0000000..192381f
--- /dev/null
+++ b/wiki/inc/lang/ia/editrev.txt
@@ -0,0 +1,2 @@
+**Tu ha cargate un version ancian del documento!** Si tu lo salveguarda, tu crea un nove version con iste datos.
+----
\ No newline at end of file
diff --git a/wiki/inc/lang/ia/index.txt b/wiki/inc/lang/ia/index.txt
new file mode 100644
index 0000000..5957cc2
--- /dev/null
+++ b/wiki/inc/lang/ia/index.txt
@@ -0,0 +1,3 @@
+====== Indice ======
+
+Isto es un indice super tote le paginas disponibile, ordinate per [[doku>namespaces|spatio de nomines]].
diff --git a/wiki/inc/lang/ia/install.html b/wiki/inc/lang/ia/install.html
new file mode 100644
index 0000000..3b48bfd
--- /dev/null
+++ b/wiki/inc/lang/ia/install.html
@@ -0,0 +1,13 @@
+<p>Iste pagina te assiste in le prime installation e configuration de
+<a href="http://dokuwiki.org">Dokuwiki</a>. Ulterior informationes super iste installator es disponibile in le
+<a href="http://dokuwiki.org/installer">pagina de documentation</a> de illo.</p>
+
+<p>DokuWiki usa files ordinari pro le immagazinage de paginas wiki e altere informationes associate con iste paginas (p.ex. imagines, indices de recerca, versiones ancian, etc). Pro poter functionar, DokuWiki
+<strong>debe</strong> haber accesso de scriptura al directorios que contine iste files. Iste installator non es capabile de configurar le permissiones de directorios. Isto normalmente debe esser facite directemente con le linea de commandos, o si tu usa un albergo web, via FTP o via le pannello de controlo de tu albergo (p.ex. cPanel).</p>
+
+<p>Iste installator configurara tu installation de DokuWiki pro
+<abbr title="listas de controlo de accesso">ACL</abbr>, lo que permitte crear contos administrator, e forni accesso al menu administrative de DokuWiki pro installar plug-ins, gerer usatores, gerer accesso a paginas wiki e alterar configurationes. Isto non es necessari pro le functionamento de DokuWiki, nonobstante, illo rendera DokuWiki plus facile de administrar.</p>
+
+<p>Le usatores experte o con exigentias special pro le installation deberea usar iste ligamines pro detalios concernente le
+<a href="http://dokuwiki.org/install">instructiones de installation</a>
+e <a href="http://dokuwiki.org/config">configurationes</a>.</p>
diff --git a/wiki/inc/lang/ia/lang.php b/wiki/inc/lang/ia/lang.php
new file mode 100644
index 0000000..a00f8bf
--- /dev/null
+++ b/wiki/inc/lang/ia/lang.php
@@ -0,0 +1,261 @@
+<?php
+/**
+ * ia language file
+ *
+ * This file was initially built by fetching translations from other
+ * Wiki projects. See the @url lines below. Additional translations
+ * and fixes where done for DokuWiki by the people mentioned in the
+ * lines starting with @author
+ *
+ * @url http://svn.wikimedia.org/viewvc/mediawiki/trunk/phase3/languages/messages/MessagesIa.php?view=co
+ * @author robocap <robocap1@gmail.com>
+ * @author Martijn Dekker <martijn@inlv.org>
+ */
+$lang['encoding']              = 'utf-8';
+$lang['direction']             = 'ltr';
+$lang['doublequoteopening']    = '“';
+$lang['doublequoteclosing']    = '”';
+$lang['singlequoteopening']    = '‘';
+$lang['singlequoteclosing']    = '’';
+$lang['apostrophe']            = '’';
+$lang['btn_edit']              = 'Modificar iste pagina';
+$lang['btn_source']            = 'Monstrar codice-fonte';
+$lang['btn_show']              = 'Monstrar pagina';
+$lang['btn_create']            = 'Crear iste pagina';
+$lang['btn_search']            = 'Cercar';
+$lang['btn_save']              = 'Salveguardar';
+$lang['btn_preview']           = 'Previsualisar';
+$lang['btn_top']               = 'Retornar al initio';
+$lang['btn_newer']             = '<< plus recente';
+$lang['btn_older']             = 'minus recente >>';
+$lang['btn_revs']              = 'Versiones ancian';
+$lang['btn_recent']            = 'Modificationes recente';
+$lang['btn_upload']            = 'Incargar';
+$lang['btn_cancel']            = 'Cancellar';
+$lang['btn_index']             = 'Indice';
+$lang['btn_secedit']           = 'Modificar';
+$lang['btn_login']             = 'Aperir session';
+$lang['btn_logout']            = 'Clauder session';
+$lang['btn_admin']             = 'Admin';
+$lang['btn_update']            = 'Actualisar';
+$lang['btn_delete']            = 'Deler';
+$lang['btn_back']              = 'Retornar';
+$lang['btn_backlink']          = 'Retroligamines';
+$lang['btn_subscribe']         = 'Gerer subscriptiones';
+$lang['btn_profile']           = 'Actualisar profilo';
+$lang['btn_reset']             = 'Reinitialisar';
+$lang['btn_draft']             = 'Modificar version provisori';
+$lang['btn_recover']           = 'Recuperar version provisori';
+$lang['btn_draftdel']          = 'Deler version provisori';
+$lang['btn_revert']            = 'Restaurar';
+$lang['btn_register']          = 'Crear conto';
+$lang['loggedinas']            = 'Session aperite como:';
+$lang['user']                  = 'Nomine de usator';
+$lang['pass']                  = 'Contrasigno';
+$lang['newpass']               = 'Nove contrasigno';
+$lang['oldpass']               = 'Confirmar contrasigno actual';
+$lang['passchk']               = 'un altere vice';
+$lang['remember']              = 'Memorar me';
+$lang['fullname']              = 'Nomine real';
+$lang['email']                 = 'E-mail';
+$lang['profile']               = 'Profilo de usator';
+$lang['badlogin']              = 'Le nomine de usator o le contrasigno es incorrecte.';
+$lang['minoredit']             = 'Modificationes minor';
+$lang['draftdate']             = 'Version provisori automaticamente salveguardate le';
+$lang['nosecedit']             = 'Le pagina ha essite modificate intertanto. Le informationes del section es ora obsolete, dunque le pagina complete ha essite cargate in su loco.';
+$lang['regmissing']            = 'Es necessari completar tote le campos.';
+$lang['reguexists']            = 'Regrettabilemente, un usator con iste nomine ja existe.';
+$lang['regsuccess']            = 'Le conto ha essite create e le contrasigno ha essite inviate per e-mail.';
+$lang['regsuccess2']           = 'Le conto ha essite create.';
+$lang['regmailfail']           = 'Il pare que un error occurreva durante le invio del message con le contrasigno. Per favor contacta le administrator!';
+$lang['regbadmail']            = 'Le adresse de e-mail date pare esser invalide. Si tu pensa que isto es un error, contacta le administrator.';
+$lang['regbadpass']            = 'Le duo contrasignos date non es identic. Per favor reproba.';
+$lang['regpwmail']             = 'Tu contrasigno de DokuWiki';
+$lang['reghere']               = 'Tu non ha ancora un conto? Crea un, simplemente.';
+$lang['profna']                = 'Iste wiki non supporta le modification de profilos.';
+$lang['profnochange']          = 'Nulle modification, nihil a facer.';
+$lang['profnoempty']           = 'Un nomine o adresse de e-mail vacue non es permittite.';
+$lang['profchanged']           = 'Actualisation del profilo de usator succedite.';
+$lang['pwdforget']             = 'Contrasigno oblidate? Obtene un altere';
+$lang['resendna']              = 'Iste wiki non supporta le invio de un nove contrasigno.';
+$lang['resendpwdmissing']      = 'Es necessari completar tote le campos.';
+$lang['resendpwdnouser']       = 'Iste usator non ha essite trovate in le base de datos.';
+$lang['resendpwdbadauth']      = 'Iste codice de authentication non es valide. Assecura te que tu ha usate le ligamine de confirmation complete.';
+$lang['resendpwdconfirm']      = 'Un ligamine de confirmation ha essite inviate per e-mail.';
+$lang['resendpwdsuccess']      = 'Tu nove contrasigno ha essite inviate per e-mail.';
+$lang['license']               = 'Excepte ubi indicate alteremente, le contento in iste wiki es disponibile sub le licentia sequente:';
+$lang['licenseok']             = 'Nota ben! Per modificar iste pagina tu accepta que tu contento essera publicate sub le conditiones del licentia sequente:';
+$lang['searchmedia']           = 'Cercar file con nomine:';
+$lang['searchmedia_in']        = 'Cercar in %s';
+$lang['txt_upload']            = 'Selige le file a incargar:';
+$lang['txt_filename']          = 'Incargar como (optional):';
+$lang['txt_overwrt']           = 'Reimplaciar le file existente';
+$lang['lockedby']              = 'Actualmente serrate per:';
+$lang['lockexpire']            = 'Serratura expira le:';
+$lang['js']['willexpire']            = 'Tu serratura super le modification de iste pagina expirara post un minuta.\nPro evitar conflictos, usa le button Previsualisar pro reinitialisar le timer del serratura.';
+$lang['js']['notsavedyet']     = 'Le modificationes non salveguardate essera perdite.\nRealmente continuar?';
+$lang['rssfailed']             = 'Un error occurreva durante le obtention de iste syndication:';
+$lang['nothingfound']          = 'Nihil ha essite trovate.';
+$lang['mediaselect']           = 'Files multimedia';
+$lang['uploadsucc']            = 'Incargamento succedite';
+$lang['uploadfail']            = 'Incargamento fallite. Pote esser que le permissiones es incorrecte.';
+$lang['uploadwrong']           = 'Incargamento refusate. Iste typo de file es prohibite!';
+$lang['uploadexist']           = 'File ja existe. Nihil facite.';
+$lang['uploadbadcontent']      = 'Le typo del contento incargate non corresponde al extension del nomine de file "%s".';
+$lang['uploadspam']            = 'Le incargamento ha essite blocate per le lista nigre anti-spam.';
+$lang['uploadxss']             = 'Le incargamento ha essite blocate a causa de contento possibilemente malitiose.';
+$lang['uploadsize']            = 'Le file incargate es troppo grande. (Max. %s)';
+$lang['deletesucc']            = 'Le file "%s" ha essite delite.';
+$lang['deletefail']            = '"%s" non poteva esser delite. Verifica le permissiones.';
+$lang['mediainuse']            = 'Le file "%s" non ha essite delite proque illo es ancora in uso.';
+$lang['namespaces']            = 'Spatios de nomines';
+$lang['mediafiles']            = 'Files disponibile in';
+$lang['js']['searchmedia']     = 'Cercar files';
+$lang['js']['keepopen']        = 'Mantener fenestra aperte post selection';
+$lang['js']['hidedetails']     = 'Celar detalios';
+$lang['js']['mediatitle']      = 'Configuration del ligamine';
+$lang['js']['mediadisplay']    = 'Typo de ligamine';
+$lang['js']['mediaalign']      = 'Alineamento';
+$lang['js']['mediasize']       = 'Dimension del imagine';
+$lang['js']['mediatarget']     = 'Destination del ligamine';
+$lang['js']['mediaclose']      = 'Clauder';
+$lang['js']['mediainsert']     = 'Inserer';
+$lang['js']['mediadisplayimg'] = 'Monstrar le imagine.';
+$lang['js']['mediadisplaylnk'] = 'Monstrar solmente le imagine.';
+$lang['js']['mediasmall']      = 'Version parve';
+$lang['js']['mediamedium']     = 'Version medie';
+$lang['js']['medialarge']      = 'Version grande';
+$lang['js']['mediaoriginal']   = 'Version original';
+$lang['js']['medialnk']        = 'Ligamine al pagina de detalios';
+$lang['js']['mediadirect']     = 'Ligamine directe verso le original';
+$lang['js']['medianolnk']      = 'Nulle ligamine';
+$lang['js']['medianolink']     = 'Non ligar verso le imagine';
+$lang['js']['medialeft']       = 'Alinear le imagine verso le sinistra.';
+$lang['js']['mediaright']      = 'Alinear le imagine verso le dextra.';
+$lang['js']['mediacenter']     = 'Alinear le imagine in le medio.';
+$lang['js']['medianoalign']    = 'Non alinear.';
+$lang['js']['nosmblinks']      = 'Le ligamines a ressources de Windows functiona solmente in Microsoft Internet Explorer.
+Tu pote nonobstante copiar e collar le ligamine.';
+$lang['js']['linkwiz']         = 'Assistente pro ligamines';
+$lang['js']['linkto']          = 'Ligar verso:';
+$lang['js']['del_confirm']     = 'Realmente deler le entrata(s) seligite?';
+$lang['mediausage']            = 'Usa le syntaxe sequente pro referer a iste file:';
+$lang['mediaview']             = 'Vider file original';
+$lang['mediaroot']             = 'radice';
+$lang['mediaupload']           = 'Incarga hic un file in le spatio de nomines actual. Pro crear subspatios de nomines, antepone los al nomine de file "Incargar como", separate per signos de duo punctos (":").';
+$lang['mediaextchange']        = 'Extension del file cambiate de .%s a .%s!';
+$lang['reference']             = 'Referentias pro';
+$lang['ref_inuse']             = 'Le file non pote esser delite proque illo es ancora in uso per le sequente paginas:';
+$lang['ref_hidden']            = 'Alcun referentias es in paginas pro le quales tu non ha le permission de lectura';
+$lang['hits']                  = 'Resultatos';
+$lang['quickhits']             = 'Nomines de pagina correspondente';
+$lang['toc']                   = 'Tabula de contento';
+$lang['current']               = 'actual';
+$lang['yours']                 = 'Tu version';
+$lang['diff']                  = 'Monstrar differentias con versiones actual';
+$lang['diff2']                 = 'Monstrar differentias inter le versiones seligite';
+$lang['line']                  = 'Linea';
+$lang['breadcrumb']            = 'Tracia:';
+$lang['youarehere']            = 'Tu es hic:';
+$lang['lastmod']               = 'Ultime modification:';
+$lang['by']                    = 'per';
+$lang['deleted']               = 'removite';
+$lang['created']               = 'create';
+$lang['restored']              = 'ancian version restaurate (%s)';
+$lang['external_edit']         = 'modification externe';
+$lang['summary']               = 'Modificar summario';
+$lang['noflash']               = 'Le <a href="http://www.adobe.com/products/flashplayer/">plug-in Flash de Adobe</a> es necessari pro monstrar iste contento.';
+$lang['download']              = 'Discargar fragmento';
+$lang['mail_newpage']          = 'pagina addite:';
+$lang['mail_changed']          = 'pagina modificate:';
+$lang['mail_subscribe_list']   = 'paginas modificate in spatio de nomines:';
+$lang['mail_new_user']         = 'nove usator:';
+$lang['mail_upload']           = 'file incargate:';
+$lang['qb_bold']               = 'Texto grasse';
+$lang['qb_italic']             = 'Texto italic';
+$lang['qb_underl']             = 'Texto sublineate';
+$lang['qb_code']               = 'Texto de codice';
+$lang['qb_strike']             = 'Texto cancellate';
+$lang['qb_h1']                 = 'Titulo a nivello 1';
+$lang['qb_h2']                 = 'Titulo a nivello 2';
+$lang['qb_h3']                 = 'Titulo a nivello 3';
+$lang['qb_h4']                 = 'Titulo a nivello 4';
+$lang['qb_h5']                 = 'Titulo a nivello 5';
+$lang['qb_h']                  = 'Titulo';
+$lang['qb_hs']                 = 'Seliger titulo';
+$lang['qb_hplus']              = 'Titulo superior';
+$lang['qb_hminus']             = 'Titulo inferior';
+$lang['qb_hequal']             = 'Titulo al mesme nivello';
+$lang['qb_link']               = 'Ligamine interne';
+$lang['qb_extlink']            = 'Ligamine externe';
+$lang['qb_hr']                 = 'Linea horizontal';
+$lang['qb_ol']                 = 'Elemento de lista ordinate';
+$lang['qb_ul']                 = 'Elemento de lista non ordinate';
+$lang['qb_media']              = 'Adder imagines e altere files';
+$lang['qb_sig']                = 'Inserer signatura';
+$lang['qb_smileys']            = 'Emoticones     ';
+$lang['qb_chars']              = 'Characteres special';
+$lang['upperns']               = 'Saltar al spatio de nomines superior';
+$lang['metaedit']              = 'Modificar metadatos';
+$lang['metasaveerr']           = 'Scriptura de metadatos fallite';
+$lang['metasaveok']            = 'Metadatos salveguardate';
+$lang['btn_img_backto']            = 'Retornar a %s';
+$lang['img_title']             = 'Titulo:';
+$lang['img_caption']           = 'Legenda:';
+$lang['img_date']              = 'Data:';
+$lang['img_fname']             = 'Nomine de file:';
+$lang['img_fsize']             = 'Dimension:';
+$lang['img_artist']            = 'Photographo:';
+$lang['img_copyr']             = 'Copyright:';
+$lang['img_format']            = 'Formato:';
+$lang['img_camera']            = 'Camera:';
+$lang['img_keywords']          = 'Parolas-clave:';
+$lang['subscr_subscribe_success'] = '%s addite al lista de subscription de %s';
+$lang['subscr_subscribe_error'] = 'Error durante le addition de %s al lista de subscription de %s';
+$lang['subscr_subscribe_noaddress'] = 'Il non ha un adresse associate con tu conto. Tu non pote esser addite al lista de subscription.';
+$lang['subscr_unsubscribe_success'] = '%s removite del lista de subscription de %s';
+$lang['subscr_unsubscribe_error'] = 'Error durante le remotion de %s del lista de subscription de %s';
+$lang['subscr_already_subscribed'] = '%s es ja subscribite a %s';
+$lang['subscr_not_subscribed'] = '%s non es subscribite a %s';
+$lang['subscr_m_not_subscribed'] = 'Tu non es actualmente subscribite al pagina o spatio de nomines actual.';
+$lang['subscr_m_new_header']   = 'Adder subscription';
+$lang['subscr_m_current_header'] = 'Subscriptiones actual';
+$lang['subscr_m_unsubscribe']  = 'Cancellar subscription';
+$lang['subscr_m_subscribe']    = 'Subscriber';
+$lang['subscr_m_receive']      = 'Reciper';
+$lang['subscr_style_every']    = 'un message pro cata modification';
+$lang['authtempfail']          = 'Le authentication de usator temporarimente non es disponibile. Si iste situation persiste, per favor informa le administrator de tu wiki.';
+$lang['i_chooselang']          = 'Selige tu lingua';
+$lang['i_installer']           = 'Installator de DokuWiki';
+$lang['i_wikiname']            = 'Nomine del wiki';
+$lang['i_enableacl']           = 'Activar ACL (recommendate)';
+$lang['i_superuser']           = 'Superusator';
+$lang['i_problems']            = 'Le installator ha trovate alcun problemas, indicate hic infra. Tu debe resolver iste problemas pro poter continuar.';
+$lang['i_modified']            = 'Pro motivos de securitate, iste script functiona solmente con un installation de DokuWiki nove e non modificate.
+Tu debe re-extraher le files del pacchetto discargate, o consultar le <a href="http://dokuwiki.org/install">instructiones de installation</a> complete pro altere optiones.';
+$lang['i_funcna']              = 'Le function PHP <code>%s</code> non es disponibile. Pote esser que tu albergo web lo ha disactivate pro un ration o altere.';
+$lang['i_phpver']              = 'Le version de PHP <code>%s</code> es plus ancian que le version requisite <code>%s</code>. Es necessari actualisar le installation de PHP.';
+$lang['i_permfail']            = '<code>%s</code> non permitte le accesso de scriptura a DokuWiki. Tu debe reparar le permissiones de iste directorio!';
+$lang['i_confexists']          = '<code>%s</code> ja existe';
+$lang['i_writeerr']            = 'Impossibile crear <code>%s</code>. Tu debe verificar le permissiones de directorios/files e crear iste file manualmente.';
+$lang['i_badhash']             = 'dokuwiki.php non recognoscite o modificate (hash=<code>%s</code>)';
+$lang['i_badval']              = '<code>%s</code> - valor vacue o invalide';
+$lang['i_success']             = 'Le configuration ha succedite. Tu pote ora deler le file install.php. Continua a
+<a href="doku.php?id=wiki:welcome">tu nove DokuWiki</a>.';
+$lang['i_failure']             = 'Alcun errores occurreva durante le scriptura del files de configuration. Es possibile que tu debe remediar iste errores manualmente ante que
+tu pote usar <a href="doku.php?id=wiki:welcome">tu nove DokuWiki</a>.';
+$lang['i_policy']              = 'Politica de ACL interne';
+$lang['i_pol0']                = 'Wiki aperte (lectura, scriptura, incargamento pro omnes)';
+$lang['i_pol1']                = 'Wiki public (lectura pro omnes, scriptura e incargamento pro usatores registrate)';
+$lang['i_pol2']                = 'Wiki claudite (lectura, scriptura e incargamento solmente pro usatores registrate)';
+$lang['i_retry']               = 'Reprobar';
+$lang['recent_global']         = 'Tu observa actualmente le modificationes intra le spatio de nomines <b>%s</b>. Tu pote etiam <a href="%s">vider le modificationes recente de tote le wiki</a>.';
+$lang['years']                 = '%d annos retro';
+$lang['months']                = '%d menses retro';
+$lang['weeks']                 = '%d septimanas retro';
+$lang['days']                  = '%d dies retro';
+$lang['hours']                 = '%d horas retro';
+$lang['minutes']               = '%d minutas retro';
+$lang['seconds']               = '%d secundas retro';
+$lang['email_signature_text'] = 'Iste message ha essite generate per DokuWiki a
+@DOKUWIKIURL@';
diff --git a/wiki/inc/lang/ia/locked.txt b/wiki/inc/lang/ia/locked.txt
new file mode 100644
index 0000000..726aabb
--- /dev/null
+++ b/wiki/inc/lang/ia/locked.txt
@@ -0,0 +1,3 @@
+====== Pagina serrate ======
+
+Iste pagina es actualmente serrate proque un altere usator lo modifica in iste momento. Tu debe attender usque iste usator fini le modification o usque al expiration del serratura.
\ No newline at end of file
diff --git a/wiki/inc/lang/ia/login.txt b/wiki/inc/lang/ia/login.txt
new file mode 100644
index 0000000..4c428f3
--- /dev/null
+++ b/wiki/inc/lang/ia/login.txt
@@ -0,0 +1,3 @@
+====== Aperir session ======
+
+Tu non es identificate! Entra tu credentiales de authentication pro aperir un session. Tu debe haber activate le cookies pro aperir un session.
\ No newline at end of file
diff --git a/wiki/inc/lang/ia/mailtext.txt b/wiki/inc/lang/ia/mailtext.txt
new file mode 100644
index 0000000..ed3eb25
--- /dev/null
+++ b/wiki/inc/lang/ia/mailtext.txt
@@ -0,0 +1,12 @@
+Un pagina in tu DokuWiki ha essite addite o modificate. Ecce le detalios:
+
+Data : @DATE@
+Navigator : @BROWSER@
+Adresse IP : @IPADDRESS@
+Nomine host : @HOSTNAME@
+Version ancian: @OLDPAGE@
+Version nove: @NEWPAGE@
+Summario: @SUMMARY@
+Usator : @USER@
+
+@DIFF@
diff --git a/wiki/inc/lang/ia/newpage.txt b/wiki/inc/lang/ia/newpage.txt
new file mode 100644
index 0000000..8db7aa7
--- /dev/null
+++ b/wiki/inc/lang/ia/newpage.txt
@@ -0,0 +1,3 @@
+====== Iste topico non existe ancora ======
+
+Tu ha sequite un ligamine verso un topico que non existe ancora. Si tu ha le permission requisite, tu pote crear lo con le button "Crear iste pagina".
\ No newline at end of file
diff --git a/wiki/inc/lang/ia/norev.txt b/wiki/inc/lang/ia/norev.txt
new file mode 100644
index 0000000..75e44b9
--- /dev/null
+++ b/wiki/inc/lang/ia/norev.txt
@@ -0,0 +1,3 @@
+====== Version non existe ======
+
+Le version specificate non existe. Usa le button "Versiones ancian" pro un lista de versiones ancian de iste documento.
\ No newline at end of file
diff --git a/wiki/inc/lang/ia/password.txt b/wiki/inc/lang/ia/password.txt
new file mode 100644
index 0000000..bf0e400
--- /dev/null
+++ b/wiki/inc/lang/ia/password.txt
@@ -0,0 +1,6 @@
+Salute @FULLNAME@!
+
+Ecce tu datos de usator pro @TITLE@ a @DOKUWIKIURL@
+
+Nomine de usator : @LOGIN@
+Contrasigno : @PASSWORD@
diff --git a/wiki/inc/lang/ia/preview.txt b/wiki/inc/lang/ia/preview.txt
new file mode 100644
index 0000000..22b958b
--- /dev/null
+++ b/wiki/inc/lang/ia/preview.txt
@@ -0,0 +1,3 @@
+====== Previsualisation ======
+
+Isto es un previsualisation de tu texto. Memora: le pagina **non** ha ancora essite salveguardate!
\ No newline at end of file
diff --git a/wiki/inc/lang/ia/pwconfirm.txt b/wiki/inc/lang/ia/pwconfirm.txt
new file mode 100644
index 0000000..c8e3d00
--- /dev/null
+++ b/wiki/inc/lang/ia/pwconfirm.txt
@@ -0,0 +1,10 @@
+Salute @FULLNAME@!
+
+Alcuno ha requestate un nove contrasigno pro tu conto de @TITLE@
+a @DOKUWIKIURL@
+
+Si tu non ha requestate un nove contrasigno, alora simplemente ignora iste message.
+
+Pro confirmar que le requesta realmente ha essite inviate per te, per favor usa le ligamine sequente.
+
+@CONFIRM@
diff --git a/wiki/inc/lang/ia/read.txt b/wiki/inc/lang/ia/read.txt
new file mode 100644
index 0000000..e7e80db
--- /dev/null
+++ b/wiki/inc/lang/ia/read.txt
@@ -0,0 +1 @@
+Iste pagina es pro lectura solmente. Tu pote vider le codice-fonte, ma non modificar lo. Contacta tu administrator si tu pensa que isto es errate.
\ No newline at end of file
diff --git a/wiki/inc/lang/ia/recent.txt b/wiki/inc/lang/ia/recent.txt
new file mode 100644
index 0000000..ba39c3f
--- /dev/null
+++ b/wiki/inc/lang/ia/recent.txt
@@ -0,0 +1,3 @@
+====== Modificationes recente ======
+
+Le sequente paginas ha essite modificate recentemente.
\ No newline at end of file
diff --git a/wiki/inc/lang/ia/register.txt b/wiki/inc/lang/ia/register.txt
new file mode 100644
index 0000000..22c4e4a
--- /dev/null
+++ b/wiki/inc/lang/ia/register.txt
@@ -0,0 +1,3 @@
+====== Crear un nove conto de usator ======
+
+Completa tote le informationes hic infra pro crear un nove conto in iste wiki. Assecura te de fornir un **adresse de e-mail valide!** Si le systema non te demanda de entrar un contrasigno hic, un nove contrasigno essera inviate a iste adresse. Le nomine de usator debe esser un [[doku>pagename|nomine de pagina]] valide.
diff --git a/wiki/inc/lang/ia/registermail.txt b/wiki/inc/lang/ia/registermail.txt
new file mode 100644
index 0000000..b6fa332
--- /dev/null
+++ b/wiki/inc/lang/ia/registermail.txt
@@ -0,0 +1,10 @@
+Un nove conto de usator ha essite create. Ecce le detalios:
+
+Nomine de usator : @NEWUSER@
+Nomine complete : @NEWNAME@
+E-mail : @NEWEMAIL@
+
+Data : @DATE@
+Navigator : @BROWSER@
+Adresse IP : @IPADDRESS@
+Nomine host : @HOSTNAME@
diff --git a/wiki/inc/lang/ia/resendpwd.txt b/wiki/inc/lang/ia/resendpwd.txt
new file mode 100644
index 0000000..97bcac0
--- /dev/null
+++ b/wiki/inc/lang/ia/resendpwd.txt
@@ -0,0 +1,3 @@
+====== Inviar nove contrasigno ======
+
+Per favor entra tu nomine de usator in le formulario hic infra pro requestar un nove contrasigno pro tu conto in iste wiki. Un ligamine de confirmation essera inviate a tu adresse de e-mail registrate.
\ No newline at end of file
diff --git a/wiki/inc/lang/ia/revisions.txt b/wiki/inc/lang/ia/revisions.txt
new file mode 100644
index 0000000..e914edb
--- /dev/null
+++ b/wiki/inc/lang/ia/revisions.txt
@@ -0,0 +1,3 @@
+====== Versiones ancian ======
+
+Ecce le versiones ancian del documento presente. Pro reverter lo a un version ancian, selige un version del lista in basso, clicca "Modificar iste pagina" e salveguarda lo.
\ No newline at end of file
diff --git a/wiki/inc/lang/ia/searchpage.txt b/wiki/inc/lang/ia/searchpage.txt
new file mode 100644
index 0000000..7e093d2
--- /dev/null
+++ b/wiki/inc/lang/ia/searchpage.txt
@@ -0,0 +1,4 @@
+====== Recerca ======
+
+Le resultatos de tu recerca se trova hic infra. @CREATEPAGEINFO@
+
diff --git a/wiki/inc/lang/ia/showrev.txt b/wiki/inc/lang/ia/showrev.txt
new file mode 100644
index 0000000..60ee2a7
--- /dev/null
+++ b/wiki/inc/lang/ia/showrev.txt
@@ -0,0 +1,2 @@
+**Isto es un version ancian del documento!**
+----
\ No newline at end of file
diff --git a/wiki/inc/lang/ia/stopwords.txt b/wiki/inc/lang/ia/stopwords.txt
new file mode 100644
index 0000000..e3e5135
--- /dev/null
+++ b/wiki/inc/lang/ia/stopwords.txt
@@ -0,0 +1,38 @@
+# Isto es un lista de parolas que le generator de indices ignora, un parola per linea.
+# Si tu modifica iste file, assecura te de usar le fines de linea UNIX (newline singule).
+# Non es necessari includer parolas plus curte que 3 characteres - istes es ignorate in omne caso.
+a
+ab
+circa
+com
+como
+como
+con
+de
+e
+es
+essera
+esserea
+esseva
+essite
+ex
+illo
+in
+iste
+istes
+le
+le
+les
+lo
+lor
+o
+pro
+quando
+que
+qui
+super
+sur
+tu
+ubi
+un
+www
diff --git a/wiki/inc/lang/ia/subscr_digest.txt b/wiki/inc/lang/ia/subscr_digest.txt
new file mode 100644
index 0000000..b2cac2c
--- /dev/null
+++ b/wiki/inc/lang/ia/subscr_digest.txt
@@ -0,0 +1,16 @@
+Salute!
+
+Le pagina @PAGE@ in le wiki @TITLE@ ha cambiate.
+Ecce le modificationes:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Version ancian: @OLDPAGE@
+Version nove: @NEWPAGE@
+
+Pro cancellar le notificationes de paginas, aperi un session al wiki a
+@DOKUWIKIURL@ postea visita
+@SUBSCRIBE@
+e cancella tu subscription al modificationes in paginas e/o spatios de nomines.
diff --git a/wiki/inc/lang/ia/subscr_form.txt b/wiki/inc/lang/ia/subscr_form.txt
new file mode 100644
index 0000000..f63a30d
--- /dev/null
+++ b/wiki/inc/lang/ia/subscr_form.txt
@@ -0,0 +1,4 @@
+====== Gestion de subscriptiones ======
+
+Iste pagina permitte gerer tu subscriptiones pro le pagina e spatio de nomines actual.
+	
\ No newline at end of file
diff --git a/wiki/inc/lang/ia/subscr_list.txt b/wiki/inc/lang/ia/subscr_list.txt
new file mode 100644
index 0000000..01ff350
--- /dev/null
+++ b/wiki/inc/lang/ia/subscr_list.txt
@@ -0,0 +1,13 @@
+Salute!
+
+Alcun paginas in le spatio de nomines @PAGE@ del wiki @TITLE@ ha cambiate.
+Ecce le paginas con modiicationes:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Pro cancellar le notificationes de paginas, aperi un session al wiki a
+@DOKUWIKIURL@ postea visita
+@SUBSCRIBE@
+e cancella tu subscription al modificationes in paginas e/o spatios de nomines.
diff --git a/wiki/inc/lang/ia/subscr_single.txt b/wiki/inc/lang/ia/subscr_single.txt
new file mode 100644
index 0000000..da670ca
--- /dev/null
+++ b/wiki/inc/lang/ia/subscr_single.txt
@@ -0,0 +1,19 @@
+Salute!
+
+Le pagina @PAGE@ in le wiki @TITLE@ ha cambiate.
+Ecce le modificationes:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Data : @DATE@
+Usator : @USER@
+Summario: @SUMMARY@
+Version ancian: @OLDPAGE@
+Version nove: @NEWPAGE@
+
+Pro cancellar le notificationes de paginas, aperi un session al wiki a
+@DOKUWIKIURL@ postea visita
+@SUBSCRIBE@
+e cancella tu subscription al modificationes in paginas e/o spatios de nomines.
diff --git a/wiki/inc/lang/ia/updateprofile.txt b/wiki/inc/lang/ia/updateprofile.txt
new file mode 100644
index 0000000..3968d3c
--- /dev/null
+++ b/wiki/inc/lang/ia/updateprofile.txt
@@ -0,0 +1,3 @@
+====== Actualisa le profilo de tu conto ======
+
+Solmente es necessari completar le campos que tu vole cambiar. Non es possibile cambiar tu nomine de usator.
\ No newline at end of file
diff --git a/wiki/inc/lang/ia/uploadmail.txt b/wiki/inc/lang/ia/uploadmail.txt
new file mode 100644
index 0000000..c406d4b
--- /dev/null
+++ b/wiki/inc/lang/ia/uploadmail.txt
@@ -0,0 +1,10 @@
+Un file ha essite incargate in tu DokuWiki. Ecce le detalios:
+
+File : @MEDIA@
+Data : @DATE@
+Navigator : @BROWSER@
+Adresse IP : @IPADDRESS@
+Nomine host: @HOSTNAME@
+Dimension : @SIZE@
+Typo MIME : @MIME@
+Usator : @USER@
diff --git a/wiki/inc/lang/id-ni/lang.php b/wiki/inc/lang/id-ni/lang.php
new file mode 100644
index 0000000..9bd495c
--- /dev/null
+++ b/wiki/inc/lang/id-ni/lang.php
@@ -0,0 +1,76 @@
+<?php
+/**
+ * idni language file
+ *
+ * @author Harefa <fidelis@harefa.com>
+ * @author Yustinus Waruwu <juswaruwu@gmail.com>
+ */
+$lang['encoding']              = 'utf-8';
+$lang['direction']             = 'ltr';
+$lang['doublequoteopening']    = '“';
+$lang['doublequoteclosing']    = '”';
+$lang['singlequoteopening']    = '‘';
+$lang['singlequoteclosing']    = '’';
+$lang['apostrophe']            = '’';
+$lang['btn_edit']              = 'Haogö nga\'örö da\'a';
+$lang['btn_source']            = 'Oroma\'ö nga\'örö sindruhu';
+$lang['btn_show']              = 'Foroma\'ö nga\'örö';
+$lang['btn_create']            = 'Fazökhi nga\'öro';
+$lang['btn_search']            = 'Alui';
+$lang['btn_save']              = 'Irö\'ö';
+$lang['btn_preview']           = 'Foroma\'ö zikhala';
+$lang['btn_top']               = 'Angawuli ba mböröta';
+$lang['btn_newer']             = '<< sibohou';
+$lang['btn_older']             = 'si no ara >>';
+$lang['btn_revs']              = 'nifawu\'a si\'oföna';
+$lang['btn_recent']            = 'Lahe nibohouni';
+$lang['btn_upload']            = 'Fa\'oeh\'ö';
+$lang['btn_cancel']            = 'Lö alua';
+$lang['btn_index']             = 'Index';
+$lang['btn_secedit']           = 'Ehaogö';
+$lang['btn_login']             = 'Felalö bakha';
+$lang['btn_logout']            = 'Möi baero';
+$lang['btn_admin']             = 'Admin';
+$lang['btn_update']            = 'Bohouni';
+$lang['btn_delete']            = 'Heta';
+$lang['btn_back']              = 'Fulifuri';
+$lang['btn_backlink']          = 'Link fangawuli';
+$lang['btn_profile']           = 'Famohouni pörofile';
+$lang['btn_reset']             = 'Fawu\'a';
+$lang['btn_draft']             = 'Fawu\'a wanura';
+$lang['btn_draftdel']          = 'Heta zura';
+$lang['btn_register']          = 'Fasura\'ö';
+$lang['loggedinas']            = 'Möi bakha zotöi:';
+$lang['user']                  = 'Töi';
+$lang['pass']                  = 'Kode';
+$lang['newpass']               = 'Kode sibohou';
+$lang['oldpass']               = 'Faduhu\'ö kode';
+$lang['passchk']               = 'Sura sakalitö';
+$lang['remember']              = 'Töngöni ndra\'o';
+$lang['fullname']              = 'Töi safönu';
+$lang['email']                 = 'Imele';
+$lang['profile']               = 'Töi pörofile';
+$lang['badlogin']              = 'Bologö dödöu, fasala döi faoma kode.';
+$lang['minoredit']             = 'Famawu\'a ma\'ifu';
+$lang['regmissing']            = 'Bologö dödöu, si lö tola lö\'ö öfo\'ösi fefu nahia si tohöna.';
+$lang['reguexists']            = 'Bologö dödöu, no so zangoguna\'ö töi da\'a.';
+$lang['regsuccess']            = 'No tefazökhi akunö ba tefa\'ohe\'ö kode ba imele.';
+$lang['regsuccess2']           = 'No tefazökhi akunö';
+$lang['regmailfail']           = 'Oroma wa so ma\'ifu zifawuka ba wama\'ohe\'ö imele kode. Fuli sofu khö admin!';
+$lang['regbadmail']            = 'Imele nibe\'emö lö atulö - na ö\'ila wa fasala da\'a, sofu khö admin';
+$lang['regbadpass']            = 'Dombuadombua kode nibe\'emö lö fagölö, fuli sura.';
+$lang['regpwmail']             = 'Kode DokuWiki';
+$lang['reghere']               = 'Hadia no so akunömö? Na lö\'ö, fazökhi sambua.';
+$lang['profna']                = 'Lö tetehegö ba wiki da\'a ba wamawu\'a pörofile';
+$lang['profnochange']          = 'Lö hadöi nifawu\'ö, lö hadöi ni\'ohalöwögöi';
+$lang['profnoempty']           = 'Lö tetehegö na lö hadöi töi ma imele.';
+$lang['profchanged']           = 'Pörofile zangoguna\'ö no tebohouni.';
+$lang['pwdforget']             = 'Hadia olifu\'ö kode? Fuli halö kode';
+$lang['resendna']              = 'Lö tetehegi ba wiki da\'a wama\'ohe\'ö kode dua kali.';
+$lang['resendpwdmissing']      = 'Bologö dödöu, si lö tola lö\'ö öfo\'ösi fefu nahia si tohöna.';
+$lang['resendpwdnouser']       = 'Bologö dödöu, lö masöndra zangoguna da\'a ba database.';
+$lang['resendpwdconfirm']      = 'No tefaohe\'ö link famaduhu\'ö ba imele.';
+$lang['resendpwdsuccess']      = 'No tefa\'ohe\'ö kode sibohou ba imele.';
+$lang['txt_upload']            = 'Fili file ni fa\'ohe\'ö:';
+$lang['js']['notsavedyet']     = 'Famawu\'a si lö mu\'irö\'ö taya. \nSinduhu ötohugö?';
+$lang['mediaselect']           = 'Media file';
diff --git a/wiki/inc/lang/id/admin.txt b/wiki/inc/lang/id/admin.txt
new file mode 100644
index 0000000..8cb25ed
--- /dev/null
+++ b/wiki/inc/lang/id/admin.txt
@@ -0,0 +1,4 @@
+====== Administrasi ======
+
+Berikut ini adalah daftar pekerjaan administratif yang dapat Anda temukan di DokuWiki.
+
diff --git a/wiki/inc/lang/id/adminplugins.txt b/wiki/inc/lang/id/adminplugins.txt
new file mode 100644
index 0000000..2a91b3d
--- /dev/null
+++ b/wiki/inc/lang/id/adminplugins.txt
@@ -0,0 +1 @@
+=====Plugin Tambahan=====
\ No newline at end of file
diff --git a/wiki/inc/lang/id/backlinks.txt b/wiki/inc/lang/id/backlinks.txt
new file mode 100644
index 0000000..79c70f3
--- /dev/null
+++ b/wiki/inc/lang/id/backlinks.txt
@@ -0,0 +1,3 @@
+====== Backlinks ======
+
+Daftar dibawah ini adalah halaman-halaman (lain) yang terhubung ke halaman ini.
diff --git a/wiki/inc/lang/id/conflict.txt b/wiki/inc/lang/id/conflict.txt
new file mode 100644
index 0000000..236e8b6
--- /dev/null
+++ b/wiki/inc/lang/id/conflict.txt
@@ -0,0 +1,6 @@
+====== Versi terbaru telah Ada ======
+
+Versi terbaru dari dokumen yang baru saja Anda Edit telah ada. Ini terjadi ketika user lain telah selesai mengubah halaman, saat Anda sedang meng-edit.
+
+Pertimbangkan perbedaan yang ditampilkan dibawah ini, kemudian putuskan versi mana yang harus disimpan. Jika Anda memilih "Simpan", versi (tulisan terbaru) Andalah yang akan disimpan. Tekan "Batal" to menggunakan versi tulisan yang telah ada.
+
diff --git a/wiki/inc/lang/id/denied.txt b/wiki/inc/lang/id/denied.txt
new file mode 100644
index 0000000..ff09c13
--- /dev/null
+++ b/wiki/inc/lang/id/denied.txt
@@ -0,0 +1,4 @@
+====== Akses Ditolak ======
+
+Maaf, Anda tidak mempunyai hak akses untuk melanjutkan.
+
diff --git a/wiki/inc/lang/id/diff.txt b/wiki/inc/lang/id/diff.txt
new file mode 100644
index 0000000..eee1e5a
--- /dev/null
+++ b/wiki/inc/lang/id/diff.txt
@@ -0,0 +1,4 @@
+====== Perbedaan ======
+
+Ini menunjukkan perbedaan antara versi yang terpilih dengan versi yang sedang aktif.
+
diff --git a/wiki/inc/lang/id/draft.txt b/wiki/inc/lang/id/draft.txt
new file mode 100644
index 0000000..d7de145
--- /dev/null
+++ b/wiki/inc/lang/id/draft.txt
@@ -0,0 +1,5 @@
+====== File Draft ditemukan ======
+
+Proses pengeditan Anda sebelumnya tidak selesai dengan sempurna. DokuWiki secara otomatis meyimpan draft yang dapat Anda pakai untuk melanjutkan pengeditan. Dibawah ini Anda dapat melihat data yang disimpan pada sesi sebelumnya.
+
+Silahkan pilih jika Anda ingin //recover// sesi pengeditan terakhir atau //hapus// draft, atau //batalkan// proses pengeditan.
diff --git a/wiki/inc/lang/id/edit.txt b/wiki/inc/lang/id/edit.txt
new file mode 100644
index 0000000..a32803c
--- /dev/null
+++ b/wiki/inc/lang/id/edit.txt
@@ -0,0 +1,2 @@
+Ubah isi halaman kemudian tekan "Simpan". Lihat [[wiki:syntax]] untuk sintaks-sintaks Wiki. Mohon edit/ubah halaman sesuai dengan judul halamannya. Bila Anda masih ragu untuk menulis di halaman ini, silahkan bermain-main di [[playground:playground|tamanbermain]].
+
diff --git a/wiki/inc/lang/id/editrev.txt b/wiki/inc/lang/id/editrev.txt
new file mode 100644
index 0000000..e6d247c
--- /dev/null
+++ b/wiki/inc/lang/id/editrev.txt
@@ -0,0 +1,2 @@
+**Anda telah membuka dokumen versi lama!** Jika menyimpannya, berarti Anda akan membuat versi baru dari data ini.
+----
\ No newline at end of file
diff --git a/wiki/inc/lang/id/index.txt b/wiki/inc/lang/id/index.txt
new file mode 100644
index 0000000..88bbb12
--- /dev/null
+++ b/wiki/inc/lang/id/index.txt
@@ -0,0 +1,4 @@
+====== Index ======
+
+Berikut ini adalah index dari keseluruhan halaman yang ada, diurutkan berdasar [[doku>namespaces|namespaces]].
+
diff --git a/wiki/inc/lang/id/install.html b/wiki/inc/lang/id/install.html
new file mode 100644
index 0000000..4e288b3
--- /dev/null
+++ b/wiki/inc/lang/id/install.html
@@ -0,0 +1,25 @@
+<p>Halaman ini membatu Anda dalam proses instalasi dan konfigurasi pertama kali
+untuk <a href="http://dokuwiki.org">Dokuwiki</a>. Informasi lebih lanjut
+tentang alat instalasi ini tersedia dalam
+<a href="http://dokuwiki.org/installer">halaman dokumentasi</a> sendiri.</p>
+
+<p>DokuWIki menggunakan berkas biasa sebagai media penyimpanan halaman wiki
+dan informasi lainnya yang berhubungan dengan halaman tersebut (contoh: gambar,
+indeks pencarian, revisi lama, dll). Agar bisa menggunakannya DokuWiki
+<strong>harus</strong> memiliki hak akses tulis pada direktori yang menyimpan
+berkas-berkas tersebut. Alat instalasi ini tidak dapat melakukan perubahan
+konfigurasi hak akses pada direktori. Biasanya harus menggunakan command shell
+atau jika Anda pengguna layanan hosting, melalui FTP atau control panel layanan
+hosting Anda (misalnya: cPanel). </p>
+
+<p>Alat instalasi ini akan mengatur konfigurasi DokuWiki Anda untuk
+<abbr title="access control list">ACL</abbr>, yang selanjutnya akan
+memperbolehkan administrator untuk login dan mengakses menu Admin DokuWiki
+untuk menginstal plugin, mengatur pengguna (user), mengatur hak akses ke
+halaman wiki dan perubahan konfigurasi. Ini tidak diawajibkan dalam pengoperasian
+DokuWiki, tetapi dapat membuat DokuWiki lebih mudah untuk dipelihara.</p>
+
+<p>Pengguna berpengalaman atau pengguna dengan kebutuhan instalasi khusus silahkan
+melihat link <a href="http://dokuwiki.org/install">Panduan Instalasi</a>
+and <a href="http://dokuwiki.org/config">Konfigurasi WIki</a>.
+untuk hal-hal yang berhubungan dengan instalasi dan konfigurasi.</p>
diff --git a/wiki/inc/lang/id/jquery.ui.datepicker.js b/wiki/inc/lang/id/jquery.ui.datepicker.js
new file mode 100644
index 0000000..5aef348
--- /dev/null
+++ b/wiki/inc/lang/id/jquery.ui.datepicker.js
@@ -0,0 +1,37 @@
+/* Indonesian initialisation for the jQuery UI date picker plugin. */
+/* Written by Deden Fathurahman (dedenf@gmail.com). */
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "../widgets/datepicker" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery.datepicker );
+	}
+}( function( datepicker ) {
+
+datepicker.regional.id = {
+	closeText: "Tutup",
+	prevText: "&#x3C;mundur",
+	nextText: "maju&#x3E;",
+	currentText: "hari ini",
+	monthNames: [ "Januari","Februari","Maret","April","Mei","Juni",
+	"Juli","Agustus","September","Oktober","Nopember","Desember" ],
+	monthNamesShort: [ "Jan","Feb","Mar","Apr","Mei","Jun",
+	"Jul","Agus","Sep","Okt","Nop","Des" ],
+	dayNames: [ "Minggu","Senin","Selasa","Rabu","Kamis","Jumat","Sabtu" ],
+	dayNamesShort: [ "Min","Sen","Sel","Rab","kam","Jum","Sab" ],
+	dayNamesMin: [ "Mg","Sn","Sl","Rb","Km","jm","Sb" ],
+	weekHeader: "Mg",
+	dateFormat: "dd/mm/yy",
+	firstDay: 0,
+	isRTL: false,
+	showMonthAfterYear: false,
+	yearSuffix: "" };
+datepicker.setDefaults( datepicker.regional.id );
+
+return datepicker.regional.id;
+
+} ) );
diff --git a/wiki/inc/lang/id/lang.php b/wiki/inc/lang/id/lang.php
new file mode 100644
index 0000000..dc9d662
--- /dev/null
+++ b/wiki/inc/lang/id/lang.php
@@ -0,0 +1,312 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author mubaidillah <mubaidillah@gmail.com>
+ * @author Irwan Butar Butar <irwansah.putra@gmail.com>
+ * @author Yustinus Waruwu <juswaruwu@gmail.com>
+ * @author zamroni <therons@ymail.com>
+ * @author umriya afini <bigdream.power@gmail.com>
+ * @author Arif Budiman <me@kangarif.com>
+ */
+$lang['encoding']              = 'utf-8';
+$lang['direction']             = 'ltr';
+$lang['doublequoteopening']    = '“';
+$lang['doublequoteclosing']    = '”';
+$lang['singlequoteopening']    = '‘';
+$lang['singlequoteclosing']    = '’';
+$lang['apostrophe']            = '\'';
+$lang['btn_edit']              = 'Edit halaman ini';
+$lang['btn_source']            = 'Lihat sumber halaman';
+$lang['btn_show']              = 'Tampilkan halaman';
+$lang['btn_create']            = 'Buat halaman baru';
+$lang['btn_search']            = 'Cari';
+$lang['btn_save']              = 'Simpan';
+$lang['btn_top']               = 'kembali ke atas';
+$lang['btn_newer']             = '<< lebih lanjut';
+$lang['btn_older']             = 'sebelumnya >>';
+$lang['btn_revs']              = 'Revisi-revisi lama';
+$lang['btn_recent']            = 'Perubahan terbaru';
+$lang['btn_upload']            = 'Upload';
+$lang['btn_cancel']            = 'Batal';
+$lang['btn_index']             = 'Indeks';
+$lang['btn_login']             = 'Login';
+$lang['btn_logout']            = 'Keluar';
+$lang['btn_admin']             = 'Admin';
+$lang['btn_update']            = 'Ubah';
+$lang['btn_delete']            = 'Hapus';
+$lang['btn_back']              = 'Kembali';
+$lang['btn_backlink']          = 'Backlinks';
+$lang['btn_subscribe']         = 'Ikuti Perubahan';
+$lang['btn_profile']           = 'Ubah Profil';
+$lang['btn_resendpwd']         = 'Atur password baru';
+$lang['btn_recover']           = 'Cadangkan draf';
+$lang['btn_draftdel']          = 'Hapus draft';
+$lang['btn_revert']            = 'Kembalikan';
+$lang['btn_register']          = 'Daftar';
+$lang['btn_apply']             = 'Terapkan';
+$lang['btn_media']             = 'Pengelola Media';
+$lang['btn_deleteuser']        = 'Hapus Akun Saya';
+$lang['btn_img_backto']        = 'Kembali ke %s';
+$lang['btn_mediaManager']      = 'Tampilkan di pengelola media';
+$lang['loggedinas']            = 'Login sebagai :';
+$lang['user']                  = 'Username';
+$lang['pass']                  = 'Password';
+$lang['newpass']               = 'Password baru';
+$lang['oldpass']               = 'Konfirmasi password';
+$lang['passchk']               = 'sekali lagi';
+$lang['remember']              = 'Ingat saya';
+$lang['fullname']              = 'Nama lengkap';
+$lang['email']                 = 'E-Mail';
+$lang['profile']               = 'Profil User';
+$lang['badlogin']              = 'Maaf, username atau password salah.';
+$lang['badpassconfirm']        = 'Maaf, password salah';
+$lang['minoredit']             = 'Perubahan Minor';
+$lang['draftdate']             = 'Simpan draft secara otomatis';
+$lang['regmissing']            = 'Maaf, Anda harus mengisi semua field.';
+$lang['reguexists']            = 'Maaf, user dengan user login ini telah ada.';
+$lang['regsuccess']            = 'User telah didaftarkan dan password telah dikirim ke email Anda.';
+$lang['regsuccess2']           = 'User telah dibuatkan.';
+$lang['regmailfail']           = 'Kami menemukan kesalahan saat mengirimkan password ke alamat email Anda. Mohon hubungi administrator.';
+$lang['regbadmail']            = 'Alamat email yang Anda masukkan tidak valid - jika menurut Anda hal ini adalah kesalahan sistem, mohon hubungi admin.';
+$lang['regbadpass']            = 'Passwod yang dimasukkan tidak sama. Silahkan ulangi lagi.';
+$lang['regpwmail']             = 'Password DokuWiki Anda';
+$lang['reghere']               = 'Anda belum mempunyai account? silahkan ';
+$lang['profna']                = 'Wiki ini tidak mengijinkan perubahan profil.';
+$lang['profnochange']          = 'Tidak ada perubahan.';
+$lang['profnoempty']           = 'Mohon mengisikan nama atau alamat email.';
+$lang['profchanged']           = 'Profil User berhasil diubah.';
+$lang['profnodelete']          = 'Wiki ini tidak mendukung penghapusan pengguna';
+$lang['profdeleteuser']        = 'Hapus Akun';
+$lang['profdeleted']           = 'Akun anda telah dihapus dari wiki ini';
+$lang['profconfdelete']        = 'Saya berharap menghapus akun saya dari wiki ini.
+Aksi ini tidak bisa diselesaikan.';
+$lang['profconfdeletemissing'] = 'Knfirmasi check box tidak tercentang';
+$lang['pwdforget']             = 'Lupa Password? Dapatkan yang baru';
+$lang['resendna']              = 'Wiki ini tidak mendukung pengiriman ulang password.';
+$lang['resendpwd']             = 'Atur password baru';
+$lang['resendpwdmissing']      = 'Maaf, Anda harus mengisikan semua field.';
+$lang['resendpwdnouser']       = 'Maaf, user ini tidak ditemukan.';
+$lang['resendpwdbadauth']      = 'Maaf, kode autentikasi tidak valid. Pastikan Anda menggunakan keseluruhan link konfirmasi.';
+$lang['resendpwdconfirm']      = 'Link konfirmasi telah dikirim melalui email.';
+$lang['resendpwdsuccess']      = 'Password baru Anda telah dikirim melalui email.';
+$lang['license']               = 'Kecuali jika dinyatakan lain, konten pada wiki ini dilisensikan dibawah lisensi berikut:';
+$lang['licenseok']             = 'Catatan: Dengan menyunting halaman ini, Anda setuju untuk melisensikan konten Anda dibawah lisensi berikut:';
+$lang['searchmedia']           = 'Cari nama file:';
+$lang['searchmedia_in']        = 'Cari di %s';
+$lang['txt_upload']            = 'File yang akan diupload:';
+$lang['txt_filename']          = 'Masukkan nama wiki (opsional):';
+$lang['txt_overwrt']           = 'File yang telah ada akan ditindih';
+$lang['maxuploadsize']         = 'Unggah maks. %s per berkas';
+$lang['lockedby']              = 'Sedang dikunci oleh:';
+$lang['lockexpire']            = 'Penguncian artikel sampai dengan:';
+$lang['js']['willexpire']      = 'Halaman yang sedang Anda kunci akan berakhir dalam waktu kurang lebih satu menit.\nUntuk menghindari konflik, gunakan tombol Preview untuk me-reset timer pengunci.';
+$lang['js']['notsavedyet']     = 'Perubahan yang belum disimpan akan hilang.\nYakin akan dilanjutkan?';
+$lang['js']['searchmedia']     = 'Cari file';
+$lang['js']['keepopen']        = 'Biarkan window terbuka dalam pemilihan';
+$lang['js']['hidedetails']     = 'Sembunyikan detil';
+$lang['js']['mediatitle']      = 'Pengaturan Link';
+$lang['js']['mediadisplay']    = 'Jenis tautan';
+$lang['js']['mediaalign']      = 'Perataan';
+$lang['js']['mediasize']       = 'Ukuran gambar';
+$lang['js']['mediatarget']     = 'Tautan tujuan';
+$lang['js']['mediaclose']      = 'Tutup';
+$lang['js']['mediainsert']     = 'Sisip';
+$lang['js']['mediadisplayimg'] = 'Lihat gambar';
+$lang['js']['mediadisplaylnk'] = 'Lihat hanya link';
+$lang['js']['mediasmall']      = 'Versi kecil';
+$lang['js']['mediamedium']     = 'Versi sedang';
+$lang['js']['medialarge']      = 'Versi besar';
+$lang['js']['mediaoriginal']   = 'Versi asli';
+$lang['js']['medialnk']        = 'Tautan ke halaman rincian';
+$lang['js']['mediadirect']     = 'Tautan langsung ke aslinya';
+$lang['js']['medianolnk']      = 'Tanpa tautan';
+$lang['js']['medianolink']     = 'Jangan tautkan gambar';
+$lang['js']['medialeft']       = 'Rata gambar sebelah kiri';
+$lang['js']['mediaright']      = 'Rata gambar sebelah kanan';
+$lang['js']['mediacenter']     = 'Rata gambar di tengah';
+$lang['js']['medianoalign']    = 'Jangan gunakan perataan';
+$lang['js']['nosmblinks']      = 'Link ke share Windows hanya bekerja di Microsoft Internet Explorer.
+Anda masih dapat mengcopy and paste linknya.';
+$lang['js']['linkwiz']         = 'Wizard Tautan';
+$lang['js']['linkto']          = 'Tautkan ke:';
+$lang['js']['del_confirm']     = 'Hapus tulisan ini?';
+$lang['js']['restore_confirm'] = 'Benar-benar ingin mengembalikan versi ini?';
+$lang['js']['media_diff']      = 'Lihat perbedaan:';
+$lang['js']['media_diff_both'] = 'Berdampingan';
+$lang['js']['media_diff_opacity'] = 'Mencolok';
+$lang['js']['media_select']    = 'Pilih file...';
+$lang['js']['media_upload_btn'] = 'Unggah';
+$lang['js']['media_done_btn']  = 'Selesai';
+$lang['js']['media_drop']      = 'Tarik file disini untuk mengunggah';
+$lang['js']['media_cancel']    = 'Buang';
+$lang['js']['media_overwrt']   = 'Timpa berkas yang ada';
+$lang['rssfailed']             = 'Error terjadi saat mengambil feed: ';
+$lang['nothingfound']          = 'Tidak menemukan samasekali.';
+$lang['mediaselect']           = 'Pilihan Mediafile';
+$lang['uploadsucc']            = 'Upload sukses';
+$lang['uploadfail']            = 'Upload gagal. Apakah hak ijinnya salah?';
+$lang['uploadwrong']           = 'Upload ditolak. Ekstensi file ini tidak diperbolehkan!';
+$lang['uploadexist']           = 'File telah ada. Tidak mengerjakan apa-apa.';
+$lang['uploadbadcontent']      = 'Isi file yang diupload tidak cocok dengan ekstensi file %s.';
+$lang['uploadspam']            = 'File yang diupload diblok oleh spam blacklist.';
+$lang['uploadxss']             = 'File yang diupload diblok karena kemungkinan isi yang berbahaya.';
+$lang['uploadsize']            = 'File yang diupload terlalu besar. (max. %s)';
+$lang['deletesucc']            = 'File "%s" telah dihapus.';
+$lang['deletefail']            = '"%s" tidak dapat dihapus - cek hak aksesnya.';
+$lang['mediainuse']            = 'File "%s" belum dihapus - file ini sedang digunakan.';
+$lang['namespaces']            = 'Namespaces';
+$lang['mediafiles']            = 'File tersedia didalam';
+$lang['accessdenied']          = 'Anda tidak diperbolehkan melihat halaman ini';
+$lang['mediausage']            = 'Gunakan sintaks berikut untuk me-refer ke file ini';
+$lang['mediaview']             = 'Tampilkan file asli';
+$lang['mediaroot']             = 'root';
+$lang['mediaupload']           = 'Upload file ke namespace ini. Untuk menbuat namespace baru, tambahkan namanya didepanpada nama file "Upload as" dipisahkan dengan titik dua (:).';
+$lang['mediaextchange']        = 'Ektensi file berubah dari .%s ke .%s';
+$lang['reference']             = 'Referensi untuk';
+$lang['ref_inuse']             = 'File tidak dapat dihapus karena sedang digunakan oleh halaman:';
+$lang['ref_hidden']            = 'Beberapa referensi ada didalam halaman yang tidak diijinkan untuk Anda baca.';
+$lang['quickhits']             = 'Matching pagenames';
+$lang['toc']                   = 'Daftar isi';
+$lang['current']               = 'sekarang';
+$lang['yours']                 = 'Versi Anda';
+$lang['diff']                  = 'Tampilkan perbedaan dengan versi sekarang';
+$lang['diff2']                 = 'Tampilkan perbedaan diantara revisi terpilih';
+$lang['difflink']              = 'Tautan ke tampilan pembanding ini';
+$lang['diff_type']             = 'Tampilkan perbedaan:';
+$lang['diff_inline']           = 'Sebaris';
+$lang['diff_side']             = 'Berdampingan';
+$lang['diffprevrev']           = 'Revisi sebelumnya';
+$lang['diffnextrev']           = 'Revisi selanjutnya';
+$lang['difflastrev']           = 'Revisi terakhir';
+$lang['line']                  = 'Baris';
+$lang['breadcrumb']            = 'Jejak:';
+$lang['youarehere']            = 'Anda disini:';
+$lang['lastmod']               = 'Terakhir diubah:';
+$lang['by']                    = 'oleh';
+$lang['deleted']               = 'terhapus';
+$lang['created']               = 'dibuat';
+$lang['restored']              = 'revisi lama ditampilkan kembali (%s)';
+$lang['external_edit']         = 'Perubahan eksternal';
+$lang['noflash']               = '<a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> diperlukan untuk menampilkan konten ini.';
+$lang['download']              = 'Unduh Cuplikan';
+$lang['tools']                 = 'Alat';
+$lang['user_tools']            = 'Alat Pengguna';
+$lang['site_tools']            = 'Alat Situs';
+$lang['page_tools']            = 'Alat Halaman';
+$lang['skip_to_content']       = 'lewati ke konten';
+$lang['sidebar']               = 'Bilah Sisi';
+$lang['mail_newpage']          = 'Halaman ditambahkan:';
+$lang['mail_changed']          = 'Halaman diubah:';
+$lang['mail_subscribe_list']   = 'halaman diubah dalam namespace:';
+$lang['mail_new_user']         = 'User baru:';
+$lang['mail_upload']           = 'Berkas di-upload:';
+$lang['changes_type']          = 'Tampilkan perubahan';
+$lang['pages_changes']         = 'Halaman';
+$lang['media_changes']         = 'Berkas media';
+$lang['both_changes']          = 'Baik halaman dan berkas media';
+$lang['qb_bold']               = 'Tebal';
+$lang['qb_italic']             = 'Miring';
+$lang['qb_underl']             = 'Garis Bawah';
+$lang['qb_code']               = 'Kode';
+$lang['qb_strike']             = 'Text Tercoret';
+$lang['qb_hs']                 = 'Pilih Judul';
+$lang['qb_hplus']              = 'Judul Lebih Atas';
+$lang['qb_hminus']             = 'Judul Lebih Bawah';
+$lang['qb_hequal']             = 'Tingkat Judul yang Sama';
+$lang['qb_hr']                 = 'Garis Horisontal';
+$lang['qb_ol']                 = 'Item Berurutan';
+$lang['qb_ul']                 = 'Item Tidak Berurutan';
+$lang['qb_media']              = 'Tambahkan gambar atau file lain';
+$lang['qb_sig']                = 'Sisipkan tanda tangan';
+$lang['qb_chars']              = 'Karakter Khusus';
+$lang['upperns']               = 'lompat ke namespace induk';
+$lang['metasaveerr']           = 'Gagal menulis metadata';
+$lang['metasaveok']            = 'Metadata tersimpan';
+$lang['img_title']             = 'Judul:';
+$lang['img_caption']           = 'Label:';
+$lang['img_date']              = 'Tanggal:';
+$lang['img_fname']             = 'Nama file:';
+$lang['img_fsize']             = 'Ukuran:';
+$lang['img_artist']            = 'Tukang foto:';
+$lang['img_copyr']             = 'Hakcipta:';
+$lang['img_format']            = 'Format:';
+$lang['img_camera']            = 'Kamera:';
+$lang['img_keywords']          = 'Katakunci:';
+$lang['img_width']             = 'Lebar:';
+$lang['img_height']            = 'Tinggi:';
+$lang['subscr_subscribe_success'] = 'Menambah %s ke senarai langganan untuk %s';
+$lang['subscr_subscribe_error'] = 'Kesalahan menambahkan %s ke senarai langganan untuk %s';
+$lang['subscr_subscribe_noaddress'] = 'Tidak ada alamat yang terkait dengan login Anda, Anda tidak dapat ditambahkan ke senarai langganan';
+$lang['subscr_unsubscribe_success'] = 'Menghapus %s dari senarai langganan untuk %s';
+$lang['subscr_unsubscribe_error'] = 'Kesalahan menghapus %s dari senarai langganan untuk %s';
+$lang['subscr_already_subscribed'] = '%s sudah dilanggankan ke %s';
+$lang['subscr_not_subscribed'] = '%s tidak dilanggankan ke %s';
+$lang['subscr_m_not_subscribed'] = 'Saat ini Anda tidak berlangganan halaman dan namespace saat ini.';
+$lang['subscr_m_new_header']   = 'Tambahkan langganan';
+$lang['subscr_m_current_header'] = 'Langganan saat ini';
+$lang['subscr_m_unsubscribe']  = 'Berhenti berlangganan';
+$lang['subscr_m_subscribe']    = 'Berlangganan';
+$lang['subscr_m_receive']      = 'Menerima';
+$lang['subscr_style_every']    = 'email setiap diubah';
+$lang['authtempfail']          = 'Autentikasi user saat ini sedang tidak dapat digunakan. Jika kejadian ini berlanjut, Harap informasikan admin Wiki Anda.';
+$lang['i_chooselang']          = 'Pilih bahasa';
+$lang['i_installer']           = 'Instalasi DokuWiki';
+$lang['i_wikiname']            = 'Nama Wiki';
+$lang['i_enableacl']           = 'Aktifkan ACL (disarankan)';
+$lang['i_problems']            = 'Terdapat beberapa kesalahan seperti berikut. Anda tidak dapat melanjutkan sampai kesalahan tersebut diperbaiki.';
+$lang['i_modified']            = 'Untuk alasan keamanan, skrip ini hanya dapat dijalankan pada instalasi DikuWiki baru dan belum di modifikasi. Silahkan meng-ekstrak kembali berkasi dari halaman dowload, atau lihat   <a href="http://dokuwiki.org/install">Dokuwiki installation instructions</a> ';
+$lang['i_funcna']              = 'Fungsi PHP <code>%s</code> tidak tersedia. Mungkin dinonaktifkan oleh layanan hosting Anda?';
+$lang['i_phpver']              = 'Versi PHP Anda <code>%s</code> lebih rendah dari yang dibutuhkan <code>%s</code>. Mohon melakukan upgrade.';
+$lang['i_permfail']            = '<code>%s</code> tidak dapat ditulis oleh DokuWiki. Anda harus memperbaiki konfigurasi hak akses untuk direktori tersebut.';
+$lang['i_confexists']          = '<code>%s</code> sudah ada';
+$lang['i_writeerr']            = 'Tidak dapat membuat <code>%s</code>. Anda harus memeriksa konfigurasi hak akses direktori/berkas dan membuatnya secara manual.';
+$lang['i_badhash']             = 'dokuwiki.php tidak dikenal atau sudah diubah (hash=<code>%s</code>)';
+$lang['i_badval']              = '<code>%s</code> - tidak valid atau belum diisi';
+$lang['i_success']             = 'Konfigurasi telah berhasil. Anda boleh menghapus berkas install.php sekarang. Lanjutkan ke <a href="doku.php?id=wiki:welcome">DokuWiki baru Anda</a>.';
+$lang['i_failure']             = 'Terdapat beberapa kesalahan dalam menulis berkas konfigurasi. Anda harus memperbaikinnya sendiri sebelum dapat menggunakan <a href="doku.php?id=wiki:welcome">DokuWiki baru Anda</a>.';
+$lang['i_policy']              = 'Policy ACL awal';
+$lang['i_pol0']                = 'Wiki Terbuka (baca, tulis, upload untuk semua orang)';
+$lang['i_pol1']                = 'Wiki Publik (baca untuk semua orang, tulis dan upload untuk pengguna terdaftar)';
+$lang['i_pol2']                = 'Wiki Privat (baca, tulis dan upload hanya untuk pengguna terdaftar)';
+$lang['i_allowreg']            = 'Ijinkan pengguna mendaftar sendiri';
+$lang['i_retry']               = 'Coba Lagi';
+$lang['i_license']             = 'Silakan pilih lisensi untuk konten Anda:';
+$lang['i_license_none']        = 'Jangan tampilkan semua informasi lisensi';
+$lang['i_pop_field']           = 'Tolong, bantu kami meningkatkan pengalaman DokuWiki:';
+$lang['i_pop_label']           = 'Setiap bulan mengirimkan penggunaan data anonim ke pengembang DokuWiki';
+$lang['years']                 = '%d tahun yang lalu';
+$lang['months']                = '%d bulan yang lalu';
+$lang['weeks']                 = '%d minggu yang lalu';
+$lang['days']                  = '%d hari yang lalu';
+$lang['hours']                 = '%d jam yang lalu';
+$lang['minutes']               = '%d menit yang lalu';
+$lang['seconds']               = '%d detik yang lalu';
+$lang['wordblock']             = 'Pengubahan Anda tidak disimpan karena berisi teks yang diblokir (spam).';
+$lang['media_uploadtab']       = 'Unggah';
+$lang['media_searchtab']       = 'Cari';
+$lang['media_file']            = 'Berkas';
+$lang['media_viewtab']         = 'Lihat';
+$lang['media_edittab']         = 'Sunting';
+$lang['media_historytab']      = 'Riwayat';
+$lang['media_list_rows']       = 'Kolom';
+$lang['media_sort_name']       = 'Nama';
+$lang['media_sort_date']       = 'Tanggal';
+$lang['media_namespaces']      = 'Pilih namespace';
+$lang['media_upload']          = 'Unggah ke %s';
+$lang['media_search']          = 'Cari di %s';
+$lang['media_view']            = '%s';
+$lang['media_viewold']         = '%s di %s';
+$lang['media_edit']            = 'Sunting %s';
+$lang['media_history']         = 'Riwayat %s';
+$lang['media_meta_edited']     = 'metadata disunting';
+$lang['media_perm_read']       = 'Maaf, Anda tidak memiliki izin untuk membaca berkas.';
+$lang['media_perm_upload']     = 'Maaf, Anda tidak memiliki izin untuk mengunggah berkas.';
+$lang['media_update']          = 'Unggah versi baru';
+$lang['media_restore']         = 'Kembalikan versi ini';
+$lang['currentns']             = 'Namespace saat ini';
+$lang['searchresult']          = 'Hasil Pencarian';
+$lang['wikimarkup']            = 'Markah Wiki';
+$lang['email_signature_text'] = 'Email ini dibuat otomatis oleh DokuWiki
+@DOKUWIKIURL@';
diff --git a/wiki/inc/lang/id/locked.txt b/wiki/inc/lang/id/locked.txt
new file mode 100644
index 0000000..8147717
--- /dev/null
+++ b/wiki/inc/lang/id/locked.txt
@@ -0,0 +1,3 @@
+====== Halaman Terkunci ======
+
+Halaman ini tertutup (terkunci) untuk diedit oleh user lain. Anda harus menunggu sampai user ini menyelesaikan pengeditan, atau masa berlaku penguncian telah berakhir.
diff --git a/wiki/inc/lang/id/login.txt b/wiki/inc/lang/id/login.txt
new file mode 100644
index 0000000..f736e88
--- /dev/null
+++ b/wiki/inc/lang/id/login.txt
@@ -0,0 +1,4 @@
+====== Login ======
+
+Anda belum login! Masukkan data autentifikasi dibawah ini untuk masuk log (login). Cookies harus diaktifkan agar bisa login.
+
diff --git a/wiki/inc/lang/id/mailtext.txt b/wiki/inc/lang/id/mailtext.txt
new file mode 100644
index 0000000..df9699e
--- /dev/null
+++ b/wiki/inc/lang/id/mailtext.txt
@@ -0,0 +1,12 @@
+Halaman di DokuWiki Anda telah bertamah atau berubah, dengan detil sebagai berikut:
+
+Date        : @DATE@
+Browser     : @BROWSER@
+IP-Address  : @IPADDRESS@
+Hostname    : @HOSTNAME@
+Old Revision: @OLDPAGE@
+New Revision: @NEWPAGE@
+Edit Summary: @SUMMARY@
+User        : @USER@
+
+@DIFF@
diff --git a/wiki/inc/lang/id/newpage.txt b/wiki/inc/lang/id/newpage.txt
new file mode 100644
index 0000000..8d3f99d
--- /dev/null
+++ b/wiki/inc/lang/id/newpage.txt
@@ -0,0 +1,3 @@
+====== Topik ini belum tersedia ======
+
+Belum ada artikel di halaman ini. Anda dapat membuat tulisan-tulisan baru di halaman ini dengan menekan tombol "Buat Halaman Baru" (lihat dibagian bawah...!)
diff --git a/wiki/inc/lang/id/norev.txt b/wiki/inc/lang/id/norev.txt
new file mode 100644
index 0000000..5244f83
--- /dev/null
+++ b/wiki/inc/lang/id/norev.txt
@@ -0,0 +1,4 @@
+====== Revisi tidak tersedia ======
+
+Revisi yang diinginkan tidak ada. Gunakan tombol ''Revisi Lama'' untuk menampilkan daftar revisi lama dari dokumen ini.
+
diff --git a/wiki/inc/lang/id/password.txt b/wiki/inc/lang/id/password.txt
new file mode 100644
index 0000000..285915c
--- /dev/null
+++ b/wiki/inc/lang/id/password.txt
@@ -0,0 +1,6 @@
+Hi @FULLNAME@!
+
+Berikut data Anda untuk @TITLE@ di @DOKUWIKIURL@
+
+Login    : @LOGIN@
+Password : @PASSWORD@
diff --git a/wiki/inc/lang/id/preview.txt b/wiki/inc/lang/id/preview.txt
new file mode 100644
index 0000000..1621946
--- /dev/null
+++ b/wiki/inc/lang/id/preview.txt
@@ -0,0 +1,4 @@
+====== Preview ======
+
+Ini adalah preview tentang bagimana tulisan Anda akan ditampilkan. Ingat: tulisan ini **belum disimpan**!
+
diff --git a/wiki/inc/lang/id/pwconfirm.txt b/wiki/inc/lang/id/pwconfirm.txt
new file mode 100644
index 0000000..a787792
--- /dev/null
+++ b/wiki/inc/lang/id/pwconfirm.txt
@@ -0,0 +1,9 @@
+Hai @FULLNAME@!
+
+Seseorang telah meminta password baru untuk @TITLE@ Anda login ke @DOKUWIKIURL@
+
+Jika Anda tidak meminta password baru, mohon mengacuhkan email ini.
+
+Untuk mengkonfirmasi bahwa permintaan tersebut adalah benar dari Anda, silahkan gunakan link dibawah.
+
+@CONFIRM@
diff --git a/wiki/inc/lang/id/read.txt b/wiki/inc/lang/id/read.txt
new file mode 100644
index 0000000..f78c0eb
--- /dev/null
+++ b/wiki/inc/lang/id/read.txt
@@ -0,0 +1,2 @@
+Halaman ini hanya bisa dibaca. Anda bisa melihat sumbernya, tetapi tidak diperkenankan untuk mengubah. Hubungi administrator jika menemukan kesalahan pada halaman ini.
+
diff --git a/wiki/inc/lang/id/recent.txt b/wiki/inc/lang/id/recent.txt
new file mode 100644
index 0000000..f7cf244
--- /dev/null
+++ b/wiki/inc/lang/id/recent.txt
@@ -0,0 +1,5 @@
+====== Perubahan ======
+
+Berikut ini adalah halaman-halaman yang baru saja diubah.
+
+
diff --git a/wiki/inc/lang/id/register.txt b/wiki/inc/lang/id/register.txt
new file mode 100644
index 0000000..dd8c578
--- /dev/null
+++ b/wiki/inc/lang/id/register.txt
@@ -0,0 +1,4 @@
+====== Mendaftar sebagai anggota baru ======
+
+Isikan semua informasi dibawah ini untuk membuat account baru di wiki ini. Pastikan Anda telah mengisikan **alamat email yang valid**, karena password akan dikirim melalui email ini. Nama login harus sesuai dengan aturan [[doku>pagename|pagename]].
+
diff --git a/wiki/inc/lang/id/registermail.txt b/wiki/inc/lang/id/registermail.txt
new file mode 100644
index 0000000..5943e35
--- /dev/null
+++ b/wiki/inc/lang/id/registermail.txt
@@ -0,0 +1,10 @@
+User baru telah mendaftar. Berikut detailnya:
+
+User name : @NEWUSER@
+Full name : @NEWNAME@
+E-mail : @NEWEMAIL@
+
+Date : @DATE@
+Browser : @BROWSER@
+IP-Address : @IPADDRESS@
+Hostname : @HOSTNAME@
diff --git a/wiki/inc/lang/id/resendpwd.txt b/wiki/inc/lang/id/resendpwd.txt
new file mode 100644
index 0000000..276b292
--- /dev/null
+++ b/wiki/inc/lang/id/resendpwd.txt
@@ -0,0 +1,3 @@
+====== Kirim Password Baru ======
+
+Masukkan nama user Anda pada form dibawah untuk permintaan perubahan password account Anda di Wiki ini. Link konfirmasi akan dikirimkan melalui alamat email Anda sewaktu registrasi.
diff --git a/wiki/inc/lang/id/resetpwd.txt b/wiki/inc/lang/id/resetpwd.txt
new file mode 100644
index 0000000..6ab26c8
--- /dev/null
+++ b/wiki/inc/lang/id/resetpwd.txt
@@ -0,0 +1,3 @@
+====== Atur sandi baru ====== 
+
+Silakan masukkan sandi baru untuk akun Anda di wiki ini.
\ No newline at end of file
diff --git a/wiki/inc/lang/id/revisions.txt b/wiki/inc/lang/id/revisions.txt
new file mode 100644
index 0000000..d82b273
--- /dev/null
+++ b/wiki/inc/lang/id/revisions.txt
@@ -0,0 +1,4 @@
+====== Revisi Lama ======
+
+Ini adalah revisi-revisi lama dari dokumen ini. Untuk mengaktifkan kembali revisi lama, pilih dokumen revisi, kemudikan tekan "Edit halaman ini" lalu Simpan.
+
diff --git a/wiki/inc/lang/id/searchpage.txt b/wiki/inc/lang/id/searchpage.txt
new file mode 100644
index 0000000..c03b6d7
--- /dev/null
+++ b/wiki/inc/lang/id/searchpage.txt
@@ -0,0 +1,4 @@
+====== Pencarian ======
+
+Anda dapat menemukan hasil pencarian dibawah ini. @CREATEPAGEINFO@
+
diff --git a/wiki/inc/lang/id/showrev.txt b/wiki/inc/lang/id/showrev.txt
new file mode 100644
index 0000000..27f0c64
--- /dev/null
+++ b/wiki/inc/lang/id/showrev.txt
@@ -0,0 +1,2 @@
+**Ini adalah dokumen versi lama!**
+----
diff --git a/wiki/inc/lang/id/stopwords.txt b/wiki/inc/lang/id/stopwords.txt
new file mode 100644
index 0000000..73713c8
--- /dev/null
+++ b/wiki/inc/lang/id/stopwords.txt
@@ -0,0 +1,37 @@
+# This is a list of words the indexer ignores, one word per line
+# When you edit this file be sure to use UNIX line endings (single newline)
+# No need to include words shorter than 3 chars - these are ignored anyway
+# This list is based upon the ones found at http://www.ranks.nl/stopwords/
+about
+are
+and
+you
+your
+them
+their
+com
+for
+from
+into
+how
+that
+the
+this
+was
+what
+when
+where
+who
+will
+with
+und
+the
+www
+yang
+dan
+adalah
+untuk
+lalu
+maka
+kemudian
+jika
diff --git a/wiki/inc/lang/id/subscr_digest.txt b/wiki/inc/lang/id/subscr_digest.txt
new file mode 100644
index 0000000..2a5176b
--- /dev/null
+++ b/wiki/inc/lang/id/subscr_digest.txt
@@ -0,0 +1,14 @@
+Hei!
+
+Halaman @PAGE@ di wiki @TITLE@ telah disunting.
+Berikut perubahannya:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Revisi lama: @OLDPAGE@
+
+Revisi baru: @NEWPAGE@
+
+Untuk menonaktifkan pemberitahuan ini, masuk ke wiki di @DOKUWIKIURL@ kemudian kunjungi @SUBSCRIBE@ dan halaman batal berlangganan dan/atau namespace yang diubah.
diff --git a/wiki/inc/lang/id/updateprofile.txt b/wiki/inc/lang/id/updateprofile.txt
new file mode 100644
index 0000000..b7f71a1
--- /dev/null
+++ b/wiki/inc/lang/id/updateprofile.txt
@@ -0,0 +1,3 @@
+====== Ubah Profil Account Anda ======
+
+Anda hanya perlu mengisikan field yang ingin Anda ubah. Anda tidak dapat mengubah username Anda.
diff --git a/wiki/inc/lang/id/uploadmail.txt b/wiki/inc/lang/id/uploadmail.txt
new file mode 100644
index 0000000..bb5f5e8
--- /dev/null
+++ b/wiki/inc/lang/id/uploadmail.txt
@@ -0,0 +1,10 @@
+Sebuah file telah diupload di DokuWiki Anda. Berikut detailnya:
+
+File : @MEDIA@
+Date : @DATE@
+Browser : @BROWSER@
+IP-Address : @IPADDRESS@
+Hostname : @HOSTNAME@
+Size : @SIZE@
+MIME Type : @MIME@
+User : @USER@
diff --git a/wiki/inc/lang/is/adminplugins.txt b/wiki/inc/lang/is/adminplugins.txt
new file mode 100644
index 0000000..ce7b9d3
--- /dev/null
+++ b/wiki/inc/lang/is/adminplugins.txt
@@ -0,0 +1 @@
+===== Aðrar viðbætur =====
\ No newline at end of file
diff --git a/wiki/inc/lang/is/diff.txt b/wiki/inc/lang/is/diff.txt
new file mode 100644
index 0000000..a6d246a
--- /dev/null
+++ b/wiki/inc/lang/is/diff.txt
@@ -0,0 +1,3 @@
+===== Breytingar =====
+
+Hér sést hvað hefur breyst á milli útgáfna.
\ No newline at end of file
diff --git a/wiki/inc/lang/is/jquery.ui.datepicker.js b/wiki/inc/lang/is/jquery.ui.datepicker.js
new file mode 100644
index 0000000..b15f37a
--- /dev/null
+++ b/wiki/inc/lang/is/jquery.ui.datepicker.js
@@ -0,0 +1,45 @@
+/* Icelandic initialisation for the jQuery UI date picker plugin. */
+/* Written by Haukur H. Thorsson (haukur@eskill.is). */
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "../widgets/datepicker" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery.datepicker );
+	}
+}( function( datepicker ) {
+
+datepicker.regional.is = {
+	closeText: "Loka",
+	prevText: "&#x3C; Fyrri",
+	nextText: "Næsti &#x3E;",
+	currentText: "Í dag",
+	monthNames: [ "Janúar","Febrúar","Mars","Apríl","Maí","Júní",
+	"Júlí","Ágúst","September","Október","Nóvember","Desember" ],
+	monthNamesShort: [ "Jan","Feb","Mar","Apr","Maí","Jún",
+	"Júl","Ágú","Sep","Okt","Nóv","Des" ],
+	dayNames: [
+		"Sunnudagur",
+		"Mánudagur",
+		"Þriðjudagur",
+		"Miðvikudagur",
+		"Fimmtudagur",
+		"Föstudagur",
+		"Laugardagur"
+	],
+	dayNamesShort: [ "Sun","Mán","Þri","Mið","Fim","Fös","Lau" ],
+	dayNamesMin: [ "Su","Má","Þr","Mi","Fi","Fö","La" ],
+	weekHeader: "Vika",
+	dateFormat: "dd.mm.yy",
+	firstDay: 0,
+	isRTL: false,
+	showMonthAfterYear: false,
+	yearSuffix: "" };
+datepicker.setDefaults( datepicker.regional.is );
+
+return datepicker.regional.is;
+
+} ) );
diff --git a/wiki/inc/lang/is/lang.php b/wiki/inc/lang/is/lang.php
new file mode 100644
index 0000000..0af4c57
--- /dev/null
+++ b/wiki/inc/lang/is/lang.php
@@ -0,0 +1,181 @@
+<?php
+/**
+ * is language file
+ *
+ * This file was initially built by fetching translations from other
+ * Wiki projects. See the @url lines below. Additional translations
+ * and fixes where done for DokuWiki by the people mentioned in the
+ * lines starting with @author
+ *
+ * @url http://svn.wikimedia.org/viewvc/mediawiki/trunk/phase3/languages/messages/MessagesIs.php?view=co
+ * @author Hrannar Baldursson <hrannar.baldursson@gmail.com>
+ * @author Ólafur Gunnlaugsson <oli@audiotools.com>
+ * @author Erik Bjørn Pedersen <erik.pedersen@shaw.ca>
+ */
+$lang['encoding']              = 'utf-8';
+$lang['direction']             = 'ltr';
+$lang['doublequoteopening']    = '„';
+$lang['doublequoteclosing']    = '“';
+$lang['singlequoteopening']    = '‚';
+$lang['singlequoteclosing']    = '‘';
+$lang['apostrophe']            = '\'';
+$lang['btn_edit']              = 'Breyta þessari síðu';
+$lang['btn_source']            = 'Skoða wikikóða';
+$lang['btn_show']              = 'Sýna síðu';
+$lang['btn_create']            = 'Búa til þessa síðu';
+$lang['btn_search']            = 'Leit';
+$lang['btn_save']              = 'Vista';
+$lang['btn_preview']           = 'Forskoða';
+$lang['btn_top']               = 'Efst á síðu';
+$lang['btn_newer']             = '<< nýrra';
+$lang['btn_older']             = 'eldra >>';
+$lang['btn_revs']              = 'breytingaskrá';
+$lang['btn_recent']            = 'Nýlegar breytingar';
+$lang['btn_upload']            = 'Hlaða upp';
+$lang['btn_cancel']            = 'Hætta við';
+$lang['btn_index']             = 'Atriðaskrá';
+$lang['btn_secedit']           = 'Breyta';
+$lang['btn_login']             = 'Innskrá';
+$lang['btn_logout']            = 'Útskrá';
+$lang['btn_admin']             = 'Stjórnandi';
+$lang['btn_update']            = 'Uppfæra';
+$lang['btn_delete']            = 'Eyða';
+$lang['btn_back']              = 'Til baka';
+$lang['btn_backlink']          = 'Hvað tengist hingað';
+$lang['btn_subscribe']         = 'Vakta';
+$lang['btn_profile']           = 'Uppfæra notanda';
+$lang['btn_reset']             = 'Endurstilla';
+$lang['btn_draft']             = 'Breyta uppkasti';
+$lang['btn_recover']           = 'Endurheimta uppkast';
+$lang['btn_draftdel']          = 'Eyða uppkasti';
+$lang['btn_revert']            = 'Endurheimta';
+$lang['btn_register']          = 'Skráning';
+$lang['loggedinas']            = 'Innskráning sem:';
+$lang['user']                  = 'Notendanafn';
+$lang['pass']                  = 'Aðgangsorð';
+$lang['newpass']               = 'Nýtt aðgangsorð';
+$lang['oldpass']               = 'Staðfesta núverandi (gamla) aðgangsorðið';
+$lang['passchk']               = 'Aðgangsorð (aftur)';
+$lang['remember']              = 'Muna.';
+$lang['fullname']              = 'Fullt nafn þitt*';
+$lang['email']                 = 'Tölvupóstfangið þitt*';
+$lang['profile']               = 'Notendastillingar';
+$lang['badlogin']              = 'Því miður, notandanafn eða aðgangsorð var rangur.';
+$lang['minoredit']             = 'Minniháttar breyting';
+$lang['draftdate']             = 'Uppkast vistað sjálfkrafa';
+$lang['nosecedit']             = 'Síðunni var breytt á meðan, upplýsingar um svæðið voru úreltar og öll síðan því endurhlaðin.';
+$lang['regmissing']            = 'Afsakið, en þú verður að fylla út í allar eyður.';
+$lang['reguexists']            = 'Afsakið, notandi með þessu nafni er þegar skráður inn.';
+$lang['regsuccess']            = 'Notandi hefur verið búinn til og aðgangsorð sent í tölvupósti.';
+$lang['regsuccess2']           = 'Notandi hefur verið búinn til.';
+$lang['regmailfail']           = 'Það lítur út fyrir villu við sendingu aðgangsorðs. Vinsamlegast hafðu samband við stjórnanda.';
+$lang['regbadmail']            = 'Uppgefinn tölvupóstur virðist ógildur - teljir þú þetta vera villu, hafðu þá samband við stjórnanda.';
+$lang['regbadpass']            = 'Aðgangsorðin tvö eru ekki eins, vinsamlegast reyndu aftur.';
+$lang['regpwmail']             = 'DokuWiki aðgangsorðið þitt';
+$lang['reghere']               = 'Ertu ekki með reikning? Skráðu þig';
+$lang['profna']                = 'Þessi wiki leyfir ekki breytingar á notendaupplýsingum';
+$lang['profnochange']          = 'Enga breytingar vistaðar';
+$lang['profnoempty']           = 'Það er ekki leyfilegt að skilja nafn og póstfang eftir óútfyllt';
+$lang['profchanged']           = 'Notendaupplýsingum breytt';
+$lang['pwdforget']             = 'Gleymt aðgangsorð? Fáðu nýtt';
+$lang['resendna']              = 'Þessi wiki styður ekki endursendingar aðgangsorðs';
+$lang['resendpwdmissing']      = 'Afsakið, þú verður að út eyðublaðið allt';
+$lang['resendpwdnouser']       = 'Afsakið, notandi finnst ekki.';
+$lang['resendpwdbadauth']      = 'Afsakið, þessi sannvottunorð er ekki gild. Gakktu úr skugga um að þú notaðir að ljúka staðfesting hlekkur.';
+$lang['resendpwdconfirm']      = 'Staðfesting hlekkur hefur verið send með tölvupósti.';
+$lang['resendpwdsuccess']      = 'Nýja aðgangsorðið hefur verið sent með tölvupósti.';
+$lang['license']               = 'Nema annað sé tekið fram, efni á þessari wiki er leyfð undir eftirfarandi leyfi:';
+$lang['licenseok']             = 'Athugið: Með því að breyta þessari síðu samþykkir þú að leyfisveitandi efni undir eftirfarandi leyfi:';
+$lang['searchmedia']           = 'Leit skrárheiti:';
+$lang['searchmedia_in']        = 'Leit í %s';
+$lang['txt_upload']            = 'Veldu skrá til innhleðslu:';
+$lang['txt_filename']          = 'Innhlaða sem (valfrjálst):';
+$lang['txt_overwrt']           = 'Skrifa yfir skrá sem þegar er til';
+$lang['lockedby']              = 'Læstur af:';
+$lang['lockexpire']            = 'Læsing rennur út eftir:';
+$lang['nothingfound']          = 'Ekkert fannst';
+$lang['mediaselect']           = 'Miðlaskrá';
+$lang['uploadsucc']            = 'Innhlaðning tókst';
+$lang['uploadfail']            = 'Villa í innhlaðningu';
+$lang['uploadwrong']           = 'Innhleðslu neitað. Skrár með þessari endingu eru ekki leyfðar.';
+$lang['uploadexist']           = 'Skrá var þegar til staðar.';
+$lang['uploadbadcontent']      = 'Innhlaðið efni var ekki við að %s skrárendingu.';
+$lang['uploadspam']            = 'Þessi innhlaðning er útilokuð vegna ruslpósts svarturlisti.';
+$lang['uploadxss']             = 'Þessi innhlaðning er útilokuð vegna hugsanlega skaðlegum efni.';
+$lang['uploadsize']            = 'Innhlaðið skrá var of stór. (Hámark eru %s)';
+$lang['deletesucc']            = 'Skrá %s hefur verið eytt.';
+$lang['namespaces']            = 'Nafnrýmar';
+$lang['mediafiles']            = 'Tiltækar skrár í';
+$lang['js']['searchmedia']     = 'Leita að skrám';
+$lang['js']['hidedetails']     = 'Fela upplýsingar';
+$lang['js']['linkwiz']         = 'Tengill-leiðsagnarforrit';
+$lang['js']['linkto']          = 'Tengja';
+$lang['js']['del_confirm']     = 'Á örugglega að eyða valdar skrár?';
+$lang['mediaview']             = 'Sjá upprunalega skrá';
+$lang['mediaroot']             = 'rót';
+$lang['mediaextchange']        = 'Skrárending var breytt úr .%s til .%s!';
+$lang['reference']             = 'Tilvísanir til';
+$lang['ref_inuse']             = 'Ekki hægt að eyða skráin, því það er enn notað af eftirfarandi síðum:';
+$lang['ref_hidden']            = 'Sumar tilvísanir eru að síður sem þú hefur ekki leyfi til að lesa';
+$lang['hits']                  = 'Samsvör';
+$lang['quickhits']             = 'Samsvörun síðunöfn';
+$lang['toc']                   = 'Efnisyfirlit';
+$lang['current']               = 'nú';
+$lang['yours']                 = 'Þín útgáfa';
+$lang['diff']                  = 'Sýna ágreiningur til núverandi endurskoðun';
+$lang['diff2']                 = 'Sýna ágreiningur meðal valið endurskoðun';
+$lang['line']                  = 'Lína';
+$lang['breadcrumb']            = 'Snefill:';
+$lang['youarehere']            = 'Þú ert hér:';
+$lang['lastmod']               = 'Síðast breytt:';
+$lang['by']                    = 'af';
+$lang['deleted']               = 'eytt';
+$lang['created']               = 'myndað';
+$lang['restored']              = 'Breytt aftur til fyrri útgáfu (%s)';
+$lang['external_edit']         = 'utanaðkomandi breyta';
+$lang['summary']               = 'Forskoða';
+$lang['noflash']               = 'Það þarf <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash viðbót</a> til að sýna sumt efnið á þessari síðu';
+$lang['download']              = 'Hlaða niður til kóðabút';
+$lang['mail_newpage']          = 'síðu bætt við:';
+$lang['mail_changed']          = 'síðu breytt:';
+$lang['mail_new_user']         = 'nýr notandi:';
+$lang['mail_upload']           = 'Innhlaðið skrá:';
+$lang['qb_bold']               = 'Feitletraður texti';
+$lang['qb_italic']             = 'Skáletraður texti';
+$lang['qb_underl']             = 'Undirstrikaður texti';
+$lang['qb_code']               = 'Kóðatraður texti';
+$lang['qb_strike']             = 'Yfirstrikaður texti';
+$lang['qb_h1']                 = 'Fyrsta stigs fyrirsögn';
+$lang['qb_h2']                 = 'Annars stigs fyrirsögn';
+$lang['qb_h3']                 = 'Þriðja stigs fyrirsögn';
+$lang['qb_h4']                 = 'Fjórða stigs fyrirsögn';
+$lang['qb_h5']                 = 'Fimmta stigs fyrirsögn';
+$lang['qb_h']                  = 'Fyrirsögn';
+$lang['qb_hs']                 = 'Veldu fyrirsögn';
+$lang['qb_hplus']              = 'Hærra stigs fyrirsögn';
+$lang['qb_hminus']             = 'Lægri stigs fyrirsögn';
+$lang['qb_hequal']             = 'Sama stigs fyrirsögn';
+$lang['qb_link']               = 'Innri tengill';
+$lang['qb_extlink']            = 'Ytri tengill (muna að setja http:// á undan)';
+$lang['qb_hr']                 = 'Lárétt lína (notist sparlega)';
+$lang['qb_ol']                 = 'Númeraðaðan listatriði';
+$lang['qb_ul']                 = 'Ónúmeraðaðan listatriði';
+$lang['qb_media']              = 'Bæta inn myndum og öðrum skrám';
+$lang['qb_sig']                = 'Undirskrift þín auk tímasetningu';
+$lang['qb_smileys']            = 'Broskallar';
+$lang['qb_chars']              = 'Sértækir stafir';
+$lang['metaedit']              = 'Breyta lýsigögnum';
+$lang['metasaveerr']           = 'Vistun lýsigagna mistókst';
+$lang['metasaveok']            = 'Lýsigögn vistuð';
+$lang['btn_img_backto']            = 'Aftur til %s';
+$lang['img_title']             = 'Heiti:';
+$lang['img_caption']           = 'Skýringartexti:';
+$lang['img_date']              = 'Dagsetning:';
+$lang['img_fname']             = 'Skrárheiti:';
+$lang['img_fsize']             = 'Stærð:';
+$lang['img_artist']            = 'Myndsmiður:';
+$lang['img_copyr']             = 'Útgáfuréttur:';
+$lang['img_format']            = 'Forsnið:';
+$lang['img_camera']            = 'Myndavél:';
+$lang['img_keywords']          = 'Lykilorðir:';
+$lang['i_retry']               = 'Reyna aftur';
diff --git a/wiki/inc/lang/is/login.txt b/wiki/inc/lang/is/login.txt
new file mode 100644
index 0000000..81e7e5e
--- /dev/null
+++ b/wiki/inc/lang/is/login.txt
@@ -0,0 +1,3 @@
+===== Innskráning =====
+
+Þú ert ekki skráður inn! Skráuðu þig inn hér að neðan. Athugaðu að vafrinn sem að þú notar verður að styðja móttöku smákaka.
\ No newline at end of file
diff --git a/wiki/inc/lang/is/recent.txt b/wiki/inc/lang/is/recent.txt
new file mode 100644
index 0000000..7d3cf57
--- /dev/null
+++ b/wiki/inc/lang/is/recent.txt
@@ -0,0 +1,3 @@
+===== Nýlegar Breytingar =====
+
+Eftirfarandi síðum hefur nýlega verið breytt.
\ No newline at end of file
diff --git a/wiki/inc/lang/is/resendpwd.txt b/wiki/inc/lang/is/resendpwd.txt
new file mode 100644
index 0000000..b847b1d
--- /dev/null
+++ b/wiki/inc/lang/is/resendpwd.txt
@@ -0,0 +1,3 @@
+====== Senda nýtt aðgangsorð ======
+
+Vinsamlegast sláðu inn notendanafn þitt í formið hér fyrir neðan til að biðja um nýtt aðgangsorð fyrir reikninginn þinn í þessu wiki. A staðfesting hlekkur verður sendast á skráð netfang.
\ No newline at end of file
diff --git a/wiki/inc/lang/it/admin.txt b/wiki/inc/lang/it/admin.txt
new file mode 100644
index 0000000..95a611e
--- /dev/null
+++ b/wiki/inc/lang/it/admin.txt
@@ -0,0 +1,4 @@
+====== Amministrazione ======
+
+Qui sotto puoi trovare una lista delle possibili azioni amministrative attualmente disponibili in Dokuwiki.
+
diff --git a/wiki/inc/lang/it/adminplugins.txt b/wiki/inc/lang/it/adminplugins.txt
new file mode 100644
index 0000000..4f17d6d
--- /dev/null
+++ b/wiki/inc/lang/it/adminplugins.txt
@@ -0,0 +1 @@
+===== Plugin aggiuntivi =====
\ No newline at end of file
diff --git a/wiki/inc/lang/it/backlinks.txt b/wiki/inc/lang/it/backlinks.txt
new file mode 100644
index 0000000..ad5a9c2
--- /dev/null
+++ b/wiki/inc/lang/it/backlinks.txt
@@ -0,0 +1,4 @@
+====== Puntano qui ======
+
+Questa è una lista delle pagine che sembrano avere un collegamento alla pagina attuale.
+
diff --git a/wiki/inc/lang/it/conflict.txt b/wiki/inc/lang/it/conflict.txt
new file mode 100644
index 0000000..bcb90d2
--- /dev/null
+++ b/wiki/inc/lang/it/conflict.txt
@@ -0,0 +1,6 @@
+====== Esiste una versione più recente ======
+
+Esiste una versione più recente del documento che hai modificato. Questo può accadere quando un altro utente ha già modificato il documento durante le tue modifiche.
+
+Esamina le differenze mostrate di seguito, quindi decidi quale versione mantenere. Se scegli ''Salva'', la tua versione verrà salvata. Clicca su ''Annulla'' per mantenere la versione attuale.
+
diff --git a/wiki/inc/lang/it/denied.txt b/wiki/inc/lang/it/denied.txt
new file mode 100644
index 0000000..577d081
--- /dev/null
+++ b/wiki/inc/lang/it/denied.txt
@@ -0,0 +1,4 @@
+====== Accesso negato ======
+
+Non hai i diritti per continuare.
+
diff --git a/wiki/inc/lang/it/diff.txt b/wiki/inc/lang/it/diff.txt
new file mode 100644
index 0000000..5a41eaa
--- /dev/null
+++ b/wiki/inc/lang/it/diff.txt
@@ -0,0 +1,4 @@
+====== Differenze ======
+
+Queste sono le differenze tra la revisione selezionata e la versione attuale della pagina.
+
diff --git a/wiki/inc/lang/it/draft.txt b/wiki/inc/lang/it/draft.txt
new file mode 100644
index 0000000..479d0fa
--- /dev/null
+++ b/wiki/inc/lang/it/draft.txt
@@ -0,0 +1,6 @@
+====== Trovata Bozza ======
+
+La tua ultima sessione di modifica su questa pagina non è stata completata correttamente. DokuWiki ha salvato in automatico una bozza durante il tuo lavoro, che puoi ora utilizzare per continuare le tue modifiche. Di seguito puoi trovare i dati che sono stati salvati dalla tua ultima sessione.
+
+Decidi se vuoi //recuperare// la sessione di modifica, //eliminare// la bozza salavata in automatico oppure //annullare// le modifiche.
+
diff --git a/wiki/inc/lang/it/edit.txt b/wiki/inc/lang/it/edit.txt
new file mode 100644
index 0000000..8f2ba97
--- /dev/null
+++ b/wiki/inc/lang/it/edit.txt
@@ -0,0 +1,2 @@
+Modifica la pagina e clicca su ''Salva''. Vedi [[wiki:syntax]] per la sintassi riconosciuta dal Wiki. Modifica questa pagina solo se puoi **apportare dei miglioramenti**. Se vuoi solo fare degli esperimenti ed imparare come fare i primi passi usa [[playground:playground]].
+
diff --git a/wiki/inc/lang/it/editrev.txt b/wiki/inc/lang/it/editrev.txt
new file mode 100644
index 0000000..5023200
--- /dev/null
+++ b/wiki/inc/lang/it/editrev.txt
@@ -0,0 +1,2 @@
+**Hai caricato una revisione precedente del documento!** Se salvi questa pagina creerai una nuova versione con questi dati.
+----
\ No newline at end of file
diff --git a/wiki/inc/lang/it/index.txt b/wiki/inc/lang/it/index.txt
new file mode 100644
index 0000000..52c6fbc
--- /dev/null
+++ b/wiki/inc/lang/it/index.txt
@@ -0,0 +1,4 @@
+====== Indice ======
+
+Questo è un indice di tutte le pagine disponibili ordinate per [[doku>namespaces|categorie]].
+
diff --git a/wiki/inc/lang/it/install.html b/wiki/inc/lang/it/install.html
new file mode 100644
index 0000000..9d0e57f
--- /dev/null
+++ b/wiki/inc/lang/it/install.html
@@ -0,0 +1,24 @@
+<p>Questa pagina ti assisterà durante l'installazione e la prima configurazione di
+<a href="http://dokuwiki.org">Dokuwiki</a>. Ulteriori informazioni sulla
+procedura di installazione sono reperibili nella
+<a href="http://dokuwiki.org/installer">pagina di documentazione</a>.</p>
+
+<p>DokuWiki utilizza dei normali file per la memorizzazione delle pagine del wiki e
+delle altre informazioni associate a tali pagine (es. immagini, indici per la ricerca, vecchie
+revisioni, ecc.).  Per poter operare correttamente DokuWiki
+<strong>deve</strong> accedere in scrittura alle directory che contengono tali
+file.  La procedura di installazione non è in grado di impostare i permessi sulle directory. Questo
+deve normalmente essere fatto direttamente da linea di comando oppure, se stai usando un servizio di hosting,
+attraverso FTP o dal pannello di controllo del servizio di hosting (es. cPanel).</p>
+
+<p>Questa procedura di installazione imposterà la configurazione di DokuWiki per l'uso di
+<abbr title="lista controllo accessi">ACL</abbr>, che consente all'amministratore di
+collegarsi e accedere al menu di amministrazione di DokuWiki per installare plugin, gestire
+utenti, gestire gli accessi alle pagine wiki e modificare le impostazioni del wiki.
+Non è necessario per il funzionamento di DokuWiki, ma renderà Dokuwiki più facile
+da amministrare.</p>
+
+<p>Gli utenti esperti o con particolari esigenze di installazione dovrebbero far riferimento ai
+seguenti link per dettagli sulle
+<a href="http://dokuwiki.org/install">istruzioni per l'installazione</a>
+e sui <a href="http://dokuwiki.org/config">parametri di configurazione</a>.</p>
diff --git a/wiki/inc/lang/it/jquery.ui.datepicker.js b/wiki/inc/lang/it/jquery.ui.datepicker.js
new file mode 100644
index 0000000..d67cb6c
--- /dev/null
+++ b/wiki/inc/lang/it/jquery.ui.datepicker.js
@@ -0,0 +1,37 @@
+/* Italian initialisation for the jQuery UI date picker plugin. */
+/* Written by Antonello Pasella (antonello.pasella@gmail.com). */
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "../widgets/datepicker" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery.datepicker );
+	}
+}( function( datepicker ) {
+
+datepicker.regional.it = {
+	closeText: "Chiudi",
+	prevText: "&#x3C;Prec",
+	nextText: "Succ&#x3E;",
+	currentText: "Oggi",
+	monthNames: [ "Gennaio","Febbraio","Marzo","Aprile","Maggio","Giugno",
+		"Luglio","Agosto","Settembre","Ottobre","Novembre","Dicembre" ],
+	monthNamesShort: [ "Gen","Feb","Mar","Apr","Mag","Giu",
+		"Lug","Ago","Set","Ott","Nov","Dic" ],
+	dayNames: [ "Domenica","Lunedì","Martedì","Mercoledì","Giovedì","Venerdì","Sabato" ],
+	dayNamesShort: [ "Dom","Lun","Mar","Mer","Gio","Ven","Sab" ],
+	dayNamesMin: [ "Do","Lu","Ma","Me","Gi","Ve","Sa" ],
+	weekHeader: "Sm",
+	dateFormat: "dd/mm/yy",
+	firstDay: 1,
+	isRTL: false,
+	showMonthAfterYear: false,
+	yearSuffix: "" };
+datepicker.setDefaults( datepicker.regional.it );
+
+return datepicker.regional.it;
+
+} ) );
diff --git a/wiki/inc/lang/it/lang.php b/wiki/inc/lang/it/lang.php
new file mode 100644
index 0000000..683ce45
--- /dev/null
+++ b/wiki/inc/lang/it/lang.php
@@ -0,0 +1,370 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author damiano <damiano@spagnuolo.eu>
+ * @author Torpedo <dgtorpedo@gmail.com>
+ * @author Giorgio Vecchiocattivi <giorgio@vecchio.it>
+ * @author Roberto Bolli [http://www.rbnet.it/]
+ * @author Silvia Sargentoni <polinnia@tin.it>
+ * @author Diego Pierotto <ita.translations@tiscali.it>
+ * @author Lorenzo Breda <lbreda@gmail.com>
+ * @author robocap <robocap1@gmail.com>
+ * @author Matteo Carnevali <rekstorm@gmail.com>
+ * @author Osman Tekin <osman.tekin93@hotmail.it>
+ * @author Jacopo Corbetta <jacopo.corbetta@gmail.com>
+ * @author Matteo Pasotti <matteo@xquiet.eu>
+ * @author Edmondo Di Tucci <snarchio@gmail.com>
+ * @author Claudio Lanconelli <lancos@libero.it>
+ * @author Mirko <malisan.mirko@gmail.com>
+ * @author Francesco <francesco.cavalli@hotmail.com>
+ * @author Fabio <fabioslurp@yahoo.it>
+ * @author Maurizio <mcannavo@katamail.com>
+ * @author Riccardo <riccardofila@gmail.com>
+ * @author Paolo <paolopoz12@gmail.com>
+ */
+$lang['encoding']              = 'utf-8';
+$lang['direction']             = 'ltr';
+$lang['doublequoteopening']    = '“';
+$lang['doublequoteclosing']    = '”';
+$lang['singlequoteopening']    = '‘';
+$lang['singlequoteclosing']    = '’';
+$lang['apostrophe']            = '’';
+$lang['btn_edit']              = 'Modifica questa pagina';
+$lang['btn_source']            = 'Mostra sorgente';
+$lang['btn_show']              = 'Mostra pagina';
+$lang['btn_create']            = 'Crea questa pagina';
+$lang['btn_search']            = 'Cerca';
+$lang['btn_save']              = 'Salva';
+$lang['btn_preview']           = 'Anteprima';
+$lang['btn_top']               = 'Torna su';
+$lang['btn_newer']             = '<< più recenti';
+$lang['btn_older']             = 'meno recenti >>';
+$lang['btn_revs']              = 'Revisioni precedenti';
+$lang['btn_recent']            = 'Ultime modifiche';
+$lang['btn_upload']            = 'Invia file';
+$lang['btn_cancel']            = 'Annulla';
+$lang['btn_index']             = 'Indice';
+$lang['btn_secedit']           = 'Modifica';
+$lang['btn_login']             = 'Entra';
+$lang['btn_logout']            = 'Esci';
+$lang['btn_admin']             = 'Amministrazione';
+$lang['btn_update']            = 'Aggiorna';
+$lang['btn_delete']            = 'Elimina';
+$lang['btn_back']              = 'Indietro';
+$lang['btn_backlink']          = 'Puntano qui';
+$lang['btn_subscribe']         = 'Sottoscrivi modifiche';
+$lang['btn_profile']           = 'Aggiorna profilo';
+$lang['btn_reset']             = 'Annulla';
+$lang['btn_resendpwd']         = 'Imposta nuova password';
+$lang['btn_draft']             = 'Modifica bozza';
+$lang['btn_recover']           = 'Ripristina bozza';
+$lang['btn_draftdel']          = 'Elimina bozza';
+$lang['btn_revert']            = 'Ripristina';
+$lang['btn_register']          = 'Registrazione';
+$lang['btn_apply']             = 'Applica';
+$lang['btn_media']             = 'Gestore Media';
+$lang['btn_deleteuser']        = 'Rimuovi il mio account';
+$lang['btn_img_backto']        = 'Torna a %s';
+$lang['btn_mediaManager']      = 'Guarda nel gestore media';
+$lang['loggedinas']            = 'Collegato come:';
+$lang['user']                  = 'Nome utente';
+$lang['pass']                  = 'Password';
+$lang['newpass']               = 'Nuova password';
+$lang['oldpass']               = 'Conferma password attuale';
+$lang['passchk']               = 'Ripeti password';
+$lang['remember']              = 'Memorizza nome utente e password';
+$lang['fullname']              = 'Nome completo';
+$lang['email']                 = 'Email';
+$lang['profile']               = 'Profilo utente';
+$lang['badlogin']              = 'Il nome utente o la password non sono validi.';
+$lang['badpassconfirm']        = 'La password è errata';
+$lang['minoredit']             = 'Modifiche minori';
+$lang['draftdate']             = 'Bozza salvata in automatico il';
+$lang['nosecedit']             = 'La pagina è stata modificata nel frattempo; è impossibile modificare solo la sezione scelta, quindi è stata caricata la pagina intera.';
+$lang['searchcreatepage']      = 'Se non hai trovato ciò che stavi cercando, puoi creare o modificare la pagina %s, nominata dopo la tua query.';
+$lang['search_fullresults']    = 'Risultati del testo integrale';
+$lang['js']['search_toggle_tools'] = 'Attiva o disattiva gli strumenti di ricerca';
+$lang['js']['willexpire']      = 'Il tuo blocco su questa pagina scadrà tra circa un minuto.\nPer evitare incongruenze usa il pulsante di anteprima per prolungare il periodo di blocco.';
+$lang['js']['notsavedyet']     = 'Le modifiche non salvate andranno perse.';
+$lang['js']['searchmedia']     = 'Cerca file';
+$lang['js']['keepopen']        = 'Tieni la finestra aperta durante la selezione';
+$lang['js']['hidedetails']     = 'Nascondi Dettagli';
+$lang['js']['mediatitle']      = 'Impostazioni link';
+$lang['js']['mediadisplay']    = 'Tipo link';
+$lang['js']['mediaalign']      = 'Allineamento';
+$lang['js']['mediasize']       = 'Dimensioni immagine';
+$lang['js']['mediatarget']     = 'Target del link';
+$lang['js']['mediaclose']      = 'Chiudi';
+$lang['js']['mediainsert']     = 'Inserisci';
+$lang['js']['mediadisplayimg'] = 'Mostra l\'immagine.';
+$lang['js']['mediadisplaylnk'] = 'Mostra solo il link.';
+$lang['js']['mediasmall']      = 'Versione piccola';
+$lang['js']['mediamedium']     = 'Versione media';
+$lang['js']['medialarge']      = 'Versione grande';
+$lang['js']['mediaoriginal']   = 'Versione originale';
+$lang['js']['medialnk']        = 'Link alla pagina dei dettagli';
+$lang['js']['mediadirect']     = 'Link all\'originale';
+$lang['js']['medianolnk']      = 'No link';
+$lang['js']['medianolink']     = 'Non linkare l\'immagine.';
+$lang['js']['medialeft']       = 'Allinea l\'immagine a sinistra.';
+$lang['js']['mediaright']      = 'Allinea l\'immagine a destra.';
+$lang['js']['mediacenter']     = 'Allinea l\'immagine al centro.';
+$lang['js']['medianoalign']    = 'Non allineare.';
+$lang['js']['nosmblinks']      = 'I collegamenti con le risorse condivise di Windows funzionano solo con Microsoft Internet Explorer.
+È comunque possibile copiare e incollare il collegamento.';
+$lang['js']['linkwiz']         = 'Collegamento guidato';
+$lang['js']['linkto']          = 'Collega a:';
+$lang['js']['del_confirm']     = 'Eliminare veramente questa voce?';
+$lang['js']['restore_confirm'] = 'Vuoi davvero ripristinare questa versione?';
+$lang['js']['media_diff']      = 'Guarda le differenze:';
+$lang['js']['media_diff_both'] = 'Fianco a Fianco';
+$lang['js']['media_diff_opacity'] = 'Trasparire';
+$lang['js']['media_diff_portions'] = 'rubare';
+$lang['js']['media_select']    = 'Seleziona files..';
+$lang['js']['media_upload_btn'] = 'Upload';
+$lang['js']['media_done_btn']  = 'Fatto';
+$lang['js']['media_drop']      = 'Sgancia i files qui per caricarli';
+$lang['js']['media_cancel']    = 'rimuovi';
+$lang['js']['media_overwrt']   = 'Sovrascrivi i file esistenti';
+$lang['search_exact_match']    = 'Corrispondenza esatta';
+$lang['search_starts_with']    = 'Comincia con';
+$lang['search_ends_with']      = 'Finisce con';
+$lang['search_contains']       = 'Contiene';
+$lang['search_custom_match']   = 'Personalizza';
+$lang['search_any_ns']         = 'Qualsiasi spazio dei nomi';
+$lang['search_any_time']       = 'Ogni volta';
+$lang['regmissing']            = 'Devi riempire tutti i campi.';
+$lang['reguexists']            = 'Il nome utente inserito esiste già.';
+$lang['regsuccess']            = 'L\'utente è stato creato. La password è stata spedita via email.';
+$lang['regsuccess2']           = 'L\'utente è stato creato.';
+$lang['regfail']               = 'L\'utente non può essere creato.';
+$lang['regmailfail']           = 'Sembra che ci sia stato un errore nell\'invio della email. Contatta l\'amministratore!';
+$lang['regbadmail']            = 'L\'indirizzo email fornito sembra essere non valido - se pensi che ci sia un errore contatta l\'amministratore';
+$lang['regbadpass']            = 'Le due password inserite non coincidono, prova di nuovo.';
+$lang['regpwmail']             = 'La tua password per DokuWiki';
+$lang['reghere']               = 'Non sei ancora registrato? Registrati qui.';
+$lang['profna']                = 'Questo wiki non supporta modifiche al profilo';
+$lang['profnochange']          = 'Nessuna modifica, niente da aggiornare.';
+$lang['profnoempty']           = 'Nome o indirizzo email vuoti non sono consentiti.';
+$lang['profchanged']           = 'Aggiornamento del profilo utente riuscito.';
+$lang['profnodelete']          = 'Questa wiki non supporta la cancellazione degli utenti';
+$lang['profdeleteuser']        = 'Elimina account';
+$lang['profdeleted']           = 'Il tuo account utente è stato rimosso da questa wiki';
+$lang['profconfdelete']        = 'Voglio rimuovere il mio account da questa wiki. <br/> Questa operazione non può essere annullata.';
+$lang['profconfdeletemissing'] = 'La check box di conferma non è selezionata';
+$lang['proffail']              = 'Il profilo utente non è stato aggiornato.';
+$lang['pwdforget']             = 'Hai dimenticato la password? Richiedine una nuova';
+$lang['resendna']              = 'Questo wiki non supporta l\'invio di nuove password.';
+$lang['resendpwd']             = 'Imposta nuova password per';
+$lang['resendpwdmissing']      = 'Devi riempire tutti i campi.';
+$lang['resendpwdnouser']       = 'Impossibile trovare questo utente nel database.';
+$lang['resendpwdbadauth']      = 'Spiacenti, questo codice di autorizzazione non è valido. Assicurati di aver usato il link completo di conferma.';
+$lang['resendpwdconfirm']      = 'Un link di conferma è stato spedito via email.';
+$lang['resendpwdsuccess']      = 'La nuova password è stata spedita via email.';
+$lang['license']               = 'Ad eccezione da dove è diversamente indicato, il contenuto di questo wiki è soggetto alla seguente licenza:';
+$lang['licenseok']             = 'Nota: modificando questa pagina accetti di rilasciare il contenuto sotto la seguente licenza:';
+$lang['searchmedia']           = 'Cerca file di nome:';
+$lang['searchmedia_in']        = 'Cerca in %s';
+$lang['txt_upload']            = 'Seleziona un file da caricare:';
+$lang['txt_filename']          = 'Carica come (opzionale):';
+$lang['txt_overwrt']           = 'Sovrascrivi file esistente';
+$lang['maxuploadsize']         = 'Upload max. %s per ogni file.';
+$lang['lockedby']              = 'Attualmente bloccato da:';
+$lang['lockexpire']            = 'Il blocco scade alle:';
+$lang['rssfailed']             = 'Si è verificato un errore cercando questo feed: ';
+$lang['nothingfound']          = 'Nessun risultato trovato.';
+$lang['mediaselect']           = 'Selezione dei file';
+$lang['uploadsucc']            = 'Invio riuscito';
+$lang['uploadfail']            = 'Invio fallito. È possibile che si tratti di un problema di permessi.';
+$lang['uploadwrong']           = 'Invio rifiutato. Questa estensione di file non è ammessa';
+$lang['uploadexist']           = 'Il file esiste già. Invio annullato.';
+$lang['uploadbadcontent']      = 'Il tipo di contenuto caricato non corrisponde all\'estensione del file %s.';
+$lang['uploadspam']            = 'Il caricamento è stato bloccato come spam perché presente nella lista nera.';
+$lang['uploadxss']             = 'Il caricamento è stato bloccato perchè il contenuto potrebbe essere un virus o presentare problemi di sicurezza.';
+$lang['uploadsize']            = 'Il file caricato è troppo grande. (massimo %s)';
+$lang['deletesucc']            = 'Il file "%s" è stato eliminato.';
+$lang['deletefail']            = '"%s" non può essere eliminato - verifica i permessi.';
+$lang['mediainuse']            = 'Il file "%s" non è stato eliminato - è ancora in uso.';
+$lang['namespaces']            = 'Categorie';
+$lang['mediafiles']            = 'File disponibili in';
+$lang['accessdenied']          = 'Non sei autorizzato a vedere questa pagina.';
+$lang['mediausage']            = 'Usa la seguente sintassi per riferirti a questo file:';
+$lang['mediaview']             = 'Mostra file originale';
+$lang['mediaroot']             = 'directory principale';
+$lang['mediaupload']           = 'Carica un file nella categoria attuale. Per creare sottocategorie, falle precedere dal nome del file nella casella "Carica come", separandole da due punti (:).';
+$lang['mediaextchange']        = 'Estensione del file modificata da .%s a .%s!';
+$lang['reference']             = 'Riferimenti a';
+$lang['ref_inuse']             = 'Il file non può essere eliminato in quanto è ancora utilizzato dalle seguenti pagine:';
+$lang['ref_hidden']            = 'Sono presenti alcuni riferimenti a pagine per le quali non hai i permessi di lettura';
+$lang['hits']                  = 'Occorrenze trovate';
+$lang['quickhits']             = 'Pagine trovate';
+$lang['toc']                   = 'Indice';
+$lang['current']               = 'versione attuale';
+$lang['yours']                 = 'la tua versione';
+$lang['diff']                  = 'differenze con la versione attuale';
+$lang['diff2']                 = 'differenze tra le versioni selezionate';
+$lang['difflink']              = 'Link a questa pagina di confronto';
+$lang['diff_type']             = 'Guarda le differenze:';
+$lang['diff_inline']           = 'In linea';
+$lang['diff_side']             = 'Fianco a Fianco';
+$lang['diffprevrev']           = 'Revisione precedente';
+$lang['diffnextrev']           = 'Prossima revisione';
+$lang['difflastrev']           = 'Ultima revisione';
+$lang['diffbothprevrev']       = 'Entrambe le parti precedenti la revisione';
+$lang['diffbothnextrev']       = 'Entrambe le parti successive la revisione';
+$lang['line']                  = 'Linea';
+$lang['breadcrumb']            = 'Traccia:';
+$lang['youarehere']            = 'Ti trovi qui:';
+$lang['lastmod']               = 'Ultima modifica:';
+$lang['by']                    = 'da';
+$lang['deleted']               = 'eliminata';
+$lang['created']               = 'creata';
+$lang['restored']              = 'versione precedente ripristinata (%s)';
+$lang['external_edit']         = 'modifica esterna';
+$lang['summary']               = 'Oggetto della modifica';
+$lang['noflash']               = 'E\' necessario <a href="http://www.adobe.com/products/flashplayer/">il plugin Adobe Flash</a> per visualizzare questo contenuto.';
+$lang['download']              = 'Scarica lo "snippet"';
+$lang['tools']                 = 'Strumenti';
+$lang['user_tools']            = 'Strumenti Utente';
+$lang['site_tools']            = 'Strumenti Sito';
+$lang['page_tools']            = 'Strumenti Pagina';
+$lang['skip_to_content']       = 'salta al contenuto';
+$lang['sidebar']               = 'Barra laterale';
+$lang['mail_newpage']          = 'pagina aggiunta:';
+$lang['mail_changed']          = 'pagina modificata:';
+$lang['mail_subscribe_list']   = 'pagine modificate nella categoria:';
+$lang['mail_new_user']         = 'nuovo utente:';
+$lang['mail_upload']           = 'file caricato:';
+$lang['changes_type']          = 'Guarda cambiamenti di';
+$lang['pages_changes']         = 'Pagine';
+$lang['media_changes']         = 'File multimediali';
+$lang['both_changes']          = 'Sia pagine che media files';
+$lang['qb_bold']               = 'Grassetto';
+$lang['qb_italic']             = 'Corsivo';
+$lang['qb_underl']             = 'Sottolineato';
+$lang['qb_code']               = 'Codice';
+$lang['qb_strike']             = 'Barrato';
+$lang['qb_h1']                 = 'Intestazione di livello 1';
+$lang['qb_h2']                 = 'Intestazione di livello 2';
+$lang['qb_h3']                 = 'Intestazione di livello 3';
+$lang['qb_h4']                 = 'Intestazione di livello 4';
+$lang['qb_h5']                 = 'Intestazione di livello 5';
+$lang['qb_h']                  = 'Titolo';
+$lang['qb_hs']                 = 'Seleziona il titolo';
+$lang['qb_hplus']              = 'Titolo superiore';
+$lang['qb_hminus']             = 'Titolo inferiore';
+$lang['qb_hequal']             = 'Titolo dello stesso livello';
+$lang['qb_link']               = 'Collegamento interno';
+$lang['qb_extlink']            = 'Collegamento esterno';
+$lang['qb_hr']                 = 'Riga orizzontale';
+$lang['qb_ol']                 = 'Elenco numerato';
+$lang['qb_ul']                 = 'Elenco puntato';
+$lang['qb_media']              = 'Inserisci immagini o altri file';
+$lang['qb_sig']                = 'Inserisci la firma';
+$lang['qb_smileys']            = 'Smiley';
+$lang['qb_chars']              = 'Caratteri speciali';
+$lang['upperns']               = 'vai alla categoria principale';
+$lang['metaedit']              = 'Modifica metadati';
+$lang['metasaveerr']           = 'Scrittura metadati fallita';
+$lang['metasaveok']            = 'Metadati salvati';
+$lang['img_title']             = 'Titolo:';
+$lang['img_caption']           = 'Descrizione:';
+$lang['img_date']              = 'Data:';
+$lang['img_fname']             = 'Nome File:';
+$lang['img_fsize']             = 'Dimensione:';
+$lang['img_artist']            = 'Autore:';
+$lang['img_copyr']             = 'Copyright:';
+$lang['img_format']            = 'Formato:';
+$lang['img_camera']            = 'Camera:';
+$lang['img_keywords']          = 'Parole chiave:';
+$lang['img_width']             = 'Larghezza:';
+$lang['img_height']            = 'Altezza:';
+$lang['subscr_subscribe_success'] = 'Aggiunto %s alla lista di sottoscrizioni %s';
+$lang['subscr_subscribe_error'] = 'Impossibile aggiungere %s alla lista di sottoscrizioni %s';
+$lang['subscr_subscribe_noaddress'] = 'Non esiste alcun indirizzo associato al tuo account, non puoi essere aggiunto alla lista di sottoscrizioni';
+$lang['subscr_unsubscribe_success'] = 'Rimosso %s dalla lista di sottoscrizioni %s';
+$lang['subscr_unsubscribe_error'] = 'Impossibile rimuovere %s dalla lista di sottoscrizioni %s';
+$lang['subscr_already_subscribed'] = '%s è già iscritto a %s';
+$lang['subscr_not_subscribed'] = '%s non è iscritto a %s';
+$lang['subscr_m_not_subscribed'] = 'Attualmente non sei iscritto alla pagina o categoria corrente';
+$lang['subscr_m_new_header']   = 'Aggiungi sottoscrizione';
+$lang['subscr_m_current_header'] = 'Sottoscrizioni attuali';
+$lang['subscr_m_unsubscribe']  = 'Rimuovi sottoscrizione';
+$lang['subscr_m_subscribe']    = 'Sottoscrivi';
+$lang['subscr_m_receive']      = 'Ricevi';
+$lang['subscr_style_every']    = 'email per ogni modifica';
+$lang['subscr_style_digest']   = 'email di riassunto dei cambiamenti per ogni pagina (ogni %.2f giorni)';
+$lang['subscr_style_list']     = 'lista delle pagine cambiate dall\'ultima email (ogni %.2f giorni)';
+$lang['authtempfail']          = 'L\'autenticazione è temporaneamente non disponibile. Se questa situazione persiste, informa l\'amministratore di questo wiki.';
+$lang['i_chooselang']          = 'Scegli la lingua';
+$lang['i_installer']           = 'Installazione di DokuWiki';
+$lang['i_wikiname']            = 'Nome Wiki';
+$lang['i_enableacl']           = 'Abilita ACL (consigliato)';
+$lang['i_superuser']           = 'Amministratore';
+$lang['i_problems']            = 'Si sono verificati problemi durante l\'installazione, indicati di seguito. Non è possibile continuare finché non saranno risolti.';
+$lang['i_modified']            = 'Per motivi di sicurezza questa procedura funziona solamente con un\'installazione Dokuwiki nuova e non modificata.
+Prova a estrarre di nuovo i file dal pacchetto scaricato oppure consulta le
+<a href="http://dokuwiki.org/install">istruzioni per l\'installazione di Dokuwiki</a>';
+$lang['i_funcna']              = 'La funzione PHP <code>%s</code> non è disponibile. Forse è stata disabilitata dal tuo provider per qualche motivo?';
+$lang['i_phpver']              = 'La versione di PHP <code>%s</code> è inferiore a quella richiesta <code>%s</code>. Devi aggiornare l\'installazione di PHP.';
+$lang['i_mbfuncoverload']      = 'mbstring.func_overload deve essere disabilitato in php.ini per eseguire DokuWiki.';
+$lang['i_permfail']            = 'DokuWiki non può scrivere <code>%s</code>. E\' necessario correggere i permessi per questa directory!';
+$lang['i_confexists']          = '<code>%s</code> esiste già';
+$lang['i_writeerr']            = 'Impossibile creare <code>%s</code>. E\' necessario verificare i permessi della directory o del file oppure creare il file manualmente.';
+$lang['i_badhash']             = 'dokuwiki.php (hash=<code>%s</code>) non riconosciuto o modificato';
+$lang['i_badval']              = '<code>%s</code> - valore vuoto o non valido';
+$lang['i_success']             = 'La configurazione è stata completata correttamente. Ora è possibile eliminare il file install.php. Poi, visita <a href="doku.php?id=wiki:welcome">il tuo nuovo DokuWiki</a>.';
+$lang['i_failure']             = 'Si sono verificati errori durante la scrittura dei file di configurazione. Potrebbe essere necessario correggerli manualmente prima di poter utilizzare <a href="doku.php?id=wiki:welcome">il tuo nuovo DokuWiki</a>.';
+$lang['i_policy']              = 'Regole di accesso iniziali';
+$lang['i_pol0']                = 'Wiki Aperto (lettura, scrittura, caricamento file per tutti)';
+$lang['i_pol1']                = 'Wiki Pubblico (lettura per tutti, scrittura e caricamento file per gli utenti registrati)';
+$lang['i_pol2']                = 'Wiki Chiuso (lettura, scrittura, caricamento file solamente per gli utenti registrati)';
+$lang['i_allowreg']            = 'Permetti agli utenti di registrarsi';
+$lang['i_retry']               = 'Riprova';
+$lang['i_license']             = 'Per favore scegli la licenza sotto cui vuoi rilasciare il contenuto:';
+$lang['i_license_none']        = 'Non mostrare informazioni sulla licenza';
+$lang['i_pop_field']           = 'Per favore, aiutaci ad incrementare la conoscenza di DokuWiki:';
+$lang['i_pop_label']           = 'Mensilmente invia una statistica d\'uso anonima di DokuWiki agli sviluppatori';
+$lang['recent_global']         = 'Stai attualmente vedendo le modifiche effettuate nell\'area <b>%s</b>. Puoi anche <a href="%s">vedere le modifiche recenti dell\'intero wiki</a>.';
+$lang['years']                 = '%d anni fa';
+$lang['months']                = '%d mesi fa';
+$lang['weeks']                 = '%d settimane fa';
+$lang['days']                  = '%d giorni fa';
+$lang['hours']                 = '%d ore fa';
+$lang['minutes']               = '%d minuti fa';
+$lang['seconds']               = '%d secondi fa';
+$lang['wordblock']             = 'La modifica non è stata salvata perché contiene testo bloccato (spam).';
+$lang['media_uploadtab']       = 'Upload';
+$lang['media_searchtab']       = 'Cerca';
+$lang['media_file']            = 'File';
+$lang['media_viewtab']         = 'Guarda';
+$lang['media_edittab']         = 'Modifica';
+$lang['media_historytab']      = 'Storia';
+$lang['media_list_thumbs']     = 'Miniatura';
+$lang['media_list_rows']       = 'Righe';
+$lang['media_sort_name']       = 'Nome';
+$lang['media_sort_date']       = 'Data';
+$lang['media_namespaces']      = 'Scegli il namespace';
+$lang['media_files']           = 'File in %s';
+$lang['media_upload']          = 'Upload al %s';
+$lang['media_search']          = 'Cerca in %s';
+$lang['media_view']            = '%s';
+$lang['media_viewold']         = '%s a %s';
+$lang['media_edit']            = 'Modifica %s';
+$lang['media_history']         = 'Storia di %s';
+$lang['media_meta_edited']     = 'metadata modificati';
+$lang['media_perm_read']       = 'Spiacente, non hai abbastanza privilegi per leggere i files.';
+$lang['media_perm_upload']     = 'Spiacente, non hai abbastanza privilegi per caricare files.';
+$lang['media_update']          = 'Carica nuova versione';
+$lang['media_restore']         = 'Ripristina questa versione';
+$lang['media_acl_warning']     = 'Questa lista potrebbe non essere completa a causa di restrizioni ACL e pagine nascoste.';
+$lang['currentns']             = 'Namespace corrente';
+$lang['searchresult']          = 'Risultati della ricerca';
+$lang['plainhtml']             = 'HTML';
+$lang['wikimarkup']            = 'Marcatura wiki';
+$lang['page_nonexist_rev']     = 'Pagina non esistente a %s. E\' stata creata successivamente a <a href="%s">%s</a>.';
+$lang['unable_to_parse_date']  = 'Impossibile eseguire l\'analisi al parametro "%s".';
+$lang['email_signature_text']  = 'Questa email è stata generata dal DokuWiki all\'indirizzo
+@DOKUWIKIURL@';
diff --git a/wiki/inc/lang/it/locked.txt b/wiki/inc/lang/it/locked.txt
new file mode 100644
index 0000000..a655ffc
--- /dev/null
+++ b/wiki/inc/lang/it/locked.txt
@@ -0,0 +1,3 @@
+====== Pagina bloccata ======
+
+Questa pagina è attualmente bloccata poiché un altro utente sta effettuando delle modifiche. Devi attendere che l'utente concluda le modifiche o che il blocco scada.
diff --git a/wiki/inc/lang/it/login.txt b/wiki/inc/lang/it/login.txt
new file mode 100644
index 0000000..c6fd97b
--- /dev/null
+++ b/wiki/inc/lang/it/login.txt
@@ -0,0 +1,4 @@
+====== Accesso ======
+
+Non sei ancora collegato! Inserisci il tuo nome utente e la tua password per autenticarti. E' necessario che il tuo browser abbia i cookie abilitati.
+
diff --git a/wiki/inc/lang/it/mailtext.txt b/wiki/inc/lang/it/mailtext.txt
new file mode 100644
index 0000000..3374d37
--- /dev/null
+++ b/wiki/inc/lang/it/mailtext.txt
@@ -0,0 +1,12 @@
+Una pagina su DokuWiki è stata aggiunta o modificata. Questi sono i dettagli:
+
+Data : @DATE@
+Browser : @BROWSER@
+Indirizzo IP : @IPADDRESS@
+Nome host : @HOSTNAME@
+Vecchia revisione : @OLDPAGE@
+Nuova revisione : @NEWPAGE@
+Oggetto della modifica : @SUMMARY@
+Utente : @USER@
+
+@DIFF@
diff --git a/wiki/inc/lang/it/mailwrap.html b/wiki/inc/lang/it/mailwrap.html
new file mode 100644
index 0000000..d257190
--- /dev/null
+++ b/wiki/inc/lang/it/mailwrap.html
@@ -0,0 +1,13 @@
+<html>
+<head>
+<title>@TITLE@</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+</head>
+<body>
+
+@HTMLBODY@
+
+<br /><hr />
+<small>@EMAILSIGNATURE@</small>
+</body>
+</html>
\ No newline at end of file
diff --git a/wiki/inc/lang/it/newpage.txt b/wiki/inc/lang/it/newpage.txt
new file mode 100644
index 0000000..d41601c
--- /dev/null
+++ b/wiki/inc/lang/it/newpage.txt
@@ -0,0 +1,3 @@
+====== Questo argomento non esiste ancora ======
+
+Hai seguito un collegamento ad un argomento che non è ancora stato creato. Se vuoi puoi crearlo tu stesso usando il pulsante ''Crea questa pagina''.
diff --git a/wiki/inc/lang/it/norev.txt b/wiki/inc/lang/it/norev.txt
new file mode 100644
index 0000000..91ef751
--- /dev/null
+++ b/wiki/inc/lang/it/norev.txt
@@ -0,0 +1,3 @@
+====== Revisione inesistente ======
+
+La revisione richiesta non esiste. Usa il pulsante ''Revisioni precedenti'' per ottenere una lista di revisioni precedenti di questo documento.
diff --git a/wiki/inc/lang/it/password.txt b/wiki/inc/lang/it/password.txt
new file mode 100644
index 0000000..f7ca9e9
--- /dev/null
+++ b/wiki/inc/lang/it/password.txt
@@ -0,0 +1,6 @@
+Ciao @FULLNAME@!
+
+Questi sono i tuoi dati di accesso per @TITLE@ su @DOKUWIKIURL@
+
+Nome utente : @LOGIN@
+Password    : @PASSWORD@
diff --git a/wiki/inc/lang/it/preview.txt b/wiki/inc/lang/it/preview.txt
new file mode 100644
index 0000000..c3cf352
--- /dev/null
+++ b/wiki/inc/lang/it/preview.txt
@@ -0,0 +1,5 @@
+====== Anteprima ======
+
+Questa è un'anteprima di come apparirà il tuo testo. Attenzione: **la pagina non è ancora stata salvata**!.
+
+
diff --git a/wiki/inc/lang/it/pwconfirm.txt b/wiki/inc/lang/it/pwconfirm.txt
new file mode 100644
index 0000000..3eb36fb
--- /dev/null
+++ b/wiki/inc/lang/it/pwconfirm.txt
@@ -0,0 +1,11 @@
+Ciao @FULLNAME@!
+
+Qualcuno ha richiesto una nuova password per il tuo accesso
+@TITLE@ a @DOKUWIKIURL@
+
+Se non hai richiesto tu la nuova password ignora questa email.
+
+Per confermare che la richiesta è stata realmente inviata da te usa il
+seguente collegamento.
+
+@CONFIRM@
diff --git a/wiki/inc/lang/it/read.txt b/wiki/inc/lang/it/read.txt
new file mode 100644
index 0000000..0a72454
--- /dev/null
+++ b/wiki/inc/lang/it/read.txt
@@ -0,0 +1 @@
+Questa pagina è in sola lettura. Puoi visualizzare il sorgente, ma non puoi modificarlo. Contatta l'amministratore se pensi che ci sia un errore.
diff --git a/wiki/inc/lang/it/recent.txt b/wiki/inc/lang/it/recent.txt
new file mode 100644
index 0000000..4c29a9d
--- /dev/null
+++ b/wiki/inc/lang/it/recent.txt
@@ -0,0 +1,4 @@
+====== Ultime modifiche ======
+
+Queste sono le ultime pagine modificate.
+
diff --git a/wiki/inc/lang/it/register.txt b/wiki/inc/lang/it/register.txt
new file mode 100644
index 0000000..5a336a9
--- /dev/null
+++ b/wiki/inc/lang/it/register.txt
@@ -0,0 +1,3 @@
+====== Registrazione nuovo utente ======
+
+Riempi tutte le informazioni seguenti per creare un nuovo account in questo wiki.  Assicurati di inserire un **indirizzo email valido** - a meno che tu non l'abbia già inserita qui, la password ti sarà inviata con un messaggio di posta elettronica. Il nome utente deve soddisfare i criteri per i [[doku>pagename|nomi delle pagine]].
\ No newline at end of file
diff --git a/wiki/inc/lang/it/registermail.txt b/wiki/inc/lang/it/registermail.txt
new file mode 100644
index 0000000..77454cd
--- /dev/null
+++ b/wiki/inc/lang/it/registermail.txt
@@ -0,0 +1,10 @@
+Un nuovo utente è stato registrato. Ecco i dettagli:
+
+Nome utente   : @NEWUSER@
+Nome completo : @NEWNAME@
+EMail        : @NEWEMAIL@
+
+Data : @DATE@
+Browser : @BROWSER@
+Indirizzo IP : @IPADDRESS@
+Nome host : @HOSTNAME@
diff --git a/wiki/inc/lang/it/resendpwd.txt b/wiki/inc/lang/it/resendpwd.txt
new file mode 100644
index 0000000..54604d7
--- /dev/null
+++ b/wiki/inc/lang/it/resendpwd.txt
@@ -0,0 +1,3 @@
+====== Invia nuova password ======
+
+Inserisci tutte le informazioni per ottenere una nuova password per il tuo account su questo wiki. La nuova password sarà inviata al tuo indirizzo di posta elettronica registrato. Il nome utente deve essere il tuo nome utente in questo wiki.
diff --git a/wiki/inc/lang/it/resetpwd.txt b/wiki/inc/lang/it/resetpwd.txt
new file mode 100644
index 0000000..450dd83
--- /dev/null
+++ b/wiki/inc/lang/it/resetpwd.txt
@@ -0,0 +1 @@
+Inserisci perfavore una nuova password per il tuo account su questo wiki.
\ No newline at end of file
diff --git a/wiki/inc/lang/it/revisions.txt b/wiki/inc/lang/it/revisions.txt
new file mode 100644
index 0000000..19c501b
--- /dev/null
+++ b/wiki/inc/lang/it/revisions.txt
@@ -0,0 +1,3 @@
+====== Versione precedente ======
+
+Queste sono le versioni precedenti del documento attuale. Per ripristinare una versione precedente, seleziona la versione, modificala usando il pulsante ''Modifica questa pagina'' e salvala.
diff --git a/wiki/inc/lang/it/searchpage.txt b/wiki/inc/lang/it/searchpage.txt
new file mode 100644
index 0000000..e997ebd
--- /dev/null
+++ b/wiki/inc/lang/it/searchpage.txt
@@ -0,0 +1,4 @@
+====== Cerca ======
+
+Questi sono i risultati della ricerca. @CREATEPAGEINFO@
+
diff --git a/wiki/inc/lang/it/showrev.txt b/wiki/inc/lang/it/showrev.txt
new file mode 100644
index 0000000..7c184f2
--- /dev/null
+++ b/wiki/inc/lang/it/showrev.txt
@@ -0,0 +1,2 @@
+**Questa è una vecchia versione del documento!**
+----
diff --git a/wiki/inc/lang/it/stopwords.txt b/wiki/inc/lang/it/stopwords.txt
new file mode 100644
index 0000000..e91aa3b
--- /dev/null
+++ b/wiki/inc/lang/it/stopwords.txt
@@ -0,0 +1,119 @@
+# Questo è un elenco di parole che l'indicizzatore ignora, una parola per riga
+# Quando modifichi questo file fai attenzione ad usare la chiusura della riga in stile UNIX (nuova linea singola)
+# Non è necessario includere parole più brevi di 3 caratteri - queste vengono in ogni caso ignorate
+# Questo elenco è basato su quello trovato in http://www.ranks.nl/stopwords/
+adesso
+alla
+allo
+allora
+altre
+altri
+altro
+anche
+ancora
+avere
+aveva
+avevano
+ben
+buono
+che
+chi
+cinque
+comprare
+con
+consecutivi
+consecutivo
+cosa
+cui
+del
+della
+dello
+dentro
+deve
+devo
+doppio
+due
+ecco
+fare
+fine
+fino
+fra
+gente
+giu
+hai
+hanno
+indietro
+invece
+lavoro
+lei
+loro
+lui
+lungo
+meglio
+molta
+molti
+molto
+nei
+nella
+noi
+nome
+nostro
+nove
+nuovi
+nuovo
+oltre
+ora
+otto
+peggio
+pero
+persone
+piu
+poco
+primo
+promesso
+qua
+quarto
+quasi
+quattro
+quello
+questo
+qui
+quindi
+quinto
+rispetto
+sara
+secondo
+sei
+sembra
+sembrava
+senza
+sette
+sia
+siamo
+siete
+solo
+sono
+sopra
+soprattutto
+sotto
+stati
+stato
+stesso
+su
+subito
+sul
+sulla
+tanto
+tempo
+terzo
+tra
+tre
+triplo
+ultimo
+una
+uno
+va
+vai
+voi
+volte
+vostro
diff --git a/wiki/inc/lang/it/subscr_digest.txt b/wiki/inc/lang/it/subscr_digest.txt
new file mode 100644
index 0000000..29fd4bc
--- /dev/null
+++ b/wiki/inc/lang/it/subscr_digest.txt
@@ -0,0 +1,16 @@
+Ciao!
+
+La pagina @PAGE@ nel wiki @TITLE@ è cambiata.
+Queste sono le modifiche:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Vecchia revisione: @OLDPAGE@
+Nuova revisione: @NEWPAGE@
+
+Per non ricevere più queste notifiche collegati al
+wiki @DOKUWIKIURL@ e poi visita @SUBSCRIBE@
+e rimuovi la sottoscrizione alle modifiche delle
+pagine e/o categorie.
diff --git a/wiki/inc/lang/it/subscr_form.txt b/wiki/inc/lang/it/subscr_form.txt
new file mode 100644
index 0000000..54f66e4
--- /dev/null
+++ b/wiki/inc/lang/it/subscr_form.txt
@@ -0,0 +1,3 @@
+====== Gestione iscrizioni ======
+
+Questa pagina permette di gestire le tue iscrizioni alla pagina e catogoria attuale.
\ No newline at end of file
diff --git a/wiki/inc/lang/it/subscr_list.txt b/wiki/inc/lang/it/subscr_list.txt
new file mode 100644
index 0000000..f870388
--- /dev/null
+++ b/wiki/inc/lang/it/subscr_list.txt
@@ -0,0 +1,14 @@
+Ciao!
+
+Le pagine nella categoria @PAGE@ del wiki @TITLE@ sono
+cambiate.
+Queste sono le pagine modificate:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Per non ricevere più queste notifiche collegati al
+wiki @DOKUWIKIURL@ e poi visita @SUBSCRIBE@
+e rimuovi la sottoscrizione alle modifiche delle
+pagine e/o categorie.
diff --git a/wiki/inc/lang/it/subscr_single.txt b/wiki/inc/lang/it/subscr_single.txt
new file mode 100644
index 0000000..421a156
--- /dev/null
+++ b/wiki/inc/lang/it/subscr_single.txt
@@ -0,0 +1,20 @@
+Ciao!
+
+La pagina @PAGE@ nel wiki @TITLE@ è cambiata.
+Queste sono le modifiche:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Data : @DATE@
+Utente : @USER@
+Sommario modifica: @SUMMARY@
+Vecchia revisione: @OLDPAGE@
+Nuova revisione: @NEWPAGE@
+
+Per non ricevere più queste notifiche, collegati al
+wiki all'indirizzo @DOKUWIKIURL@ e poi visita
+@SUBSCRIBE@
+e rimuovi la sottoscrizione alle modifiche della
+pagina o categoria.
diff --git a/wiki/inc/lang/it/updateprofile.txt b/wiki/inc/lang/it/updateprofile.txt
new file mode 100644
index 0000000..71157a2
--- /dev/null
+++ b/wiki/inc/lang/it/updateprofile.txt
@@ -0,0 +1,3 @@
+====== Aggiorna il profilo del tuo account ======
+
+E' necessario compilare solo i campi che desideri modificare. Non puoi cambiare il tuo nome utente.
diff --git a/wiki/inc/lang/it/uploadmail.txt b/wiki/inc/lang/it/uploadmail.txt
new file mode 100644
index 0000000..4dd7cd4
--- /dev/null
+++ b/wiki/inc/lang/it/uploadmail.txt
@@ -0,0 +1,10 @@
+Un file è stato caricato sul tuo DokuWiki. Seguono i dettagli:
+
+File : @MEDIA@
+Data : @DATE@
+Browser : @BROWSER@
+Indirizzo IP : @IPADDRESS@
+Hostname : @HOSTNAME@
+Dimensione : @SIZE@
+Tipo MIME : @MIME@
+Utente : @USER@
diff --git a/wiki/inc/lang/ja/admin.txt b/wiki/inc/lang/ja/admin.txt
new file mode 100644
index 0000000..b0c6d34
--- /dev/null
+++ b/wiki/inc/lang/ja/admin.txt
@@ -0,0 +1,4 @@
+====== 管理者メニュー ======
+
+DokuWikiで管理できるタスクの一覧です
+
diff --git a/wiki/inc/lang/ja/adminplugins.txt b/wiki/inc/lang/ja/adminplugins.txt
new file mode 100644
index 0000000..1708bbb
--- /dev/null
+++ b/wiki/inc/lang/ja/adminplugins.txt
@@ -0,0 +1 @@
+===== 追加プラグイン =====
\ No newline at end of file
diff --git a/wiki/inc/lang/ja/backlinks.txt b/wiki/inc/lang/ja/backlinks.txt
new file mode 100644
index 0000000..69644b7
--- /dev/null
+++ b/wiki/inc/lang/ja/backlinks.txt
@@ -0,0 +1,4 @@
+====== バックリンク ======
+
+先ほどの文書にリンクしている文書のリストです。
+
diff --git a/wiki/inc/lang/ja/conflict.txt b/wiki/inc/lang/ja/conflict.txt
new file mode 100644
index 0000000..099b598
--- /dev/null
+++ b/wiki/inc/lang/ja/conflict.txt
@@ -0,0 +1,6 @@
+====== 新しいバージョンが存在します ======
+
+編集中に他のユーザーがこの文書を更新したため、新しいバージョンの文書が存在します。
+
+以下に文書間の差分を表示するので、どちらかの文書を選択してください。''保存'' を選択すると現在編集中の文書が保存されます。''キャンセル'' は編集中の文書が破棄されます。
+
diff --git a/wiki/inc/lang/ja/denied.txt b/wiki/inc/lang/ja/denied.txt
new file mode 100644
index 0000000..98ccb2f
--- /dev/null
+++ b/wiki/inc/lang/ja/denied.txt
@@ -0,0 +1,4 @@
+====== アクセスが拒否されました ======
+
+実行する権限がありません。
+
diff --git a/wiki/inc/lang/ja/diff.txt b/wiki/inc/lang/ja/diff.txt
new file mode 100644
index 0000000..fe5f6b1
--- /dev/null
+++ b/wiki/inc/lang/ja/diff.txt
@@ -0,0 +1,4 @@
+====== 差分 ======
+
+この文書の現在のバージョンと選択したバージョンの差分を表示します。
+
diff --git a/wiki/inc/lang/ja/draft.txt b/wiki/inc/lang/ja/draft.txt
new file mode 100644
index 0000000..af3160b
--- /dev/null
+++ b/wiki/inc/lang/ja/draft.txt
@@ -0,0 +1,6 @@
+====== ドラフトファイルが存在します ======
+
+このページに対する最後の編集は正しく終了されませんでした。 その編集作業を引き続き行えるよう、以下に示す内容が自動的に保存されています。
+
+この自動的に保存された編集内容に対して、//復元する//、//削除する//、 もしくはこのページの編集を//キャンセル//して下さい。
+
diff --git a/wiki/inc/lang/ja/edit.txt b/wiki/inc/lang/ja/edit.txt
new file mode 100644
index 0000000..e7a8f97
--- /dev/null
+++ b/wiki/inc/lang/ja/edit.txt
@@ -0,0 +1,4 @@
+編集して''保存''をクリックしてください。Wikiの構文については [[wiki:syntax]] を参考にしてください
+
+当然のことですが、この文書の質を **向上** させる場合のみ編集してください。もし編集方法や構文を練習したいのであれば [[playground:playground]] を利用してください。
+
diff --git a/wiki/inc/lang/ja/editrev.txt b/wiki/inc/lang/ja/editrev.txt
new file mode 100644
index 0000000..7c98413
--- /dev/null
+++ b/wiki/inc/lang/ja/editrev.txt
@@ -0,0 +1,2 @@
+**古いリビジョンの文書を開いています** もしこのまま保存すると、この文書が最新となります。
+----
diff --git a/wiki/inc/lang/ja/index.txt b/wiki/inc/lang/ja/index.txt
new file mode 100644
index 0000000..eb168d1
--- /dev/null
+++ b/wiki/inc/lang/ja/index.txt
@@ -0,0 +1,4 @@
+====== サイトマップ ======
+
+全ての閲覧可能ページを[[doku>ja:namespaces|名前空間]]順に並べたサイトマップです。
+
diff --git a/wiki/inc/lang/ja/install.html b/wiki/inc/lang/ja/install.html
new file mode 100644
index 0000000..3a1d0d4
--- /dev/null
+++ b/wiki/inc/lang/ja/install.html
@@ -0,0 +1,14 @@
+<p>このページは、<a href="http://dokuwiki.org">Dokuwiki</a>のインストールと初期設定をサポートします。
+このインストーラーに関する詳細は <a href="http://dokuwiki.org/installer">documentation page</a> を参考にしてください。</p>
+
+<p>DokuWikiは、通常のファイルにWikiページの内容と関連する情報(例えば、画像、検索インデックス、古いリビジョンなど)を保存します。
+そのため、DokuWikiを使用するためには、それらのファイルを保存するディレクトリに書き込みの権限が<strong>必ず</strong>必要となります。
+このインストーラーではディレクトリの権限の変更は行えないため、コマンドシェルで権限の変更を直接行うか、
+ホスティングサービスを利用している場合はそのコントロールパネルもしくはFTPを通して、権限の変更を行ってください。</p>
+
+<p>DokuWikiは、プラグイン、ユーザー、Wikiページへのアクセス制限、設定の変更を管理する機能を有しており、
+その機能を有効にするために必要な <abbr title="access control list">ACL</abbr> の設定が、このインストーラーによって行われます。
+この管理機能は、DokuWikiを使用する上で必要ではありませんが、DokuWikiの管理を簡単にしてくれます。</p>
+
+<p>従来のバージョンを使用しているユーザーや特別なセットアップが必要な場合は、次のリンク先を参考にして下さい
+(<a href="http://dokuwiki.org/install">installation instructions</a>, <a href="http://dokuwiki.org/config">configuration settings</a>)。</p>
diff --git a/wiki/inc/lang/ja/jquery.ui.datepicker.js b/wiki/inc/lang/ja/jquery.ui.datepicker.js
new file mode 100644
index 0000000..52b1058
--- /dev/null
+++ b/wiki/inc/lang/ja/jquery.ui.datepicker.js
@@ -0,0 +1,37 @@
+/* Japanese initialisation for the jQuery UI date picker plugin. */
+/* Written by Kentaro SATO (kentaro@ranvis.com). */
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "../widgets/datepicker" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery.datepicker );
+	}
+}( function( datepicker ) {
+
+datepicker.regional.ja = {
+	closeText: "閉じる",
+	prevText: "&#x3C;前",
+	nextText: "次&#x3E;",
+	currentText: "今日",
+	monthNames: [ "1月","2月","3月","4月","5月","6月",
+	"7月","8月","9月","10月","11月","12月" ],
+	monthNamesShort: [ "1月","2月","3月","4月","5月","6月",
+	"7月","8月","9月","10月","11月","12月" ],
+	dayNames: [ "日曜日","月曜日","火曜日","水曜日","木曜日","金曜日","土曜日" ],
+	dayNamesShort: [ "日","月","火","水","木","金","土" ],
+	dayNamesMin: [ "日","月","火","水","木","金","土" ],
+	weekHeader: "週",
+	dateFormat: "yy/mm/dd",
+	firstDay: 0,
+	isRTL: false,
+	showMonthAfterYear: true,
+	yearSuffix: "年" };
+datepicker.setDefaults( datepicker.regional.ja );
+
+return datepicker.regional.ja;
+
+} ) );
diff --git a/wiki/inc/lang/ja/lang.php b/wiki/inc/lang/ja/lang.php
new file mode 100644
index 0000000..5f21a7e
--- /dev/null
+++ b/wiki/inc/lang/ja/lang.php
@@ -0,0 +1,348 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Yuji Takenaka <webmaster@davilin.com>
+ * @author Ikuo Obataya <i.obataya@gmail.com>
+ * @author Daniel Dupriest <kououken@gmail.com>
+ * @author Kazutaka Miyasaka <kazmiya@gmail.com>
+ * @author Taisuke Shimamoto <dentostar@gmail.com>
+ * @author Satoshi Sahara <sahara.satoshi@gmail.com>
+ * @author Hideaki SAWADA <chuno@live.jp>
+ * @author Hideaki SAWADA <sawadakun@live.jp>
+ * @author PzF_X <jp_minecraft@yahoo.co.jp>
+ */
+$lang['encoding']              = 'utf-8';
+$lang['direction']             = 'ltr';
+$lang['doublequoteopening']    = '“';
+$lang['doublequoteclosing']    = '”';
+$lang['singlequoteopening']    = '‘';
+$lang['singlequoteclosing']    = '’';
+$lang['apostrophe']            = '’';
+$lang['btn_edit']              = '文書の編集';
+$lang['btn_source']            = 'ソースの表示';
+$lang['btn_show']              = '文書の表示';
+$lang['btn_create']            = '文書の作成';
+$lang['btn_search']            = '検索';
+$lang['btn_save']              = '保存';
+$lang['btn_preview']           = 'プレビュー';
+$lang['btn_top']               = '文書の先頭へ';
+$lang['btn_newer']             = '<< より新しい';
+$lang['btn_older']             = 'より古い >>';
+$lang['btn_revs']              = '以前のリビジョン';
+$lang['btn_recent']            = '最近の変更';
+$lang['btn_upload']            = 'アップロード';
+$lang['btn_cancel']            = 'キャンセル';
+$lang['btn_index']             = 'サイトマップ';
+$lang['btn_secedit']           = '編集';
+$lang['btn_login']             = 'ログイン';
+$lang['btn_logout']            = 'ログアウト';
+$lang['btn_admin']             = '管理';
+$lang['btn_update']            = '更新';
+$lang['btn_delete']            = '削除';
+$lang['btn_back']              = '戻る';
+$lang['btn_backlink']          = 'バックリンク';
+$lang['btn_subscribe']         = '変更履歴配信の登録';
+$lang['btn_profile']           = 'ユーザー情報の更新';
+$lang['btn_reset']             = 'リセット';
+$lang['btn_resendpwd']         = '新しいパスワードをセット';
+$lang['btn_draft']             = 'ドラフトを編集';
+$lang['btn_recover']           = 'ドラフトを復元';
+$lang['btn_draftdel']          = 'ドラフトを削除';
+$lang['btn_revert']            = '元に戻す';
+$lang['btn_register']          = 'ユーザー登録';
+$lang['btn_apply']             = '適用';
+$lang['btn_media']             = 'メディアマネージャー';
+$lang['btn_deleteuser']        = '自分のアカウントの抹消';
+$lang['btn_img_backto']        = '戻る %s';
+$lang['btn_mediaManager']      = 'メディアマネージャーで閲覧';
+$lang['loggedinas']            = 'ようこそ:';
+$lang['user']                  = 'ユーザー名';
+$lang['pass']                  = 'パスワード';
+$lang['newpass']               = '新しいパスワード';
+$lang['oldpass']               = '現在のパスワード';
+$lang['passchk']               = '確認';
+$lang['remember']              = 'ユーザー名とパスワードを記憶する';
+$lang['fullname']              = 'フルネーム';
+$lang['email']                 = 'メールアドレス';
+$lang['profile']               = 'ユーザー情報';
+$lang['badlogin']              = 'ユーザー名かパスワードが違います。';
+$lang['badpassconfirm']        = 'パスワードが間違っています。';
+$lang['minoredit']             = '小変更';
+$lang['draftdate']             = 'ドラフト保存日時:';
+$lang['nosecedit']             = 'ページ内容が変更されていますがセクション情報が古いため、代わりにページ全体をロードしました。';
+$lang['regmissing']            = '全ての項目を入力してください。';
+$lang['reguexists']            = 'このユーザー名は既に存在しています。';
+$lang['regsuccess']            = '新しいユーザーが作成されました。パスワードは登録したメールアドレス宛てに送付されます。';
+$lang['regsuccess2']           = '新しいユーザーが作成されました。';
+$lang['regfail']               = 'ユーザーを作成できませんでした。';
+$lang['regmailfail']           = 'パスワードのメール送信に失敗しました。お手数ですが管理者まで連絡をお願いします。';
+$lang['regbadmail']            = 'メールアドレスが有効ではありません。';
+$lang['regbadpass']            = '確認用のパスワードが正しくありません。';
+$lang['regpwmail']             = 'あなたの DokuWiki パスワード';
+$lang['reghere']               = 'ご自分用のアカウントを取ってみては如何ですか?';
+$lang['profna']                = 'ユーザー情報の変更は出来ません';
+$lang['profnochange']          = '変更点はありませんでした。';
+$lang['profnoempty']           = 'ユーザー名とメールアドレスを入力して下さい。';
+$lang['profchanged']           = 'ユーザー情報は更新されました。';
+$lang['profnodelete']          = 'この wiki はユーザーを削除できない。';
+$lang['profdeleteuser']        = 'アカウントの削除';
+$lang['profdeleted']           = 'このwikiからあなたのユーザーアカウントは削除済です。';
+$lang['profconfdelete']        = 'このwikiから自分のアカウント抹消を希望します。<br/> この操作は取消すことができません。';
+$lang['profconfdeletemissing'] = '確認のチェックボックスがチェックされていません。';
+$lang['proffail']              = 'ユーザー情報は更新されませんでした。';
+$lang['pwdforget']             = 'パスワードをお忘れですか?パスワード再発行';
+$lang['resendna']              = 'パスワードの再発行は出来ません。';
+$lang['resendpwd']             = '新しいパスワードをセット';
+$lang['resendpwdmissing']      = '全ての項目を入力して下さい。';
+$lang['resendpwdnouser']       = '入力されたユーザーが見つかりませんでした。';
+$lang['resendpwdbadauth']      = '申し訳ありません。この確認コードは有効ではありません。メール内に記載されたリンクを確認してください。';
+$lang['resendpwdconfirm']      = '確認用のリンクを含んだメールを送信しました。';
+$lang['resendpwdsuccess']      = '新しいパスワードがメールで送信されました。';
+$lang['license']               = '特に明示されていない限り、本Wikiの内容は次のライセンスに従います:';
+$lang['licenseok']             = '注意: 本ページを編集することは、あなたの編集した内容が次のライセンスに従うことに同意したものとみなします:';
+$lang['searchmedia']           = '検索ファイル名:';
+$lang['searchmedia_in']        = '%s 内を検索';
+$lang['txt_upload']            = 'アップロードするファイルを選んでください。:';
+$lang['txt_filename']          = '名前を変更してアップロード(オプション):';
+$lang['txt_overwrt']           = '既存のファイルを上書き';
+$lang['maxuploadsize']         = 'アップロード上限サイズ %s /ファイル';
+$lang['lockedby']              = 'この文書は次のユーザーによってロックされています:';
+$lang['lockexpire']            = 'ロック期限::';
+$lang['js']['willexpire']      = '編集中の文書はロック期限を過ぎようとしています。このままロックする場合は、一度文書の確認を行って期限をリセットしてください。';
+$lang['js']['notsavedyet']     = '変更は保存されません。このまま処理を続けてよろしいですか?';
+$lang['js']['searchmedia']     = 'ファイル検索';
+$lang['js']['keepopen']        = '選択中はウィンドウを閉じない';
+$lang['js']['hidedetails']     = '詳細を非表示';
+$lang['js']['mediatitle']      = 'リンク設定';
+$lang['js']['mediadisplay']    = 'リンクタイプ';
+$lang['js']['mediaalign']      = '位置';
+$lang['js']['mediasize']       = 'イメージサイズ';
+$lang['js']['mediatarget']     = 'リンク先';
+$lang['js']['mediaclose']      = '閉じる';
+$lang['js']['mediainsert']     = '挿入';
+$lang['js']['mediadisplayimg'] = 'イメージを表示';
+$lang['js']['mediadisplaylnk'] = 'リンクのみ表示';
+$lang['js']['mediasmall']      = '小さいサイズ';
+$lang['js']['mediamedium']     = '通常サイズ';
+$lang['js']['medialarge']      = '大きいサイズ';
+$lang['js']['mediaoriginal']   = 'オリジナルのサイズ';
+$lang['js']['medialnk']        = '詳細ページへのリンク';
+$lang['js']['mediadirect']     = 'オリジナルへの直リンク';
+$lang['js']['medianolnk']      = 'リンク無し';
+$lang['js']['medianolink']     = 'イメージをリンクしない';
+$lang['js']['medialeft']       = 'イメージを左に寄せる';
+$lang['js']['mediaright']      = 'イメージを右に寄せる';
+$lang['js']['mediacenter']     = 'イメージを中央に寄せる';
+$lang['js']['medianoalign']    = '位置を設定しない';
+$lang['js']['nosmblinks']      = 'ウィンドウズの共有フォルダへリンクは Microsoft Internet Explorer でしか機能しませんが、リンクをコピーして貼り付けることは可能です。';
+$lang['js']['linkwiz']         = 'リンクウィザード';
+$lang['js']['linkto']          = 'リンク先:';
+$lang['js']['del_confirm']     = '選択した項目を本当に削除しますか?';
+$lang['js']['restore_confirm'] = '本当にこのバージョンを復元しますか?';
+$lang['js']['media_diff']      = '差分の表示方法:';
+$lang['js']['media_diff_both'] = '並べて表示';
+$lang['js']['media_diff_opacity'] = '重ねて透過表示';
+$lang['js']['media_diff_portions'] = '重ねて切替表示';
+$lang['js']['media_select']    = 'ファイルを選択...';
+$lang['js']['media_upload_btn'] = 'アップロード';
+$lang['js']['media_done_btn']  = '完了';
+$lang['js']['media_drop']      = 'ここにファイルをドロップするとアップロードします';
+$lang['js']['media_cancel']    = '削除';
+$lang['js']['media_overwrt']   = '既存のファイルを上書きする';
+$lang['rssfailed']             = 'RSSの取得に失敗しました:';
+$lang['nothingfound']          = '該当文書はありませんでした。';
+$lang['mediaselect']           = 'メディアファイル';
+$lang['uploadsucc']            = 'アップロード完了';
+$lang['uploadfail']            = 'アップロードに失敗しました。権限がありません。';
+$lang['uploadwrong']           = 'アップロードは拒否されました。この拡張子は許可されていません。';
+$lang['uploadexist']           = '同名のファイルが存在するため、アップロードできません。';
+$lang['uploadbadcontent']      = 'アップロードされたファイルの内容は、拡張子 %s と一致しません。';
+$lang['uploadspam']            = 'スパムブラックリストによりアップロードが遮断されました。';
+$lang['uploadxss']             = '悪意のある内容である可能性により、アップロードが遮断されました。';
+$lang['uploadsize']            = 'アップロードしようとしたファイルは大きすぎます(最大 %s)。';
+$lang['deletesucc']            = 'ファイル "%s" は削除されました。';
+$lang['deletefail']            = 'ファイル "%s" が削除できません。権限を確認して下さい。';
+$lang['mediainuse']            = 'ファイル "%s" は使用中のため、削除されませんでした。';
+$lang['namespaces']            = '名前空間';
+$lang['mediafiles']            = '有効なファイル:';
+$lang['accessdenied']          = 'このページを閲覧する権限がありません。';
+$lang['mediausage']            = 'このファイルを使用するためには次の文法を使用する:';
+$lang['mediaview']             = 'オリジナルファイルを閲覧';
+$lang['mediaroot']             = 'ルート';
+$lang['mediaupload']           = 'ファイルを現在の名前空間にアップロードします。副名前空間を使用する場合には、ファイル名の前にコロンで区切って追加してください。';
+$lang['mediaextchange']        = '拡張子が .%s から .%s へ変更されました。';
+$lang['reference']             = '参照先';
+$lang['ref_inuse']             = 'このファイルは、次のページで使用中のため削除できません。';
+$lang['ref_hidden']            = 'このページに存在するいくつかの参照先は、権限が無いため読むことができません。';
+$lang['hits']                  = 'ヒット';
+$lang['quickhits']             = 'マッチした文書名';
+$lang['toc']                   = '目次';
+$lang['current']               = '現在';
+$lang['yours']                 = 'あなたのバージョン';
+$lang['diff']                  = '現在のリビジョンとの差分を表示';
+$lang['diff2']                 = '選択したリビジョン間の差分を表示';
+$lang['difflink']              = 'この比較画面にリンクする';
+$lang['diff_type']             = '差分の表示方法:';
+$lang['diff_inline']           = 'インライン';
+$lang['diff_side']             = '横に並べる';
+$lang['diffprevrev']           = '前のリビジョン';
+$lang['diffnextrev']           = '次のリビジョン';
+$lang['difflastrev']           = '最新リビジョン';
+$lang['diffbothprevrev']       = '両方とも前のリビジョン';
+$lang['diffbothnextrev']       = '両方とも次のリビジョン';
+$lang['line']                  = 'ライン';
+$lang['breadcrumb']            = 'トレース:';
+$lang['youarehere']            = '現在位置:';
+$lang['lastmod']               = '最終更新:';
+$lang['by']                    = 'by';
+$lang['deleted']               = '削除';
+$lang['created']               = '作成';
+$lang['restored']              = '以前のリビジョンを復元 (%s)';
+$lang['external_edit']         = '外部編集';
+$lang['summary']               = '編集の概要';
+$lang['noflash']               = 'この内容を表示するためには <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> が必要です。';
+$lang['download']              = 'この部分をダウンロード';
+$lang['tools']                 = 'ツール';
+$lang['user_tools']            = 'ユーザ用ツール';
+$lang['site_tools']            = 'サイト用ツール';
+$lang['page_tools']            = 'ページ用ツール';
+$lang['skip_to_content']       = '内容へ移動';
+$lang['sidebar']               = 'サイドバー';
+$lang['mail_newpage']          = '文書の追加:';
+$lang['mail_changed']          = '文書の変更:';
+$lang['mail_subscribe_list']   = '名前空間内でページが変更:';
+$lang['mail_new_user']         = '新規ユーザー:';
+$lang['mail_upload']           = 'ファイルのアップロード:';
+$lang['changes_type']          = '表示する変更のタイプ:';
+$lang['pages_changes']         = 'ページの変更';
+$lang['media_changes']         = 'メディアファイルの変更';
+$lang['both_changes']          = 'ページとメディアファイルの変更';
+$lang['qb_bold']               = '太字';
+$lang['qb_italic']             = '斜体';
+$lang['qb_underl']             = '下線';
+$lang['qb_code']               = 'コード';
+$lang['qb_strike']             = '打消線';
+$lang['qb_h1']                 = '第一見出し';
+$lang['qb_h2']                 = '第二見出し';
+$lang['qb_h3']                 = '第三見出し';
+$lang['qb_h4']                 = '第四見出し';
+$lang['qb_h5']                 = '第五見出し';
+$lang['qb_h']                  = '見出し';
+$lang['qb_hs']                 = '見出し選択';
+$lang['qb_hplus']              = '上の階層の見出し';
+$lang['qb_hminus']             = '下の階層の見出し';
+$lang['qb_hequal']             = '同じ階層の見出し';
+$lang['qb_link']               = '内部リンク';
+$lang['qb_extlink']            = '外部リンク';
+$lang['qb_hr']                 = '横罫線';
+$lang['qb_ol']                 = '記号付きリスト';
+$lang['qb_ul']                 = '記号なしリスト';
+$lang['qb_media']              = 'イメージやファイルの追加';
+$lang['qb_sig']                = '署名の挿入';
+$lang['qb_smileys']            = 'スマイリー';
+$lang['qb_chars']              = '特殊文字';
+$lang['upperns']               = '上の階層の名前空間へ';
+$lang['metaedit']              = 'メタデータ編集';
+$lang['metasaveerr']           = 'メタデータの書き込みに失敗しました';
+$lang['metasaveok']            = 'メタデータは保存されました';
+$lang['img_title']             = 'タイトル:';
+$lang['img_caption']           = '見出し:';
+$lang['img_date']              = '日付:';
+$lang['img_fname']             = 'ファイル名:';
+$lang['img_fsize']             = 'サイズ:';
+$lang['img_artist']            = '作成者:';
+$lang['img_copyr']             = '著作権:';
+$lang['img_format']            = 'フォーマット:';
+$lang['img_camera']            = '使用カメラ:';
+$lang['img_keywords']          = 'キーワード:';
+$lang['img_width']             = '幅:';
+$lang['img_height']            = '高さ:';
+$lang['subscr_subscribe_success'] = '%sが%sの購読リストに登録されました。';
+$lang['subscr_subscribe_error'] = '%sを%sの購読リストへの追加に失敗しました。';
+$lang['subscr_subscribe_noaddress'] = 'あなたのログインに対応するアドレスがないため、購読リストへ追加することができません。';
+$lang['subscr_unsubscribe_success'] = '%sを%sの購読リストから削除しました。';
+$lang['subscr_unsubscribe_error'] = '%sを%sの購読リストからの削除に失敗しました。';
+$lang['subscr_already_subscribed'] = '%sは既に%sに登録されています。';
+$lang['subscr_not_subscribed'] = '%sは%sに登録されていません。';
+$lang['subscr_m_not_subscribed'] = '現在のページ、もしくは名前空間にあなたは登録されていません。';
+$lang['subscr_m_new_header']   = '購読を追加';
+$lang['subscr_m_current_header'] = '現在の購読リスト';
+$lang['subscr_m_unsubscribe']  = '購読を解除';
+$lang['subscr_m_subscribe']    = '購読';
+$lang['subscr_m_receive']      = '受信';
+$lang['subscr_style_every']    = '全ての変更にメールを送信';
+$lang['subscr_style_digest']   = 'それぞれのページへの変更の要約をメールする(%.2f 日毎)';
+$lang['subscr_style_list']     = '前回のメールから変更されたページをリスト(%.2f 日毎)';
+$lang['authtempfail']          = 'ユーザー認証が一時的に使用できなくなっています。この状態が続いているようであれば、Wikiの管理者に連絡して下さい。';
+$lang['i_chooselang']          = '使用言語を選択してください';
+$lang['i_installer']           = 'DokuWiki インストーラー';
+$lang['i_wikiname']            = 'Wiki名';
+$lang['i_enableacl']           = 'ACL(アクセス管理)を使用する(推奨)';
+$lang['i_superuser']           = 'スーパーユーザー';
+$lang['i_problems']            = '問題が発見されました。以下に示す問題を解決するまで、インストールを続行できません。';
+$lang['i_modified']            = 'セキュリティの理由から、新規もしくはカスタマイズしていない DokuWiki に対してのみ、このスクリプトは有効です。
+                         ダウンロードしたパッケージを再解凍して使用するか、
+                         <a href="http://dokuwiki.org/install">Dokuwiki インストールガイド</a>を参考にしてインストールしてください。';
+$lang['i_funcna']              = 'PHPの関数 <code>%s</code> が使用できません。ホスティング会社が何らかの理由で無効にしている可能性があります。';
+$lang['i_phpver']              = 'PHPのバージョン <code>%s</code> が必要なバージョン <code>%s</code> より以前のものです。PHPのアップグレードが必要です。';
+$lang['i_mbfuncoverload']      = 'DokuWiki を実行する php.ini ファイルの mbstring.func_overload は無効にして下さい。';
+$lang['i_permfail']            = '<code>%s</code> に書き込みできません。このディレクトリの権限を確認して下さい。';
+$lang['i_confexists']          = '<code>%s</code> は既に存在します';
+$lang['i_writeerr']            = '<code>%s</code> を作成できません。ディレクトリとファイルの権限を確認し、それらを手動で作成する必要があります。';
+$lang['i_badhash']             = 'dokuwiki.php が認識できないか、編集されています(hash=<code>%s</code>)';
+$lang['i_badval']              = '<code>%s</code> - 正しくない、もしくは値が空です';
+$lang['i_success']             = '設定ファイルは正しく作成されました。<a href="doku.php?id=wiki:welcome">作成した DokuWiki</a>を使用するには install.php を削除してください。';
+$lang['i_failure']             = '設定ファイルの作成中にエラーが発生しました。<a href="doku.php?id=wiki:welcome">作成した DokuWiki</a>を使用する前に、それらの問題を手動で修正する必要があります。';
+$lang['i_policy']              = 'ACL初期設定';
+$lang['i_pol0']                = 'オープン Wiki(全ての人に、閲覧・書き込み・アップロードを許可)';
+$lang['i_pol1']                = 'パブリック Wiki(閲覧は全ての人が可能、書き込み・アップロードは登録ユーザーのみ)';
+$lang['i_pol2']                = 'クローズド Wiki (登録ユーザーにのみ使用を許可)';
+$lang['i_allowreg']            = 'ユーザ自身で登録可能';
+$lang['i_retry']               = '再試行';
+$lang['i_license']             = 'あなたが作成したコンテンツが属するライセンスを選択してください:';
+$lang['i_license_none']        = 'ライセンス情報を表示しません。';
+$lang['i_pop_field']           = 'Dokuwiki の内容の向上に協力して下さい:';
+$lang['i_pop_label']           = '月に一回、DokuWikiの開発者に匿名の使用データを送信します。';
+$lang['recent_global']         = '現在、<b>%s</b> 名前空間内の変更点を閲覧中です。<a href="%s">Wiki全体の最近の変更点の確認</a>もできます。';
+$lang['years']                 = '%d年前';
+$lang['months']                = '%dカ月前';
+$lang['weeks']                 = '%d週間前';
+$lang['days']                  = '%d日前';
+$lang['hours']                 = '%d時間前';
+$lang['minutes']               = '%d分前';
+$lang['seconds']               = '%d秒前';
+$lang['wordblock']             = 'スパムと認識されるテキストが含まれているため、変更は保存されませんでした。';
+$lang['media_uploadtab']       = 'アップロード';
+$lang['media_searchtab']       = '検索';
+$lang['media_file']            = 'ファイル';
+$lang['media_viewtab']         = '詳細';
+$lang['media_edittab']         = '編集';
+$lang['media_historytab']      = '履歴';
+$lang['media_list_thumbs']     = 'サムネイル';
+$lang['media_list_rows']       = '行';
+$lang['media_sort_name']       = '名前';
+$lang['media_sort_date']       = '日付';
+$lang['media_namespaces']      = '名前空間を選択';
+$lang['media_files']           = '%s 内のファイル';
+$lang['media_upload']          = '%s にアップロード';
+$lang['media_search']          = '%s 内で検索';
+$lang['media_view']            = '%s';
+$lang['media_viewold']         = '%2$s に %1$s';
+$lang['media_edit']            = '%s を編集';
+$lang['media_history']         = '%s の履歴';
+$lang['media_meta_edited']     = 'メタデータが編集されました';
+$lang['media_perm_read']       = 'ファイルを閲覧する権限がありません。';
+$lang['media_perm_upload']     = 'ファイルをアップロードする権限がありません。';
+$lang['media_update']          = '新しいバージョンをアップロード';
+$lang['media_restore']         = 'このバージョンを復元';
+$lang['media_acl_warning']     = 'ACL制限や非表示ページは表示されないので、このリストは完全でない場合があります。';
+$lang['currentns']             = '現在の名前空間';
+$lang['searchresult']          = '検索結果';
+$lang['plainhtml']             = 'プレーンHTML';
+$lang['wikimarkup']            = 'Wikiマークアップ';
+$lang['page_nonexist_rev']     = '指定ページ %s はありません。このリンク <a href="%s">%s</a> から作成できます。';
+$lang['unable_to_parse_date']  = 'パラメータ "%s" を処理できません。';
+$lang['email_signature_text']  = 'このメールは次のDokuWikiより自動的に送信されています。
+@DOKUWIKIURL@';
diff --git a/wiki/inc/lang/ja/locked.txt b/wiki/inc/lang/ja/locked.txt
new file mode 100644
index 0000000..1c37c93
--- /dev/null
+++ b/wiki/inc/lang/ja/locked.txt
@@ -0,0 +1,3 @@
+====== 文書ロック中 ======
+
+この文書は他のユーザーによってロックされています。編集が完了するか、ロックの期限が切れるのを待って下さい。
diff --git a/wiki/inc/lang/ja/login.txt b/wiki/inc/lang/ja/login.txt
new file mode 100644
index 0000000..ef18d37
--- /dev/null
+++ b/wiki/inc/lang/ja/login.txt
@@ -0,0 +1,4 @@
+====== ログイン ======
+
+ユーザー名とパスワードを入力してログインしてください(クッキーを有効にする必要があります)。
+
diff --git a/wiki/inc/lang/ja/mailtext.txt b/wiki/inc/lang/ja/mailtext.txt
new file mode 100644
index 0000000..4bad3d9
--- /dev/null
+++ b/wiki/inc/lang/ja/mailtext.txt
@@ -0,0 +1,12 @@
+DokuWiki 内の文書が追加もしくは変更されました。詳細は以下の通りです。
+
+日付        : @DATE@
+ブラウザ    : @BROWSER@
+IPアドレス  : @IPADDRESS@
+ホスト名    : @HOSTNAME@
+前リビジョン: @OLDPAGE@
+新リビジョン: @NEWPAGE@
+編集のサマリ: @SUMMARY@
+ユーザー名  : @USER@
+
+@DIFF@
diff --git a/wiki/inc/lang/ja/mailwrap.html b/wiki/inc/lang/ja/mailwrap.html
new file mode 100644
index 0000000..d257190
--- /dev/null
+++ b/wiki/inc/lang/ja/mailwrap.html
@@ -0,0 +1,13 @@
+<html>
+<head>
+<title>@TITLE@</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+</head>
+<body>
+
+@HTMLBODY@
+
+<br /><hr />
+<small>@EMAILSIGNATURE@</small>
+</body>
+</html>
\ No newline at end of file
diff --git a/wiki/inc/lang/ja/newpage.txt b/wiki/inc/lang/ja/newpage.txt
new file mode 100644
index 0000000..d03169f
--- /dev/null
+++ b/wiki/inc/lang/ja/newpage.txt
@@ -0,0 +1,4 @@
+====== このトピックには文書が存在しません ======
+
+このトピックに文書が作成されていません。 もし、文書作成の権限がある場合は、''文書の作成''をクリックして 最初の文書を作成することができます。
+
diff --git a/wiki/inc/lang/ja/norev.txt b/wiki/inc/lang/ja/norev.txt
new file mode 100644
index 0000000..48ccde7
--- /dev/null
+++ b/wiki/inc/lang/ja/norev.txt
@@ -0,0 +1,4 @@
+====== リビジョンが存在しません ======
+
+指定されたリビジョン存在しません。''以前のリビジョン''をクリックして確認してください。
+
diff --git a/wiki/inc/lang/ja/password.txt b/wiki/inc/lang/ja/password.txt
new file mode 100644
index 0000000..fa11b10
--- /dev/null
+++ b/wiki/inc/lang/ja/password.txt
@@ -0,0 +1,6 @@
+こんにちは @FULLNAME@! さん
+
+@TITLE@(@DOKUWIKIURL@)に登録されたユーザー情報は以下の通りです。
+
+ユーザー名 : @LOGIN@
+パスワード : @PASSWORD@
diff --git a/wiki/inc/lang/ja/preview.txt b/wiki/inc/lang/ja/preview.txt
new file mode 100644
index 0000000..ee839cd
--- /dev/null
+++ b/wiki/inc/lang/ja/preview.txt
@@ -0,0 +1,4 @@
+====== プレビュー ======
+
+編集中の文書のプレビューです。確認用なので**保存されていない**ことに注意してください。
+
diff --git a/wiki/inc/lang/ja/pwconfirm.txt b/wiki/inc/lang/ja/pwconfirm.txt
new file mode 100644
index 0000000..c53b784
--- /dev/null
+++ b/wiki/inc/lang/ja/pwconfirm.txt
@@ -0,0 +1,9 @@
+こんにちは @FULLNAME@ さん
+
+@TITLE@(@DOKUWIKIURL@)に新規パスワード発行のリクエストがありました。
+
+もしこのリクエストに覚えが無ければ、このメールは無視してください。
+
+このリクエストを行った本人であれば、以下のリンクから作業を完了させてください。
+
+@CONFIRM@
diff --git a/wiki/inc/lang/ja/read.txt b/wiki/inc/lang/ja/read.txt
new file mode 100644
index 0000000..14137cc
--- /dev/null
+++ b/wiki/inc/lang/ja/read.txt
@@ -0,0 +1,2 @@
+この文書は読取専用です。文書のソースを閲覧することは可能ですが、変更はできません。もし変更したい場合は管理者に連絡してください。
+
diff --git a/wiki/inc/lang/ja/recent.txt b/wiki/inc/lang/ja/recent.txt
new file mode 100644
index 0000000..d18fd1b
--- /dev/null
+++ b/wiki/inc/lang/ja/recent.txt
@@ -0,0 +1,5 @@
+====== 最近の変更 ======
+
+以下の文書は最近更新されたものです。
+
+
diff --git a/wiki/inc/lang/ja/register.txt b/wiki/inc/lang/ja/register.txt
new file mode 100644
index 0000000..0cd2786
--- /dev/null
+++ b/wiki/inc/lang/ja/register.txt
@@ -0,0 +1,4 @@
+====== 新規ユーザー登録 ======
+
+このWikiのユーザー登録を行うためには、以下の情報を全て入力して下さい。 もし以下の項目にパスワードが存在しない場合、パスワードはメールにて送信されますので、 必ず**有効なメールアドレス**を入力してください。 また、ログイン名は[[doku>ja:pagename|ページ名]]に準拠していなければなりません。
+
diff --git a/wiki/inc/lang/ja/registermail.txt b/wiki/inc/lang/ja/registermail.txt
new file mode 100644
index 0000000..ad5241a
--- /dev/null
+++ b/wiki/inc/lang/ja/registermail.txt
@@ -0,0 +1,10 @@
+新しいユーザーが登録されました。ユーザー情報は以下の通りです。
+
+ユーザー名     : @NEWUSER@
+フルネーム     : @NEWNAME@
+メールアドレス : @NEWEMAIL@
+
+登録日         : @DATE@
+ブラウザ       : @BROWSER@
+IPアドレス     : @IPADDRESS@
+ホスト名       : @HOSTNAME@
diff --git a/wiki/inc/lang/ja/resendpwd.txt b/wiki/inc/lang/ja/resendpwd.txt
new file mode 100644
index 0000000..23dd6ff
--- /dev/null
+++ b/wiki/inc/lang/ja/resendpwd.txt
@@ -0,0 +1,4 @@
+====== パスワード再発行 ======
+
+このWikiで使用する新しいパスワードをリクエストするために、ユーザー名を入力して下さい。 新パスワード発行リクエストの確認メールが、登録されているメールアドレスに送信されます。
+
diff --git a/wiki/inc/lang/ja/resetpwd.txt b/wiki/inc/lang/ja/resetpwd.txt
new file mode 100644
index 0000000..a414af9
--- /dev/null
+++ b/wiki/inc/lang/ja/resetpwd.txt
@@ -0,0 +1,3 @@
+====== 新しいパスワードをセット ======
+
+このWikiでの、あなたのアカウント用の新しいパスワードを入力して下さい
\ No newline at end of file
diff --git a/wiki/inc/lang/ja/revisions.txt b/wiki/inc/lang/ja/revisions.txt
new file mode 100644
index 0000000..e43731c
--- /dev/null
+++ b/wiki/inc/lang/ja/revisions.txt
@@ -0,0 +1,4 @@
+====== 以前のリビジョン ======
+
+以下はこの文書の以前のリビジョンです。復元するには''文書の編集''をクリック、その後保存してください。
+
diff --git a/wiki/inc/lang/ja/searchpage.txt b/wiki/inc/lang/ja/searchpage.txt
new file mode 100644
index 0000000..3c8751a
--- /dev/null
+++ b/wiki/inc/lang/ja/searchpage.txt
@@ -0,0 +1,4 @@
+====== 検索 ======
+
+以下に検索結果を表示します。@CREATEPAGEINFO@
+
diff --git a/wiki/inc/lang/ja/showrev.txt b/wiki/inc/lang/ja/showrev.txt
new file mode 100644
index 0000000..d8ce478
--- /dev/null
+++ b/wiki/inc/lang/ja/showrev.txt
@@ -0,0 +1,2 @@
+**以前のリビジョンの文書です**
+----
diff --git a/wiki/inc/lang/ja/stopwords.txt b/wiki/inc/lang/ja/stopwords.txt
new file mode 100644
index 0000000..628e46e
--- /dev/null
+++ b/wiki/inc/lang/ja/stopwords.txt
@@ -0,0 +1,29 @@
+# 以下は、インデックス作成時に無視する語句のリストです。一行に一単語ずつ記入してください。
+# UNIXで用いられる改行コード(LF)を使用してください
+# 3文字より短い語句は自動的に無視されるので、リストに加える必要はありません。
+# このリストは次のサイトをもとに作成されています(http://www.ranks.nl/stopwords/)
+about
+are
+and
+you
+your
+them
+their
+com
+for
+from
+into
+how
+that
+the
+this
+was
+what
+when
+where
+who
+will
+with
+und
+the
+www
diff --git a/wiki/inc/lang/ja/subscr_digest.txt b/wiki/inc/lang/ja/subscr_digest.txt
new file mode 100644
index 0000000..026a2fe
--- /dev/null
+++ b/wiki/inc/lang/ja/subscr_digest.txt
@@ -0,0 +1,17 @@
+こんにちは。
+
+@TITLE@ 内のページ @PAGE@ は変更されました。
+変更点は以下の通りです:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+古いリビジョン: @OLDPAGE@
+新しいリビジョン: @NEWPAGE@
+
+この通知を解除するには次のウィキへログインし
+@DOKUWIKIURL@
+その後、
+@SUBSCRIBE@
+ページと名前空間の変更に対する購読を解除してください。
diff --git a/wiki/inc/lang/ja/subscr_form.txt b/wiki/inc/lang/ja/subscr_form.txt
new file mode 100644
index 0000000..5767189
--- /dev/null
+++ b/wiki/inc/lang/ja/subscr_form.txt
@@ -0,0 +1,3 @@
+====== 購読管理 ======
+
+このページで、現在のページと名前空間に対する購読を管理することができます。
\ No newline at end of file
diff --git a/wiki/inc/lang/ja/subscr_list.txt b/wiki/inc/lang/ja/subscr_list.txt
new file mode 100644
index 0000000..dbe37c7
--- /dev/null
+++ b/wiki/inc/lang/ja/subscr_list.txt
@@ -0,0 +1,15 @@
+こんにちは。
+
+@TITLE@ の 名前空間 @PAGE@ にあるページが変更されました。
+変更点は以下の通りです:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+
+この通知を解除するには次のウィキへログインし
+@DOKUWIKIURL@
+その後、
+@SUBSCRIBE@
+ページと名前空間の変更に対する購読を解除してください。
diff --git a/wiki/inc/lang/ja/subscr_single.txt b/wiki/inc/lang/ja/subscr_single.txt
new file mode 100644
index 0000000..4dac31e
--- /dev/null
+++ b/wiki/inc/lang/ja/subscr_single.txt
@@ -0,0 +1,20 @@
+こんにちは。
+
+@TITLE@ のウィキにあるページ @PAGE@ が変更されました。
+変更点は以下の通りです:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+日付 : @DATE@
+ユーザー : @USER@
+変更概要: @SUMMARY@
+古いリビジョン: @OLDPAGE@
+新しいリビジョン: @NEWPAGE@
+
+この通知を解除するには次のウィキへログインし
+@DOKUWIKIURL@
+その後、
+@SUBSCRIBE@
+ページと名前空間の変更に対する購読を解除してください。
diff --git a/wiki/inc/lang/ja/updateprofile.txt b/wiki/inc/lang/ja/updateprofile.txt
new file mode 100644
index 0000000..e83d929
--- /dev/null
+++ b/wiki/inc/lang/ja/updateprofile.txt
@@ -0,0 +1,5 @@
+====== アカウント情報更新 ======
+
+変更したい項目を入力して下さい。ユーザー名は変更できません。
+
+
diff --git a/wiki/inc/lang/ja/uploadmail.txt b/wiki/inc/lang/ja/uploadmail.txt
new file mode 100644
index 0000000..8734c91
--- /dev/null
+++ b/wiki/inc/lang/ja/uploadmail.txt
@@ -0,0 +1,10 @@
+お使いのDokuWikiにファイルがアップロードされました。詳細は以下の通りです。
+
+ファイル    : @MEDIA@
+日付        : @DATE@
+ブラウザ    : @BROWSER@
+IPアドレス  : @IPADDRESS@
+ホスト名    : @HOSTNAME@
+サイズ      : @SIZE@
+MIMEタイプ  : @MIME@
+ユーザー名  : @USER@
diff --git a/wiki/inc/lang/ka/admin.txt b/wiki/inc/lang/ka/admin.txt
new file mode 100644
index 0000000..97072a4
--- /dev/null
+++ b/wiki/inc/lang/ka/admin.txt
@@ -0,0 +1,4 @@
+====== მართვა ======
+
+ქვემოთ თქვენ ხედავთ ადმინისტრაციული ოპერაციების სიას «დოკუვიკიში».
+
diff --git a/wiki/inc/lang/ka/adminplugins.txt b/wiki/inc/lang/ka/adminplugins.txt
new file mode 100644
index 0000000..011bfeb
--- /dev/null
+++ b/wiki/inc/lang/ka/adminplugins.txt
@@ -0,0 +1 @@
+===== დამატებითი პლაგინები =====
\ No newline at end of file
diff --git a/wiki/inc/lang/ka/backlinks.txt b/wiki/inc/lang/ka/backlinks.txt
new file mode 100644
index 0000000..7b54797
--- /dev/null
+++ b/wiki/inc/lang/ka/backlinks.txt
@@ -0,0 +1,4 @@
+====== გადმომისამართება ======
+
+გვერდები რომლებიც ანიშნებენ ამ გვერდზე.
+
diff --git a/wiki/inc/lang/ka/conflict.txt b/wiki/inc/lang/ka/conflict.txt
new file mode 100644
index 0000000..1b1eb04
--- /dev/null
+++ b/wiki/inc/lang/ka/conflict.txt
@@ -0,0 +1,5 @@
+====== გამოვიდა უფრო ახალი ვერსია ======
+
+არსებობს დოკუმენტის უფრო ახალი ვერსია, რომელიც თქვენ დაარედაქტირეთ. ეს ხდება მაშინ, როდესაც სხვა მომხმარებელი არედაქტირებს დოკუმენტს, სანამ თქვენ აკეთებდით იგივეს. 
+
+ყურადღებით დააკვირდით ქვემოთ მოყვანილ განსხვავებებს, და გადაწყვიტეთ რომელი ვერსია სჯობს. თუ შენახვას დააჭერთ, თქვენი ვერსია შეინახება.
\ No newline at end of file
diff --git a/wiki/inc/lang/ka/denied.txt b/wiki/inc/lang/ka/denied.txt
new file mode 100644
index 0000000..bb89104
--- /dev/null
+++ b/wiki/inc/lang/ka/denied.txt
@@ -0,0 +1,3 @@
+====== მიუწვდომელია ======
+
+თქვენ არ გაქვთ საკმარისი უფლებები. იქნებ ავტორიზაცია დაგავიწყდათ?
diff --git a/wiki/inc/lang/ka/diff.txt b/wiki/inc/lang/ka/diff.txt
new file mode 100644
index 0000000..c635e45
--- /dev/null
+++ b/wiki/inc/lang/ka/diff.txt
@@ -0,0 +1,3 @@
+====== განსხვავებები ======
+ქვემოთ მოყვანილაი განსხვავებები მსგავს გვერდებს შორის.
+
diff --git a/wiki/inc/lang/ka/draft.txt b/wiki/inc/lang/ka/draft.txt
new file mode 100644
index 0000000..f3356dd
--- /dev/null
+++ b/wiki/inc/lang/ka/draft.txt
@@ -0,0 +1,3 @@
+====== ნაპოვნია ჩანაწერი ======
+
+გვერდის რედაქტირება არ იყო დამთავრებული. 
\ No newline at end of file
diff --git a/wiki/inc/lang/ka/edit.txt b/wiki/inc/lang/ka/edit.txt
new file mode 100644
index 0000000..3fffceb
--- /dev/null
+++ b/wiki/inc/lang/ka/edit.txt
@@ -0,0 +1,2 @@
+დაარედაქტირეთ გვერდი და დააჭირეთ «შენახვას». წაიკითხეთ [[wiki:syntax|FAQ]] ვიკის სინტაქსისთან გასაცნობად. დაარედაქტირეთ გვერდი მხოლოდ იმ შემთხვევაში თუ აპირებთ გვერდის გაუმჯობესებას. თუ თქვენ რამის დატესტვა გინდათ, გამოიყენეთ სპეციალური გვერდი.
+
diff --git a/wiki/inc/lang/ka/editrev.txt b/wiki/inc/lang/ka/editrev.txt
new file mode 100644
index 0000000..17ccff5
--- /dev/null
+++ b/wiki/inc/lang/ka/editrev.txt
@@ -0,0 +1,2 @@
+**თქვენ ატვირთეთ დოკუმენტის ძველი ვერსია** მისი შენახვით თქვენ შექმნით ახალ ვერსიას იგივე შიგთავსით.
+----
diff --git a/wiki/inc/lang/ka/index.txt b/wiki/inc/lang/ka/index.txt
new file mode 100644
index 0000000..7daef7f
--- /dev/null
+++ b/wiki/inc/lang/ka/index.txt
@@ -0,0 +1 @@
+====== სტატიები ====== აქ ნაჩვენებია ყველა სტატია
\ No newline at end of file
diff --git a/wiki/inc/lang/ka/jquery.ui.datepicker.js b/wiki/inc/lang/ka/jquery.ui.datepicker.js
new file mode 100644
index 0000000..1f596cb
--- /dev/null
+++ b/wiki/inc/lang/ka/jquery.ui.datepicker.js
@@ -0,0 +1,48 @@
+/* Georgian (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Lado Lomidze (lado.lomidze@gmail.com). */
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "../widgets/datepicker" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery.datepicker );
+	}
+}( function( datepicker ) {
+
+datepicker.regional.ka = {
+	closeText: "დახურვა",
+	prevText: "&#x3c; წინა",
+	nextText: "შემდეგი &#x3e;",
+	currentText: "დღეს",
+	monthNames: [
+		"იანვარი",
+		"თებერვალი",
+		"მარტი",
+		"აპრილი",
+		"მაისი",
+		"ივნისი",
+		"ივლისი",
+		"აგვისტო",
+		"სექტემბერი",
+		"ოქტომბერი",
+		"ნოემბერი",
+		"დეკემბერი"
+	],
+	monthNamesShort: [ "იან","თებ","მარ","აპრ","მაი","ივნ", "ივლ","აგვ","სექ","ოქტ","ნოე","დეკ" ],
+	dayNames: [ "კვირა","ორშაბათი","სამშაბათი","ოთხშაბათი","ხუთშაბათი","პარასკევი","შაბათი" ],
+	dayNamesShort: [ "კვ","ორშ","სამ","ოთხ","ხუთ","პარ","შაბ" ],
+	dayNamesMin: [ "კვ","ორშ","სამ","ოთხ","ხუთ","პარ","შაბ" ],
+	weekHeader: "კვირა",
+	dateFormat: "dd-mm-yy",
+	firstDay: 1,
+	isRTL: false,
+	showMonthAfterYear: false,
+	yearSuffix: "" };
+datepicker.setDefaults( datepicker.regional.ka );
+
+return datepicker.regional.ka;
+
+} ) );
diff --git a/wiki/inc/lang/ka/lang.php b/wiki/inc/lang/ka/lang.php
new file mode 100644
index 0000000..0e7c1e1
--- /dev/null
+++ b/wiki/inc/lang/ka/lang.php
@@ -0,0 +1,279 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Tengiz <tech2008a@gmail.com>
+ * @author Luka Lejava <luka.lejava@gmail.com>
+ */
+$lang['encoding']              = 'utf-8';
+$lang['direction']             = 'ltr';
+$lang['doublequoteopening']    = '“';
+$lang['doublequoteclosing']    = '”';
+$lang['singlequoteopening']    = '‘';
+$lang['singlequoteclosing']    = '’';
+$lang['apostrophe']            = '’';
+$lang['btn_edit']              = 'დაარედაქტირეთ ეს გვერდი';
+$lang['btn_source']            = 'მაჩვენე გვერდის კოდი';
+$lang['btn_show']              = 'გვერდის ჩვენება';
+$lang['btn_create']            = 'გვერდის შექმნა';
+$lang['btn_search']            = 'ძიება';
+$lang['btn_save']              = 'შენახვა';
+$lang['btn_preview']           = 'ჩვენება';
+$lang['btn_top']               = 'მაღლა';
+$lang['btn_newer']             = '<<  მეტი ';
+$lang['btn_older']             = 'ნაკლები  >>';
+$lang['btn_revs']              = 'ძველი ვერსიები';
+$lang['btn_recent']            = 'ბოლო ცვლილებები';
+$lang['btn_upload']            = 'ატვირთვა';
+$lang['btn_cancel']            = 'შეწყვეტა';
+$lang['btn_index']             = 'სტატიები';
+$lang['btn_secedit']           = 'რედაქტირება';
+$lang['btn_login']             = 'შესვლა';
+$lang['btn_logout']            = 'გამოსვლა';
+$lang['btn_admin']             = 'ადმინი';
+$lang['btn_update']            = 'განახლება';
+$lang['btn_delete']            = 'წაშლა';
+$lang['btn_back']              = 'უკან';
+$lang['btn_backlink']          = 'გადმომისამართებული ბმულები';
+$lang['btn_subscribe']         = 'გამოწერები მართვა';
+$lang['btn_profile']           = 'პროფილის განახლება';
+$lang['btn_reset']             = 'წაშლა';
+$lang['btn_resendpwd']         = 'ახალი პაროლის დაყენება';
+$lang['btn_draft']             = 'ჩანაწერის წაშლა';
+$lang['btn_recover']           = 'ჩანაწერის აღდგენა';
+$lang['btn_draftdel']          = 'ჩანაწერის წაშლა';
+$lang['btn_revert']            = 'აღდგენა';
+$lang['btn_register']          = 'რეგისტრაცია';
+$lang['btn_apply']             = 'ცადე';
+$lang['btn_media']             = 'მედია ფაილების მართვა';
+$lang['btn_deleteuser']        = 'ჩემი ექაუნთის წაშლა';
+$lang['btn_img_backto']        = 'უკან %s';
+$lang['btn_mediaManager']      = 'მედია ფაილების მმართველში გახსნა';
+$lang['loggedinas']            = 'შესული ხართ როგორც:';
+$lang['user']                  = 'ლოგინი';
+$lang['pass']                  = 'პაროლი';
+$lang['newpass']               = 'ახალი პაროლი';
+$lang['oldpass']               = 'დაადასტურეთ პაროლი';
+$lang['passchk']               = 'კიდევ ერთხელ';
+$lang['remember']              = 'დამიმახსოვრე';
+$lang['fullname']              = 'ნამდვილი სახელი';
+$lang['email']                 = 'ფოსტა';
+$lang['profile']               = 'მომხმარებლის პროფილი';
+$lang['badlogin']              = 'ლოგინი ან პაროლი არასწორია';
+$lang['badpassconfirm']        = 'პაროლი არასწორია';
+$lang['minoredit']             = 'ცვლილებები';
+$lang['draftdate']             = 'ჩანაწერების ავტომატური შენახვა ჩართულია';
+$lang['nosecedit']             = 'გვერდს ვადა გაუვიდა';
+$lang['searchcreatepage']      = 'თუ თქვენ ვერ იპოვეთ რასაც ეძებდით, თქვენ შეგიძლიათ შექმნათ ან გაარედაქტიროთ გვერდი %s, რომელიც მითითებულია თქვენი მოთხოვნის შედეგად.';
+$lang['search_fullresults']    = 'სრულტექსტოვანი რეზულტატი';
+$lang['js']['search_toggle_tools'] = 'საძებნი ინსტრუმენტის გადართვა';
+$lang['js']['willexpire']      = 'გვერდი განიბლოკება 1 წუთში';
+$lang['js']['notsavedyet']     = 'შეუნახავი მონაცემები წაიშლება';
+$lang['js']['searchmedia']     = 'ძებნა';
+$lang['js']['keepopen']        = 'დატოვეთ ღია';
+$lang['js']['hidedetails']     = 'დეტალების დამალვა';
+$lang['js']['mediatitle']      = 'ინსტრუმენტები';
+$lang['js']['mediadisplay']    = 'ბმულის ტიპი';
+$lang['js']['mediaalign']      = 'სწორება';
+$lang['js']['mediasize']       = 'სურათის ზომა';
+$lang['js']['mediatarget']     = 'მიზნის ბმული';
+$lang['js']['mediaclose']      = 'დახურვა';
+$lang['js']['mediainsert']     = 'ჩასმა';
+$lang['js']['mediadisplayimg'] = 'სურათის ნახვა';
+$lang['js']['mediadisplaylnk'] = 'მაჩვენე მხოლოდ ბმული';
+$lang['js']['mediasmall']      = 'მცირე ვერსია';
+$lang['js']['mediamedium']     = 'საშუალო ვერსია';
+$lang['js']['medialarge']      = 'ვრცელი ვერსია';
+$lang['js']['mediaoriginal']   = 'ორიგინალი ვერსია';
+$lang['js']['medialnk']        = 'დაწვრილებით';
+$lang['js']['mediadirect']     = 'ორიგინალი';
+$lang['js']['medianolnk']      = 'ბმული არ არის';
+$lang['js']['medianolink']     = 'არ დალინკოთ სურათი';
+$lang['js']['medialeft']       = 'მარცხვნივ განათავსეთ სურათი';
+$lang['js']['mediaright']      = 'მარჯვნივ განათავსეთ სურათი';
+$lang['js']['mediacenter']     = 'შუაში განათავსეთ სურათი';
+$lang['js']['medianoalign']    = 'სწორების გარეშე';
+$lang['js']['nosmblinks']      = 'ეს ფუქნცია მუშაობს მხოლოდ  Internet Explorer-ზე';
+$lang['js']['linkwiz']         = 'ბმული';
+$lang['js']['linkto']          = 'ბმული';
+$lang['js']['del_confirm']     = 'დარწმუნებული ხართ რომ წაშლა გინდათ?';
+$lang['js']['restore_confirm'] = 'დარწმუნებული ხართ რომ აღდგენა გინდათ?';
+$lang['js']['media_diff']      = 'განსხვავებების ჩვენება';
+$lang['js']['media_diff_both'] = 'გვერდიგვერდ';
+$lang['js']['media_diff_portions'] = 'დარტყმა';
+$lang['js']['media_select']    = 'არჩეული ფაილები';
+$lang['js']['media_upload_btn'] = 'ატვირთვა';
+$lang['js']['media_done_btn']  = 'მზადაა';
+$lang['js']['media_drop']      = 'ჩაყარეთ ასატვირთი ფაილები';
+$lang['js']['media_cancel']    = 'წაშლა';
+$lang['js']['media_overwrt']   = 'გადაწერა ზემოდან';
+$lang['search_exact_match']    = 'სრული თანხვედრა';
+$lang['search_starts_with']    = 'იწყება ';
+$lang['search_ends_with']      = 'მთავრდება';
+$lang['search_contains']       = 'შეიცავს';
+$lang['search_any_ns']         = 'ნებისმიერი სახელთა სივრცე';
+$lang['search_any_time']       = 'ნებისმიერ დროს';
+$lang['search_past_7_days']    = 'გასული კვირის';
+$lang['search_past_month']     = 'გასული თვის';
+$lang['search_past_year']      = 'გასული წლის';
+$lang['search_sort_by_hits']   = 'სორტირება თანხვედრით';
+$lang['search_sort_by_mtime']  = 'სორტირება ბოლო ცვლილებით';
+$lang['regmissing']            = 'ყველა ველი შეავსეთ';
+$lang['reguexists']            = 'მსგავსი ლოგინი უკვე არსებობს';
+$lang['regsuccess']            = 'მომხმარებელი შექმნილია, პაროლი გამოგზავნილია';
+$lang['regsuccess2']           = 'მომხმარებელი შექმნილია';
+$lang['regfail']               = 'მომხმარებელი ვერ შეიქმნება';
+$lang['regmailfail']           = 'დაფიქსირდა შეცდომა';
+$lang['regbadmail']            = 'ფოსტა არასწორია';
+$lang['regbadpass']            = 'პაროლი განსხვავებულია';
+$lang['regpwmail']             = 'თვენი DokuWiki პაროლი';
+$lang['reghere']               = 'დარეგისტრირდი';
+$lang['profna']                = 'არ შეგიძლიათ პროფილის რედაქტირება';
+$lang['profnochange']          = 'ცვლილებები არ არის';
+$lang['profnoempty']           = 'ცარიელი სახელი ან ფოსტა დაუშვებელია';
+$lang['profchanged']           = 'პროფილი განახლდა';
+$lang['profnodelete']          = 'მომხმარებლის წაშლა შეუძლებელია';
+$lang['profdeleteuser']        = 'პროფილის წაშლა';
+$lang['profdeleted']           = 'პროფილი წაიშალა';
+$lang['profconfdelete']        = 'მე მსურს პროფილის წაშლა. <br/> თქვენ აღარ გექნებათ საშუალება აღადგინოთ პროფილი.';
+$lang['profconfdeletemissing'] = 'დადასტურების ველი ცარიელია';
+$lang['proffail']              = 'მომხმარებლის პროფილი ვერ განახლდება';
+$lang['pwdforget']             = 'დაგავიწყდა პაროლი? აღადგინე';
+$lang['resendna']              = 'პაროლის აღდგენა შეუძლებელია';
+$lang['resendpwd']             = 'ახალი პაროლი';
+$lang['resendpwdmissing']      = 'უნდა შეავსოთ ყველა ველი';
+$lang['resendpwdnouser']       = 'მსგავსი ლოგინი დარეგისტრირებული არ არის';
+$lang['resendpwdbadauth']      = 'კოდი არასწორია';
+$lang['resendpwdconfirm']      = 'აღსადგენი ბმული გამოგზავნილია';
+$lang['resendpwdsuccess']      = 'ახალი პაროლი გამოგზავნილია';
+$lang['license']               = 'ვიკი ლიცენზირებულია: ';
+$lang['licenseok']             = 'ამ გვერდის რედაქტირებით თვენ ეთანხმებით ლიცენზიას:';
+$lang['searchmedia']           = 'საძებო სახელი:';
+$lang['searchmedia_in']        = 'ძებნა %s-ში';
+$lang['txt_upload']            = 'აირჩიეთ ასატვირთი ფაილი:';
+$lang['txt_filename']          = 'ატვირთვა როგორც (არჩევითი):';
+$lang['txt_overwrt']           = 'გადაწერა ზემოდან';
+$lang['maxuploadsize']         = 'მაქსიმალური ზომა %s';
+$lang['lockedby']              = 'დაბლოკილია:';
+$lang['lockexpire']            = 'განიბლოკება:';
+$lang['rssfailed']             = 'დაფიქსირდა შეცდომა:';
+$lang['nothingfound']          = 'ნაპოვნი არ არის';
+$lang['mediaselect']           = 'მედია ფაილები';
+$lang['uploadsucc']            = 'ატვირთვა დასრულებულია';
+$lang['uploadfail']            = 'შეფერხება ატვირთვისას';
+$lang['uploadwrong']           = 'ატვირთვა შეუძლებელია';
+$lang['uploadexist']           = 'ფაილი უკვე არსებობს';
+$lang['uploadbadcontent']      = 'ატვირთული ფაილები არ ემთხვევა %s';
+$lang['uploadspam']            = 'ატვირთვა დაბლოკილია სპამბლოკერის მიერ';
+$lang['uploadxss']             = 'ატვირთვა დაბლოკილია';
+$lang['uploadsize']            = 'ასატვირთი ფაილი ზედმეტად დიდია %s';
+$lang['deletesucc']            = '%s ფაილები წაიშალა';
+$lang['deletefail']            = '%s ვერ მოიძებნა';
+$lang['mediainuse']            = 'ფაილის %s ვერ წაიშალა, რადგან გამოყენებაშია';
+$lang['namespaces']            = 'სახელთა სივრცე';
+$lang['mediafiles']            = 'არსებული ფაილები';
+$lang['accessdenied']          = 'თქვენ არ შეგიძლიათ გვერდის ნახვა';
+$lang['mediausage']            = 'გამოიყენე შემდეგი სინტაქსი რათა მიუთითო ეს ფაილი';
+$lang['mediaview']             = 'ორიგინალი ფაილის ჩვენება';
+$lang['mediaroot']             = 'root';
+$lang['mediaextchange']        = 'ფაილის გაფართოება შეიცვალა .%-დან .%-ზე!';
+$lang['ref_inuse']             = 'ფაილი წაშლა შეუძლებელია, გამოიყენება აქ:';
+$lang['ref_hidden']            = 'ზოგიერთი ბლოკის წაკითხვის უფლება არ გაქვთ';
+$lang['quickhits']             = 'მსგავსი სახელები';
+$lang['toc']                   = 'სარჩევი';
+$lang['current']               = 'ახლანდელი';
+$lang['yours']                 = 'თვენი ვერსია';
+$lang['diff']                  = 'ვერსიების განსხვავება';
+$lang['diff2']                 = 'განსხვავებები';
+$lang['diff_type']             = 'განსხვავებების ჩვენება';
+$lang['diff_side']             = 'გვერდიგვერდ';
+$lang['diffprevrev']           = 'წინა ვერსია';
+$lang['diffnextrev']           = 'შემდეგი ვერსია';
+$lang['difflastrev']           = 'ბოლო ვერსია';
+$lang['line']                  = 'ზოლი';
+$lang['youarehere']            = 'თვენ ხართ აქ:';
+$lang['lastmod']               = 'ბოლოს მოდიფიცირებული:';
+$lang['deleted']               = 'წაშლილია';
+$lang['created']               = 'შექმნილია';
+$lang['restored']              = 'ძველი ვერსია აღდგენილია (%s)';
+$lang['external_edit']         = 'რედაქტირება';
+$lang['noflash']               = '<a href="http://www.adobe.com/products/flashplayer/">საჭიროა Adobe Flash Plugin</a>';
+$lang['download']              = 'Snippet-ის გადმოწერა';
+$lang['tools']                 = 'ინსტრუმენტები';
+$lang['user_tools']            = 'მომხმარებლის ინსტრუმენტები';
+$lang['site_tools']            = 'საიტის ინსტრუმენტები';
+$lang['page_tools']            = 'გვერდის ინსტრუმენტები';
+$lang['skip_to_content']       = 'მასალა';
+$lang['sidebar']               = 'გვერდითი პანელი';
+$lang['mail_newpage']          = 'გვერდი დამატებულია:';
+$lang['mail_changed']          = 'გვერდი შეცვლილია:';
+$lang['mail_subscribe_list']   = 'გვერდში შეცვლილია namespace-ები:';
+$lang['mail_new_user']         = 'ახალი მომხმარებელი';
+$lang['mail_upload']           = 'ფაილი ატვირთულია';
+$lang['changes_type']          = 'ცვლილებები';
+$lang['pages_changes']         = 'გვერდები';
+$lang['media_changes']         = 'მედია ფაილები';
+$lang['both_changes']          = 'გვერდები და მედია ფაილები';
+$lang['qb_h1']                 = 'Level 1 სათაური';
+$lang['qb_h2']                 = 'Level 2 სათაური';
+$lang['qb_h3']                 = 'Level 3 სათაური';
+$lang['qb_h4']                 = 'Level 4 სათაური';
+$lang['qb_h5']                 = 'Level 5 სათაური';
+$lang['qb_h']                  = 'სათაური';
+$lang['qb_hs']                 = 'სათაურის არჩევა';
+$lang['qb_hplus']              = 'Higher სათაური';
+$lang['qb_hminus']             = 'Lower სათაური';
+$lang['qb_hequal']             = 'Same Level სათაური';
+$lang['qb_ol']                 = 'შეკვეთილი ბოლო მასალა';
+$lang['qb_media']              = 'ნახატების და სხვა ფაიელბის დამატება';
+$lang['qb_sig']                = 'ხელმოწერა';
+$lang['qb_smileys']            = 'სმაილები';
+$lang['img_title']             = 'სათაური:';
+$lang['img_date']              = 'თარიღი:';
+$lang['img_fname']             = 'ფაილის სახელი:';
+$lang['img_fsize']             = 'ზომა:';
+$lang['img_artist']            = 'ფოტოგრაფი:';
+$lang['img_format']            = 'ფორმატი:';
+$lang['img_camera']            = 'კამერა:';
+$lang['img_width']             = 'სიგანე:';
+$lang['img_height']            = 'სიმაღლე:';
+$lang['subscr_m_receive']      = 'მიღება';
+$lang['subscr_style_every']    = 'ფოსტა ყოველ ცვლილებაზე';
+$lang['i_chooselang']          = 'ენსი არჩევა';
+$lang['i_installer']           = 'DokuWiki დამყენებელი';
+$lang['i_wikiname']            = 'Wiki სახელი';
+$lang['i_superuser']           = 'ადმინი';
+$lang['i_problems']            = 'შეასწორეთ შეცდომები';
+$lang['i_pol0']                = 'ღია ვიკი (წაკითხვა, დაწერა და ატვირთვა შეუძლია ნებისმიერს)';
+$lang['i_pol1']                = 'თავისუფალი ვიკი (წაკითხვა შეუძლია ყველას, დაწერა და ატვირთვა - რეგისტრირებულს)';
+$lang['i_pol2']                = 'დახურული ვიკი (წაკითხვა, დაწერა და ატვირთვა შეუძლიათ მხოლოდ რეგისტრირებულებს)';
+$lang['i_allowreg']            = 'რეგისტრაციის გახსნა';
+$lang['i_retry']               = 'თავიდან ცდა';
+$lang['i_license']             = 'აირჩიეთ ლიცენზია';
+$lang['i_license_none']        = 'არ აჩვენოთ ლიცენზიის ინფორმაცია';
+$lang['i_pop_field']           = 'დაგვეხმარეთ DokuWiki-ს აგუმჯობესებაში';
+$lang['i_pop_label']           = 'თვეში ერთელ ინფორმაციის DokuWiki-ის ადმინისტრაციისთვის გაგზავნა';
+$lang['years']                 = '%d წლის უკან';
+$lang['months']                = '%d თვის უკან';
+$lang['weeks']                 = '%d კვირის უკან';
+$lang['days']                  = '%d დღის წინ';
+$lang['hours']                 = '%d საათის წინ';
+$lang['minutes']               = '%d წუთის წინ';
+$lang['seconds']               = '%d წამის წინ';
+$lang['wordblock']             = 'თქვენი ცვლილებები არ შეინახა, რადგან შეიცავს სპამს';
+$lang['media_uploadtab']       = 'ატვირთვა';
+$lang['media_searchtab']       = 'ძებნა';
+$lang['media_file']            = 'ფაილი';
+$lang['media_viewtab']         = 'ჩვენება';
+$lang['media_edittab']         = 'რედაქტირება';
+$lang['media_historytab']      = 'ისტორია';
+$lang['media_sort_name']       = 'სახელი';
+$lang['media_sort_date']       = 'თარიღი';
+$lang['media_files']           = 'ფაილები %s';
+$lang['media_upload']          = 'ატვირთვა %s';
+$lang['media_search']          = 'ძებნა %s';
+$lang['media_view']            = '%s';
+$lang['media_edit']            = 'რედაქტირება %s';
+$lang['media_history']         = 'ისტორია %s';
+$lang['media_perm_read']       = 'თვენ არ გაქვთ უფლება წაიკითხოთ ეს მასალა';
diff --git a/wiki/inc/lang/kk/jquery.ui.datepicker.js b/wiki/inc/lang/kk/jquery.ui.datepicker.js
new file mode 100644
index 0000000..fa0121f
--- /dev/null
+++ b/wiki/inc/lang/kk/jquery.ui.datepicker.js
@@ -0,0 +1,37 @@
+/* Kazakh (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Dmitriy Karasyov (dmitriy.karasyov@gmail.com). */
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "../widgets/datepicker" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery.datepicker );
+	}
+}( function( datepicker ) {
+
+datepicker.regional.kk = {
+	closeText: "Жабу",
+	prevText: "&#x3C;Алдыңғы",
+	nextText: "Келесі&#x3E;",
+	currentText: "Бүгін",
+	monthNames: [ "Қаңтар","Ақпан","Наурыз","Сәуір","Мамыр","Маусым",
+	"Шілде","Тамыз","Қыркүйек","Қазан","Қараша","Желтоқсан" ],
+	monthNamesShort: [ "Қаң","Ақп","Нау","Сәу","Мам","Мау",
+	"Шіл","Там","Қыр","Қаз","Қар","Жел" ],
+	dayNames: [ "Жексенбі","Дүйсенбі","Сейсенбі","Сәрсенбі","Бейсенбі","Жұма","Сенбі" ],
+	dayNamesShort: [ "жкс","дсн","ссн","срс","бсн","жма","снб" ],
+	dayNamesMin: [ "Жк","Дс","Сс","Ср","Бс","Жм","Сн" ],
+	weekHeader: "Не",
+	dateFormat: "dd.mm.yy",
+	firstDay: 1,
+	isRTL: false,
+	showMonthAfterYear: false,
+	yearSuffix: "" };
+datepicker.setDefaults( datepicker.regional.kk );
+
+return datepicker.regional.kk;
+
+} ) );
diff --git a/wiki/inc/lang/kk/lang.php b/wiki/inc/lang/kk/lang.php
new file mode 100644
index 0000000..cb224d9
--- /dev/null
+++ b/wiki/inc/lang/kk/lang.php
@@ -0,0 +1,129 @@
+<?php
+/**
+ * kazakh language file
+ *
+ * @author Nurgozha Kaliaskarov astana08@gmail.com
+ */
+$lang['encoding']              = 'utf-8';
+$lang['direction']             = 'ltr';
+$lang['doublequoteopening']    = '&quot;';
+$lang['doublequoteclosing']    = '&quot;';
+$lang['singlequoteopening']    = '‘';
+$lang['singlequoteclosing']    = '’';
+$lang['apostrophe']            = '\'';
+$lang['btn_edit']              = 'Бұл мақаланы өңдеү';
+$lang['btn_source']            = 'Бастапқы мәтінді көрсету';
+$lang['btn_show']              = 'Бетті көрсету';
+$lang['btn_create']            = 'Бұл бетті жасау';
+$lang['btn_search']            = 'Іздеу';
+$lang['btn_save']              = 'Сақтау';
+$lang['btn_preview']           = 'Қарап шығу';
+$lang['btn_top']               = 'Жоғары';
+$lang['btn_newer']             = '<<жаңарақ';
+$lang['btn_older']             = 'ескірек>>';
+$lang['btn_revs']              = 'Қайта қараулары';
+$lang['btn_recent']            = 'Жуырдағы өзгерістер';
+$lang['btn_upload']            = 'Еңгізу';
+$lang['btn_cancel']            = 'Болдырмау';
+$lang['btn_index']             = 'Барлық беттері';
+$lang['btn_secedit']           = 'Өңдеу';
+$lang['btn_login']             = 'Кіру';
+$lang['btn_logout']            = 'Шығу';
+$lang['btn_admin']             = 'Басқару';
+$lang['btn_update']            = 'Жаңарту';
+$lang['btn_delete']            = 'Жою';
+$lang['btn_back']              = 'Артқа';
+$lang['btn_backlink']          = 'Кері сілтемелері';
+$lang['btn_subscribe']         = 'Жазылуларды басқару';
+$lang['btn_profile']           = 'Профильді жаңарту';
+$lang['btn_reset']             = 'Түсіру';
+$lang['btn_resendpwd']         = 'Шартты белгінi Өзгерту';
+$lang['btn_draft']             = 'Шимайды өңдеу';
+$lang['btn_recover']           = 'Шимайды қайтару';
+$lang['btn_draftdel']          = 'Шимайды өшіру';
+$lang['btn_revert']            = 'Қалпына келтіру';
+$lang['btn_register']          = 'Тіркеу';
+$lang['btn_apply']             = 'Қолдану/Енгізу';
+$lang['loggedinas']            = 'түпнұсқамен кірген:';
+$lang['user']                  = 'Түпнұсқа';
+$lang['pass']                  = 'Құпиясөз';
+$lang['newpass']               = 'Жаңа құпиясөз';
+$lang['oldpass']               = 'Ағымдағы құпиясөзді растау';
+$lang['passchk']               = 'Тағы бір рет';
+$lang['remember']              = 'Мені сақтау';
+$lang['fullname']              = 'Шын аты';
+$lang['email']                 = 'Е-пошта';
+$lang['profile']               = 'Пайдаланушының профилі';
+$lang['badlogin']              = 'Кешріңіз, түпнұсқа әлде құпиясөз дұрыс емес';
+$lang['minoredit']             = 'Шағын өзгерістер';
+$lang['draftdate']             = 'Шимай сақталғаны';
+$lang['nosecedit']             = 'Бет өзгерді де бөлік тұралы ақпарат ескірді. Толық нұсқасы ашылды.';
+$lang['regmissing']            = 'Кешіріңіз, барлық тармақтары толтыруыңыз керек.';
+$lang['reguexists']            = 'Кешіріңіз, бұл түпнұскамен де пайдаланушы бар.';
+$lang['regsuccess']            = 'Пайдаланушы қосылды әрі құпиясөзін электрондық поштаға жіберді.';
+$lang['regsuccess2']           = 'Пайдаланушы қосылды.';
+$lang['regmailfail']           = 'Құпиясөз хатты жіберуде қате болған сияқты. Мархабат, әкімшімен хабарласыңыз.';
+$lang['regbadmail']            = 'Берілген электрондық пошта бұрыс деп көрінеді - егер бұл қателікті деп ойласаңыз, әкімшіге хабарлаңыз.';
+$lang['regbadpass']            = 'Берілген екі құпиясөз бірдей емес, мархабат. қайтадан көріңіз.';
+$lang['regpwmail']             = 'Сіздің DokuWiki құпиясөзіңіз';
+$lang['reghere']               = 'Есебіңіз әлі жоқ па? Біреуін оңай ашыңыз';
+$lang['profna']                = 'Бұл wiki профиль өзертуді қолдамайды';
+$lang['profnochange']          = 'Өзгеріс жоқ, істейтін ештеңе жоқ.';
+$lang['profnoempty']           = 'Бос есім не email рұқсат етілмейді.';
+$lang['profchanged']           = 'Пайдаланушы профилі сәтті жаңартылған.';
+$lang['pwdforget']             = 'Құпиясөзіңізді ұмыттыңызба? Жаңадан біреуін алыңыз';
+$lang['resendna']              = 'Бұл wiki құпиясөзді қайта жіберуді қолдамайды.';
+$lang['resendpwdmissing']      = 'Кешіріңіз, барлық тармақтары толтыруыңыз керек.';
+$lang['resendpwdnouser']       = 'Кешіріңіз, бұл пайдаланушыны дерекқорымызда тапқан жоқпыз.';
+$lang['resendpwdbadauth']      = 'Кешіріңіз, бұл түпнұсқалық коды бұрыс. Толық растау сілтемені пайдалануыңызды тексеріңіз.';
+$lang['resendpwdconfirm']      = 'Растау сілтеме email арқылы жіберілді.';
+$lang['resendpwdsuccess']      = 'Сіздің жаңа құпиясөзіңіз email арқылы жіберілді.';
+$lang['license']               = 'Басқаша көрсетілген болмаса, бұл wiki-дің мазмұны келесі лицензия бойынша беріледі:';
+$lang['licenseok']             = 'Ескерту: бұл бетті өңдеуіңізбен мазмұныңыз келесі лицензия бойынша беруге келесесіз:';
+$lang['searchmedia']           = 'Іздеу файлдың атауы:';
+$lang['searchmedia_in']        = '%s-мен іздеу:';
+$lang['txt_upload']            = 'Еңгізетін файлды таңдау:';
+$lang['txt_filename']          = 'Келесідей еңгізу (қалауынша):';
+$lang['txt_overwrt']           = 'Бар файлды қайта жазу';
+$lang['lockedby']              = 'Осы уақытта тойтарылған:';
+$lang['lockexpire']            = 'Тойтару келесі уақытта бітеді:';
+$lang['js']['willexpire']      = 'Бұл бетті түзеу тойтаруыңыз бір минутта бітеді. Қақтығыс болмау және тойтару таймерді түсіру үшін қарап шығу пернені басыңыз.';
+$lang['js']['notsavedyet']     = 'Сақталмаған өзгерістер жоғалатын болады.';
+$lang['js']['searchmedia']     = 'Файлдарды іздеу';
+$lang['js']['keepopen']        = 'Таңдаған соң терезе жаппаңыз';
+$lang['js']['hidedetails']     = 'Ұсақтарды жасыру';
+$lang['js']['mediatitle']      = 'Султеме теңшелімдері';
+$lang['js']['mediadisplay']    = 'Сілтеме түрі';
+$lang['js']['mediaalign']      = 'Тегістеуі';
+$lang['js']['mediasize']       = 'Сүреттің өлшемі';
+$lang['js']['mediatarget']     = 'Сілтеме нысанасы';
+$lang['js']['mediaclose']      = 'Жабу';
+$lang['js']['mediainsert']     = 'Еңгізу';
+$lang['js']['mediadisplayimg'] = 'Бұл сүретті көрсету';
+$lang['js']['mediadisplaylnk'] = 'Бұл сілтемені ғана көрсету,';
+$lang['js']['mediasmall']      = 'Шағын нұсқасы';
+$lang['js']['mediamedium']     = 'Орташа нұсқасы';
+$lang['js']['medialarge']      = 'Үлкен нұсқасы';
+$lang['js']['mediaoriginal']   = 'Түпнұсқалық нұсқасы';
+$lang['js']['medialnk']        = 'Толық бетке сілтеме';
+$lang['js']['mediadirect']     = 'Түпнұсқалыққа тұра сілтемесі';
+$lang['js']['medianolnk']      = 'Сілтеме жоқ';
+$lang['js']['medianolink']     = 'Суретті сілтетпеу';
+$lang['js']['medialeft']       = 'Сүретті сол жаққа тегістеу';
+$lang['js']['mediaright']      = 'Сүретті оң жаққа тегістеу';
+$lang['js']['mediacenter']     = 'Сүретті ортаға тегістеу';
+$lang['js']['medianoalign']    = 'Тегістеусіз';
+$lang['js']['linkwiz']         = 'Сілтеме көмекшіci';
+$lang['js']['media_diff']      = 'Өзгеліктердi Көрсету';
+$lang['js']['media_select']    = 'Файлды тандау';
+$lang['mediaselect']           = 'Медиа файлдар';
+$lang['mediaroot']             = 'root';
+$lang['yours']                 = 'Сендердің болжамыңыз';
+$lang['created']               = 'ЖасалFан';
+$lang['mail_new_user']         = 'Жаңа пайдаланушы';
+$lang['qb_chars']              = 'Арнайы белгiлер';
+$lang['btn_img_backto']            = 'Қайта оралу %s';
+$lang['img_format']            = 'Формат:';
+$lang['img_camera']            = 'Камера:';
+$lang['i_chooselang']          = 'Тіл таңдау';
+$lang['i_retry']               = 'Қайталау';
diff --git a/wiki/inc/lang/km/admin.txt b/wiki/inc/lang/km/admin.txt
new file mode 100644
index 0000000..29338b2
--- /dev/null
+++ b/wiki/inc/lang/km/admin.txt
@@ -0,0 +1,3 @@
+====== អ្នកគ្រោង ======
+ខាងក្រោមជាប្រដបប្រដារបស់អ្នកគ្រោង ឌោគូវីគី។
+
diff --git a/wiki/inc/lang/km/backlinks.txt b/wiki/inc/lang/km/backlinks.txt
new file mode 100644
index 0000000..f28068a
--- /dev/null
+++ b/wiki/inc/lang/km/backlinks.txt
@@ -0,0 +1,5 @@
+====== ខ្សែដំណរក្រោយ ======
+នេះជាទំព័រដែលមានដំណរបណ្តពីទំព័រឥឡូវ។
+====== Backlinks ======
+This is a list of pages that seem to link back to the current page.
+
diff --git a/wiki/inc/lang/km/conflict.txt b/wiki/inc/lang/km/conflict.txt
new file mode 100644
index 0000000..7b95fda
--- /dev/null
+++ b/wiki/inc/lang/km/conflict.txt
@@ -0,0 +1,3 @@
+====== មានបុនរាព្រឹត្តិថ្មីៗ ======
+មានបុនរាព្រឹត្តិថ្មី
+
diff --git a/wiki/inc/lang/km/denied.txt b/wiki/inc/lang/km/denied.txt
new file mode 100644
index 0000000..be03714
--- /dev/null
+++ b/wiki/inc/lang/km/denied.txt
@@ -0,0 +1,4 @@
+====== បដិសេធអនុញ្ញាត ======
+
+សូមទុស អ្នកគ្មានអនុញ្ញាតទៅបណ្តទេ។
+
diff --git a/wiki/inc/lang/km/edit.txt b/wiki/inc/lang/km/edit.txt
new file mode 100644
index 0000000..516ea37
--- /dev/null
+++ b/wiki/inc/lang/km/edit.txt
@@ -0,0 +1,3 @@
+កែតម្រូវទំព័រនេះហើយ ចុច«រក្សាតុក»។  មើល [[wiki:syntax|វាក្យ​សម្ពន្ធ]] ជាកម្នូវីគី។
+សំកែសម្រួលបើអ្នកអាច**ច្នៃចរើន**វា។  បើអ្នកចង់សាកពិសោតអ្វីមួយ សំរៀននៅក្នុង
+[[playground:playground|playground]]។
diff --git a/wiki/inc/lang/km/editrev.txt b/wiki/inc/lang/km/editrev.txt
new file mode 100644
index 0000000..097c1da
--- /dev/null
+++ b/wiki/inc/lang/km/editrev.txt
@@ -0,0 +1,2 @@
+**អ្នក ឯក្សារចាស់!**  បើអ្នករក្សាវា អ្នកគុង់តែបង្កើត ថ្មីជាមួយទិន្នន័យនេះ។
+----
diff --git a/wiki/inc/lang/km/index.txt b/wiki/inc/lang/km/index.txt
new file mode 100644
index 0000000..3500508
--- /dev/null
+++ b/wiki/inc/lang/km/index.txt
@@ -0,0 +1,2 @@
+====== លិបិក្រម ======
+នេះជាលិបិក្រមទំព័រទាំងឡាយបញ្ជាដោយ [[doku>wiki:namespaces|នាមថាន]]។
diff --git a/wiki/inc/lang/km/jquery.ui.datepicker.js b/wiki/inc/lang/km/jquery.ui.datepicker.js
new file mode 100644
index 0000000..d8a4596
--- /dev/null
+++ b/wiki/inc/lang/km/jquery.ui.datepicker.js
@@ -0,0 +1,37 @@
+/* Khmer initialisation for the jQuery calendar extension. */
+/* Written by Chandara Om (chandara.teacher@gmail.com). */
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "../widgets/datepicker" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery.datepicker );
+	}
+}( function( datepicker ) {
+
+datepicker.regional.km = {
+	closeText: "ធ្វើ​រួច",
+	prevText: "មុន",
+	nextText: "បន្ទាប់",
+	currentText: "ថ្ងៃ​នេះ",
+	monthNames: [ "មករា","កុម្ភៈ","មីនា","មេសា","ឧសភា","មិថុនា",
+	"កក្កដា","សីហា","កញ្ញា","តុលា","វិច្ឆិកា","ធ្នូ" ],
+	monthNamesShort: [ "មករា","កុម្ភៈ","មីនា","មេសា","ឧសភា","មិថុនា",
+	"កក្កដា","សីហា","កញ្ញា","តុលា","វិច្ឆិកា","ធ្នូ" ],
+	dayNames: [ "អាទិត្យ", "ចន្ទ", "អង្គារ", "ពុធ", "ព្រហស្បតិ៍", "សុក្រ", "សៅរ៍" ],
+	dayNamesShort: [ "អា", "ច", "អ", "ពុ", "ព្រហ", "សុ", "សៅ" ],
+	dayNamesMin: [ "អា", "ច", "អ", "ពុ", "ព្រហ", "សុ", "សៅ" ],
+	weekHeader: "សប្ដាហ៍",
+	dateFormat: "dd-mm-yy",
+	firstDay: 1,
+	isRTL: false,
+	showMonthAfterYear: false,
+	yearSuffix: "" };
+datepicker.setDefaults( datepicker.regional.km );
+
+return datepicker.regional.km;
+
+} ) );
diff --git a/wiki/inc/lang/km/lang.php b/wiki/inc/lang/km/lang.php
new file mode 100644
index 0000000..2dbc0d3
--- /dev/null
+++ b/wiki/inc/lang/km/lang.php
@@ -0,0 +1,202 @@
+<?php
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author     Ratana Lim <aerorat@yahoo.com>
+ */
+$lang['encoding']   = 'utf-8';
+$lang['direction']  = 'ltr';
+$lang['doublequoteopening']  = '«';
+$lang['doublequoteclosing']  = '»';
+$lang['singlequoteopening']  = '‘';//&lsquo;
+$lang['singlequoteclosing']  = '’';//&rsquo;
+$lang['apostrophe']          = '’';//&rsquo;
+
+$lang['btn_edit']   = 'កែទំព័រនេះ';
+$lang['btn_source'] = 'បង្ហាងប្រភពទំព័រ';
+$lang['btn_show']   = 'បង្ហាងទំព័រ';
+$lang['btn_create'] = 'បង្កើតទំព័រនេះ';
+$lang['btn_search'] = 'ស្វែងរក';
+$lang['btn_save']   = 'រក្សាទុក';
+$lang['btn_preview']= 'បង្ហាញ';
+$lang['btn_top']    = 'ទៅលើ';
+$lang['btn_newer']  = '<<ទំព័រទំនើប';
+$lang['btn_older']  = 'ទំព័រថ្មែសម័យ>>';
+$lang['btn_revs']   = 'ទំព័រចាស់ៗ';
+$lang['btn_recent'] = 'ទំព័រថ្មីៗ';
+$lang['btn_upload'] = 'ដាកលើង';
+$lang['btn_cancel'] = 'បោះបង់';
+$lang['btn_index']  = 'លិបិក្រម';
+$lang['btn_secedit']= 'កែ';
+$lang['btn_login']  = 'កត់ចូល';
+$lang['btn_logout'] = 'កត់ចេញ';
+$lang['btn_admin']  = 'អ្នកគ្រប់គ្រង';
+$lang['btn_update'] = 'កែឡើង';
+$lang['btn_delete'] = 'លុបចោល';
+$lang['btn_back']   = 'ត្រឡប់';
+$lang['btn_backlink']    = 'ខ្សែចំណងក្រោយ';
+$lang['btn_subscribe']   = 'ដាក់ដំណឹងផ្លស់ប្តូរ';
+$lang['btn_profile']     = 'កែប្រវត្តិរូប';
+$lang['btn_reset']       = 'កមណត់ឡើងរិញ';
+$lang['btn_draft']    = 'កែគំរោង';
+$lang['btn_recover']  = 'ស្រោះគំរោងឡើង';
+$lang['btn_draftdel'] = 'លុបគំរោង';
+$lang['btn_register'] = 'ចុះឈ្មោះ';//'Register';
+
+$lang['loggedinas'] = 'អ្នកប្រើ:';
+$lang['user']       = 'នាមបម្រើ';
+$lang['pass']       = 'ពាក្សសម្ងត់';
+$lang['newpass']    = 'ពាក្សសម្ងាត់ថ្មី';
+$lang['oldpass']    = 'បន្ជាកពាក្សសម្ងាត់';
+$lang['passchk']    = 'ម្ដងទាត';
+$lang['remember']   = 'ចំណាំខ្ញុំ';
+$lang['fullname']   = 'នាមត្រគោល';
+$lang['email']      = 'អ៊ីមែល';
+$lang['profile']    = 'ប្រវត្តិរូប';// 'User Profile';
+$lang['badlogin']   = 'សុំអាទោស​ នាមបំរើ ឬ ពាក្សសម្ងាតមិនត្រវទេ។';
+$lang['minoredit']  = 'កែបបណ្តិចបណ្តួច';// 'Minor Changes';
+$lang['draftdate']  = 'គំរោង កត់ស្វ័យប្រវត្ត';
+
+$lang['regmissing'] = 'សុំអាទោស​ អ្នកត្រវបំពេញក្របវាល។';
+$lang['reguexists'] = 'សុំអាទោស​ នាមប្រើនេះមានរួចហើ។';
+$lang['regsuccess'] = 'អ្នកប្រើបានបង្កើតហើយ និងពាក្សសម្ងាតក៏បានផ្ញើទៀត។';
+$lang['regsuccess2']= 'អ្នកប្រើបានបង្កើតហើយ។';
+$lang['regmailfail']= 'មើលទៅដុចជាមានកំហុសក្នុង....សុំទាកទងអ្នកក្របក្រង';
+$lang['regbadmail'] = 'អ៊ីមេលអ្នកសាសេមិនត្រូវបញ្ជរ—បើអ្នកកិតថានេះជាកំហុសបដិបត្តិ សុំទាកទងអ្នកក្របគ្រោង។';
+$lang['regbadpass'] = 'គូពាក្សសម្ងាតមិនដូចគ្នាទេ សមសាកទៀត។';
+$lang['regpwmail']  = 'ពាក្សសម្ងាតអ្នក';
+$lang['reghere']    = 'អ្នកឥតមានបញ្ជីនាមបម្រើទេ?  សុំចល់ចុះឈ្មោះធ្វើគណនីសម្របប្រើប្រស';
+
+$lang['profna']       = 'មិនអាចកែ';
+$lang['profnochange'] = 'ឥតផ្លាស់ប្ដូរ ក្មានអ្វីធ្វើទេ។';
+$lang['profnoempty']  = 'នាមេឬអីមេលទទេ';
+$lang['profchanged']  = 'ប្រវត្តិរូបអ្នកប្រើបាន ។';
+
+$lang['pwdforget'] = 'ភ្លិចពាក្សសម្ងាត់ យកមួយទាត។';
+$lang['resendna']  = 'វីគីនេះមិនឧបរំផ្ញើពាក្សសម្ងាតម្ដងទៀតទេ។';
+$lang['resendpwdmissing'] = 'សុំអាទោស​ អ្នកត្រវបំពេញវាល។';
+$lang['resendpwdnouser']  = 'សុំអាទោស​ យាងរកអ្នកប្រើមិនឃើងទេ។';
+$lang['resendpwdbadauth'] = 'សុំអាទោស​ រហស្សលេខអនុញ្ញាតពំអាចប្រើបានទេ។ ខ្សែបន្ត';
+$lang['resendpwdconfirm'] ='ខ្សែបន្ត';
+$lang['resendpwdsuccess'] = 'ពាក្សសម្ងាតអ្នកបានផ្ញើហើយ។';
+
+$lang['txt_upload']   = 'ជ្រើសឯកសារដែលរុញ​ឡើង:';
+$lang['txt_filename'] = 'រុញឡើងជា (ស្រេច​ចិត្ត):';
+$lang['txt_overwrt']  = 'កត់ពីលើ';//'Overwrite existing file';
+$lang['lockedby']     = 'ឥឡូវនេះចកជាប់​:';
+$lang['lockexpire']   = 'សោជាប់ផុត​កំណត់ម៉ោង:';
+$lang['js']['willexpire']   = 'សោអ្នកចំពោះកែតម្រូវទំព័រនេះ ហួសពែលក្នុងមួយនាទី។\nកុំឲ្យមានជម្លោះ ប្រើ «បង្ហាញ»​ ទៅកំណត់​ឡើង​វិញ។';
+
+$lang['js']['notsavedyet'] = 'កម្រែមិនទានរុក្សាទកត្រូវបោះបង់។\nបន្តទៅទាឬទេ?';
+$lang['rssfailed']   = 'មានកំហុសពេលទៅ​ប្រមូល​យកមតិ​ព័ត៌មាន៖ ';
+$lang['nothingfound']= 'រកមិនឃើញអ្វីទេ។';
+
+$lang['mediaselect'] = 'ឯកសារមីឌៀ';
+$lang['uploadsucc']  = 'រុញចូលមានជ័យ';
+$lang['uploadfail']  = 'រុញឡើងបរាជ័យ។ ប្រហែលខុសសិទ្ឋានុញ្ញាត?';
+$lang['uploadwrong'] = 'រុញឡើងត្រូវ​បាន​បដិសេធ។ ឯកសារ';
+$lang['uploadexist'] = 'ឯកសារមានហើយ។ ឥតមានធ្វើអ្វីទេ។';
+$lang['uploadbadcontent'] = 'ធាតុចំរុញឡើងមិនត្រូវកន្ទុយឯកសារ %s ទេ។';
+$lang['uploadspam']  = 'ចំរុញឡើង បង្ខាំង ដៅយ  ';
+$lang['uploadxss']   = 'ចំរុញឡើង បង្ខាំង  ';
+$lang['deletesucc']  = 'ឯកសារ «%s» បានលុបហើយ។';
+$lang['deletefail']  = '«%s» មិនអាចលុបទេ—មើល';
+$lang['mediainuse']  = 'ឯកសារ «%s» ឥតទានលុបទេ—មានគេកំភងទេជាប់ប្រើ។';
+$lang['namespaces']  = 'នាមដ្ឋាន';
+$lang['mediafiles']  = 'ឯកសារទំនេនៅក្នុង';
+
+$lang['js']['keepopen']    = 'ទុកបង្អួចបើក ពេលការជម្រើស';
+$lang['js']['hidedetails'] = 'បាំង';
+$lang['mediausage']  = 'ប្រើ';
+$lang['mediaview']   = 'មើលឯកសារដើម';
+$lang['mediaroot']   = 'ឫស';
+$lang['mediaupload'] = 'រុញឯកសារឡើងទៅនាមដ្ឋាននេះ។ នាមដ្ឋាន «រុញឡើង»';
+$lang['mediaextchange'] = 'កន្ទុយឯកសារផ្លាសពី «%s» ទៅ «%s»!';
+
+$lang['reference']   = 'អនុសាសនចំពោះ';
+$lang['ref_inuse']   = 'ឯកសារមិនអាចលុបពីព្រោះវានៅចាប់ប្រើដៅទំព័រ៖';
+$lang['ref_hidden']  = 'អនុសាសនខ្លះនៅលើទំព័រអ្នកគ្មានសេធអនុញ្ញាត';
+
+$lang['hits']       = 'ត្រូវ';
+$lang['quickhits']  = 'ឈ្មោះទំព័រប្រៀបដូច';
+$lang['toc']        = 'មាតិកា';
+$lang['current']    = 'ឥឡៅវ';
+$lang['yours']      = 'តំណែអ្នាក';
+$lang['diff']       = 'បង្ហាងអសទិសភាពជាមួយតំណែឥឡូវ ';
+$lang['line']       = 'ខ្សែ';
+$lang['breadcrumb'] = 'ដាន:';
+$lang['youarehere'] = 'ដាន:';
+$lang['lastmod']    = 'ពេលកែចុងក្រោយ:';
+$lang['by']         = 'និពន្ឋដោយ';
+$lang['deleted']    = 'យកចេញ';
+$lang['created']    = 'បង្កើត';
+$lang['external_edit'] = 'កំរេពីក្រៅ';
+$lang['summary']    = 'កែតម្រា';
+
+$lang['mail_newpage']  = 'ថែមទំព័រ';
+$lang['mail_changed']  = 'ទំព័រប្រែប្រួល';
+$lang['mail_new_user'] = 'អ្នកប្រើថ្មី';
+$lang['mail_upload']   = 'រុញអក្សាលើង';
+
+$lang['qb_bold']    = 'ឃ្វាមក្រស';
+$lang['qb_italic']  = 'ឃ្វាមជ្រៀង';
+$lang['qb_underl']  = 'ឃ្វាម';
+$lang['qb_code']    = 'ឃ្វាមក្បួន';
+$lang['qb_strike']  = 'ឃ្វាម';
+$lang['qb_h1']      = 'និវេទន៍ទី១';
+$lang['qb_h2']      = 'និវេទន៍ទី២';
+$lang['qb_h3']      = 'និវេទន៍ទី៣';
+$lang['qb_h4']      = 'និវេទន៍ទី៤';
+$lang['qb_h5']      = 'និវេទន៍ទី៥';
+$lang['qb_link']    = 'ខ្សែបន្តក្នុង';
+$lang['qb_extlink'] = 'ខ្សែបន្តក្រៅ';
+$lang['qb_hr']      = 'បន្ទាផ្ដេក';
+$lang['qb_ol']      = 'តារាងត្រៀប';
+$lang['qb_ul']      = 'តារាងអត្រៀប';
+$lang['qb_media']   = 'បន្ថែមរូនឹងឯកសារឥទៀត';
+$lang['qb_sig']     = 'ស៊កហត្ថលេខា';
+$lang['qb_smileys'] = 'សញ្ញាអារម្មណ៍';
+$lang['qb_chars']   = 'អក្ខរៈពិសេស';
+
+$lang['js']['del_confirm']= 'លុប';
+
+$lang['metaedit']    = 'កែទិន្នន័យអរូប';//'Edit Metadata';
+$lang['metasaveerr'] = 'ពំអាចកត់រទិន្នន័យអរូប';//'Writing metadata failed';
+$lang['metasaveok']  = 'ទិន្នន័យអរូប';
+$lang['btn_img_backto']  = 'ថយក្រោយ%s';
+$lang['img_title']   = 'អភិធេយ្យ:';
+$lang['img_caption'] = 'ចំណងជើង:';
+$lang['img_date']    = 'ថ្ងៃខែ:';//'Date';
+$lang['img_fname']   = 'ឈ្មោះឯកសារ:';
+$lang['img_fsize']   = 'ទំហំ:';//'Size';
+$lang['img_artist']  = 'អ្នកថតរូប:';
+$lang['img_copyr']   = 'រក្សា​សិទ្ធិ:';
+$lang['img_format']  = 'ធុនប្រភេទ:';
+$lang['img_camera']  = 'គ្រឿងថត:';
+$lang['img_keywords']= 'មេពាក្ស:';//'Keywords';
+
+/* auth.class language support */
+$lang['authtempfail']    = 'ការផ្ទៀងផ្ទាត់​ភាព​​ត្រឹមត្រូវឥតដំនេ។ ប្រើ ....';
+
+/* installer strings */
+$lang['i_chooselang'] = 'រើសពាស្សាអ្នក';
+$lang['i_installer']  = 'ដំឡើងឌោគូវីគី';
+$lang['i_wikiname']   = 'នាមវីគី';
+$lang['i_enableacl']  = 'បើកប្រើ (អនុសាស)';
+$lang['i_superuser']  = 'អ្នកកំពូល';
+$lang['i_problems']   = 'កម្មវិធី​ដំឡើងបានប៉ះឧបសគ្គ។ អ្នកមិនអាចបន្តទៅទៀត ដល់អ្នកជួសជុលវា។';
+$lang['i_modified']   = '';
+$lang['i_permfail']   = '<code>%s</code> មិនអាចសាស';
+$lang['i_confexists'] = '<code>%s</code> មានហាយ';
+$lang['i_writeerr']   = 'មិនអាចបណ្កើ<code>%s</code>។ អ្នកត្រវការពិនិត្យអធិក្រឹតិរបស់ថតនឹងឯកសារ។';
+$lang['i_success']    = '';
+$lang['i_failure']    = 'ពលសាសារ';
+$lang['i_policy']     = 'បញ្ជីអនុញ្ញតផ្ដើម';
+$lang['i_pol0']       = 'វីគីបើកចំហ';
+$lang['i_pol1']       = 'វីគីសធារណៈ';
+$lang['i_pol2']       = 'វីគីបិទជិត';
+
+$lang['i_retry']      = 'ម្តងទៀត';
+
+//Setup VIM: ex: et ts=2 :
+$lang['email_signature_text'] = 'អ៊ីមេលនេះបន្ចេអពីឌោគូវីគីនៅ
+@DOKUWIKIURL@';
diff --git a/wiki/inc/lang/km/login.txt b/wiki/inc/lang/km/login.txt
new file mode 100644
index 0000000..2149d9c
--- /dev/null
+++ b/wiki/inc/lang/km/login.txt
@@ -0,0 +1,5 @@
+====== កត់ចូល ======
+
+អ្នកមិនទាន់។
+អ្នកត្រូវការអនុញ្ញាឲ្យកត់តនំបានចូល។
+
diff --git a/wiki/inc/lang/km/newpage.txt b/wiki/inc/lang/km/newpage.txt
new file mode 100644
index 0000000..4b2b4e2
--- /dev/null
+++ b/wiki/inc/lang/km/newpage.txt
@@ -0,0 +1,4 @@
+====== ឥតទានមានទេ ======
+អ្នកតាមត្រសៃខ្សែដែលគ្មានទំព័រ។
+បើ
+
diff --git a/wiki/inc/lang/km/norev.txt b/wiki/inc/lang/km/norev.txt
new file mode 100644
index 0000000..7ca1189
--- /dev/null
+++ b/wiki/inc/lang/km/norev.txt
@@ -0,0 +1,2 @@
+====== ឥតមានបុនរាព្រឹត្តិទេ ======
+បុនរាព្រឹត្តិពុំមានទេ។ សុំប្រើ «ទំព័រចាស់ៗ» ទៅមើលបញ្ជីប្រវត្តទំព័រចាស់រូបស់អត្ថបទនេះ។
diff --git a/wiki/inc/lang/km/password.txt b/wiki/inc/lang/km/password.txt
new file mode 100644
index 0000000..8cdfcd8
--- /dev/null
+++ b/wiki/inc/lang/km/password.txt
@@ -0,0 +1,6 @@
+សួរស្ដី @FULLNAME@!
+
+នេះជាបញ្ជីប្រើប្រះរុបស @TITLE@ នៅ @DOKUWIKIURL@
+
+នាមបង្រើ៖  @LOGIN@
+ពាក្សសម្ងាត៖ @PASSWORD@
diff --git a/wiki/inc/lang/km/pwconfirm.txt b/wiki/inc/lang/km/pwconfirm.txt
new file mode 100644
index 0000000..34051aa
--- /dev/null
+++ b/wiki/inc/lang/km/pwconfirm.txt
@@ -0,0 +1,9 @@
+សួស្ដី @FULLNAME@!
+
+មានគេសុមស្នើពាក្យ​សម្ងាត់​រុបសឲ្យ@TITLE@ នៅ @DOKUWIKIURL@។
+បើអ្នកមិនជាអ្នកសុមពាក្យ​សម្ងាត់ទេ សុំបស់ចល់អ៊ីមេលនេះ។
+
+
+សុំអះអាងដែលសំណើនេះដោយទៅតាមខ្សែ
+
+@CONFIRM@
diff --git a/wiki/inc/lang/km/recent.txt b/wiki/inc/lang/km/recent.txt
new file mode 100644
index 0000000..14449ea
--- /dev/null
+++ b/wiki/inc/lang/km/recent.txt
@@ -0,0 +1,3 @@
+====== ប្រវត្តិទំព័របច្ចុប្បន្ន ======
+ទំព័រទាំងនេះគឺទំព័រកែប្រែ
+
diff --git a/wiki/inc/lang/km/register.txt b/wiki/inc/lang/km/register.txt
new file mode 100644
index 0000000..b850c2e
--- /dev/null
+++ b/wiki/inc/lang/km/register.txt
@@ -0,0 +1,7 @@
+====== អ្នកប្រើថ្មី ======
+
+Fill in all the information below to create a new account in this wiki.
+Make sure you supply a **valid e-mail address** - if you are not asked
+to enter a password here, a new one will be sent to that address.
+The login name should be a valid [[doku>wiki:pagename|pagename]].
+
diff --git a/wiki/inc/lang/km/revisions.txt b/wiki/inc/lang/km/revisions.txt
new file mode 100644
index 0000000..a15186d
--- /dev/null
+++ b/wiki/inc/lang/km/revisions.txt
@@ -0,0 +1,4 @@
+====== ប្រវត្តិទំព័រចាស់ ======
+ទាំងនេះគឺប្រវត្តិទំព័រចាស់រុបសអត្ថបទនេះ។
+ជ្រើសខ្សែទំព័រពីខាងក្រោមហើយ ចុត «កែទំព័រនេះ» រួចហើយរក្សាវាទុក។
+
diff --git a/wiki/inc/lang/kn/admin.txt b/wiki/inc/lang/kn/admin.txt
new file mode 100644
index 0000000..2897218
--- /dev/null
+++ b/wiki/inc/lang/kn/admin.txt
@@ -0,0 +1,2 @@
+====== ಆಡಳಿತಾತ್ಮಕ ======
+ಈ ಕೆಳಗೆ ಡಾಕುವಿಕಿ(DokuWiki)ಯಲ್ಲಿರುವ ಆಡಳಿತಾತ್ಮಕ ಕಾರ್ಯಗಳ ಪಟ್ಟಿಯನ್ನು ನೋಡಬಹುದು.
\ No newline at end of file
diff --git a/wiki/inc/lang/kn/adminplugins.txt b/wiki/inc/lang/kn/adminplugins.txt
new file mode 100644
index 0000000..0b00527
--- /dev/null
+++ b/wiki/inc/lang/kn/adminplugins.txt
@@ -0,0 +1 @@
+===== ಹೆಚ್ಚುವರಿ ಪ್ಲಗ್ ಇನ್ ಗಳು =====
\ No newline at end of file
diff --git a/wiki/inc/lang/kn/backlinks.txt b/wiki/inc/lang/kn/backlinks.txt
new file mode 100644
index 0000000..68ef78b
--- /dev/null
+++ b/wiki/inc/lang/kn/backlinks.txt
@@ -0,0 +1,2 @@
+====== ಹಿಂಕೊಂಡಿಗಳು ======
+ಹಾಲಿ ಪುಟಕ್ಕೆ ಹಿಂದಕ್ಕೆ ಕೊಂಡಿಯಿರಬಹುದಾದಂತಹ ಪುಟಗಳ ಪಟ್ಟಿಯಿದು.
\ No newline at end of file
diff --git a/wiki/inc/lang/kn/conflict.txt b/wiki/inc/lang/kn/conflict.txt
new file mode 100644
index 0000000..880639f
--- /dev/null
+++ b/wiki/inc/lang/kn/conflict.txt
@@ -0,0 +1,4 @@
+====== ಹೊಸ ಅವತರಣಿಕೆ ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ  ======
+ನೀವು ಸಂಪಾದಿಸಿದ ಕಡತದ ಇನ್ನೂ ಹೊಸ ಆವೃತ್ತಿ ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ. ನೀವು ಸಂಪಾದಿಸುತ್ತಿರುವಾಗ ಬೇರೊಬ್ಬರು ಅದೇ ಕಡತವನ್ನು ಮಾರ್ಪಡಿಸಿದರೆ ಹೀಗಾಗುತ್ತದೆ.
+
+ಕೆಳಗೆ ತೋರಿಸಿರುವ ವ್ಯತ್ಯಾಸಗಳನ್ನು ಕೂಲಂಕುಶವಾಗಿ ಪರಿಶೀಲಿಸಿ, ನಂತರ ಯಾವ ಆವೃತ್ತಿಯನ್ನು ಇಟ್ಟುಕೊಳ್ಳಬೇಕೆಂದು ನಿರ್ಧರಿಸಿ. ನೀವು "ಉಳಿಸು" ಅನ್ನು ಆಯ್ಕೆ ಮಾಡಿಕೊಂಡರೆ ನಿಮ್ಮ ಆವೃತ್ತಿ ಉಳಿದುಕೊಳ್ಳುತ್ತದೆ. ನೀವು "ರದ್ದು ಮಾಡು" ಅನ್ನು ಆಯ್ಕೆ ಮಾಡಿಕೊಂಡರೆ ಹಾಲಿ ಆವೃತ್ತಿ ಉಳಿಯುತ್ತದೆ.
\ No newline at end of file
diff --git a/wiki/inc/lang/ko/admin.txt b/wiki/inc/lang/ko/admin.txt
new file mode 100644
index 0000000..2f81e89
--- /dev/null
+++ b/wiki/inc/lang/ko/admin.txt
@@ -0,0 +1,3 @@
+====== 관리 ======
+
+도쿠위키에서 사용할 수 있는 관리 작업 목록을 아래에서 찾을 수 있습니다.
\ No newline at end of file
diff --git a/wiki/inc/lang/ko/adminplugins.txt b/wiki/inc/lang/ko/adminplugins.txt
new file mode 100644
index 0000000..2c436d6
--- /dev/null
+++ b/wiki/inc/lang/ko/adminplugins.txt
@@ -0,0 +1 @@
+===== 추가적인 플러그인 =====
\ No newline at end of file
diff --git a/wiki/inc/lang/ko/backlinks.txt b/wiki/inc/lang/ko/backlinks.txt
new file mode 100644
index 0000000..457974d
--- /dev/null
+++ b/wiki/inc/lang/ko/backlinks.txt
@@ -0,0 +1,3 @@
+====== 역링크 ======
+
+현재 문서를 가리키는 링크가 있는 문서 목록입니다.
\ No newline at end of file
diff --git a/wiki/inc/lang/ko/conflict.txt b/wiki/inc/lang/ko/conflict.txt
new file mode 100644
index 0000000..b542033
--- /dev/null
+++ b/wiki/inc/lang/ko/conflict.txt
@@ -0,0 +1,5 @@
+====== 새 판 있음 ======
+
+편집한 문서의 새 판이 있습니다. 당신이 편집하고 있는 동안 다른 사용자가 문서를 바꾸면 이런 일이 생길 수 있습니다.
+
+아래의 차이를 철저하게 검토하고 어떤 판을 저장하실지 결정하세요. ''저장''을 선택하면 당신의 판이 저장됩니다. ''취소''를 선택하면 현재 판이 유지됩니다.
\ No newline at end of file
diff --git a/wiki/inc/lang/ko/denied.txt b/wiki/inc/lang/ko/denied.txt
new file mode 100644
index 0000000..bf82fbd
--- /dev/null
+++ b/wiki/inc/lang/ko/denied.txt
@@ -0,0 +1,3 @@
+====== 권한 거절 ======
+
+죄송하지만 계속할 수 있는 권한이 없습니다.
\ No newline at end of file
diff --git a/wiki/inc/lang/ko/diff.txt b/wiki/inc/lang/ko/diff.txt
new file mode 100644
index 0000000..3fef832
--- /dev/null
+++ b/wiki/inc/lang/ko/diff.txt
@@ -0,0 +1,3 @@
+====== 차이 ======
+
+문서의 선택한 두 판 사이의 차이를 보여줍니다.
\ No newline at end of file
diff --git a/wiki/inc/lang/ko/draft.txt b/wiki/inc/lang/ko/draft.txt
new file mode 100644
index 0000000..bb6dc8c
--- /dev/null
+++ b/wiki/inc/lang/ko/draft.txt
@@ -0,0 +1,5 @@
+====== 문서 초안 있음 ======
+
+이 문서의 마지막 편집 세션은 올바르게 끝나지 않았습니다. 도쿠위키는 작업 도중 자동으로 저장된 초안을 사용해 편집을 계속 할 수 있습니다. 마지막 세션 동안 저장된 초안을 아래에서 볼 수 있습니다.
+
+비정상적으로 끝난 편집 세션을 **복구**할지 여부를 결정하고, 자동으로 저장되었던 초안을 **삭제**하거나 편집 과정을 **취소**하세요.
\ No newline at end of file
diff --git a/wiki/inc/lang/ko/edit.txt b/wiki/inc/lang/ko/edit.txt
new file mode 100644
index 0000000..70b24ac
--- /dev/null
+++ b/wiki/inc/lang/ko/edit.txt
@@ -0,0 +1 @@
+문서를 편집하고 ''저장''을 누르세요. 위키 구문은 [[wiki:syntax]]를 참조하세요. 문서를 **더 좋게 만들 자신이 있을 때**에만 편집하세요. 연습을 하고 싶다면 먼저 [[playground:playground|연습장]]에 가서 연습하세요.
\ No newline at end of file
diff --git a/wiki/inc/lang/ko/editrev.txt b/wiki/inc/lang/ko/editrev.txt
new file mode 100644
index 0000000..530b38d
--- /dev/null
+++ b/wiki/inc/lang/ko/editrev.txt
@@ -0,0 +1,2 @@
+**문서의 이전 판을 선택했습니다!** 저장하면 이 자료로 새 판을 만듭니다.
+----
\ No newline at end of file
diff --git a/wiki/inc/lang/ko/index.txt b/wiki/inc/lang/ko/index.txt
new file mode 100644
index 0000000..ce94e09
--- /dev/null
+++ b/wiki/inc/lang/ko/index.txt
@@ -0,0 +1,3 @@
+====== 사이트맵 ======
+
+[[doku>ko:namespaces|이름공간]] 순으로 정렬한 모든 문서의 사이트맵입니다.
\ No newline at end of file
diff --git a/wiki/inc/lang/ko/install.html b/wiki/inc/lang/ko/install.html
new file mode 100644
index 0000000..ecc0d3c
--- /dev/null
+++ b/wiki/inc/lang/ko/install.html
@@ -0,0 +1,22 @@
+<p>이 페이지는 <a href="http://dokuwiki.org">도쿠위키</a>의 첫
+설치와 환경 설정을 도와줍니다. 이 설치 프로그램에 대한 자세한 정보는
+<a href="http://dokuwiki.org/ko:installer">설명문 페이지</a>에서
+볼 수 있습니다.</p>
+
+<p>도쿠위키는 위키 문서와 해당 문서와 관련된 정보(예를 들어 그림,
+검색 색인, 이전 판 문서 등)를 저장하기 위해 일반적인 텍스트 파일을
+사용합니다. 성공적으로 작동하려면 도쿠위키는 이 파일을 담고
+있는 디렉토리에 대한 쓰기 권한이 <strong>있어야</strong> 합니다.
+이 설치 프로그램은 디렉토리 권한을 설정할 수 없습니다. 보통
+직접 명령 셸에 수행하거나 호스팅을 사용한다면, FTP나 호스팅
+제어판(예를 들어 CPanel)을 통해 수행해야 합니다.</p>
+
+<p>이 설치 프로그램은 관리자로 로그인하고 나서 플러그인 설치, 사용자 관리,
+위키 문서로의 접근 관리와 환경 설정을 바꾸기 위한 도쿠위키의 관리 메뉴에
+접근할 수 있는, <acronym title="access control list; 접근 제어 목록">ACL</acronym>에
+대한 도쿠위키 환경을 설정합니다. 도쿠위키가 작동하는데 필요하지 않지만,
+도쿠위키를 쉽게 관리할 수 있도록 해줍니다.</p>
+
+<p>숙련된 사용자나 특수한 설치가 필요한 사용자에게 자세한 내용은
+<a href="http://dokuwiki.org/ko:install">설치 지침</a>과
+<a href="http://dokuwiki.org/ko:config">환경 설정</a> 링크를 사용해야 합니다.</p>
diff --git a/wiki/inc/lang/ko/jquery.ui.datepicker.js b/wiki/inc/lang/ko/jquery.ui.datepicker.js
new file mode 100644
index 0000000..8879a99
--- /dev/null
+++ b/wiki/inc/lang/ko/jquery.ui.datepicker.js
@@ -0,0 +1,37 @@
+/* Korean initialisation for the jQuery calendar extension. */
+/* Written by DaeKwon Kang (ncrash.dk@gmail.com), Edited by Genie and Myeongjin Lee. */
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "../widgets/datepicker" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery.datepicker );
+	}
+}( function( datepicker ) {
+
+datepicker.regional.ko = {
+	closeText: "닫기",
+	prevText: "이전달",
+	nextText: "다음달",
+	currentText: "오늘",
+	monthNames: [ "1월","2월","3월","4월","5월","6월",
+	"7월","8월","9월","10월","11월","12월" ],
+	monthNamesShort: [ "1월","2월","3월","4월","5월","6월",
+	"7월","8월","9월","10월","11월","12월" ],
+	dayNames: [ "일요일","월요일","화요일","수요일","목요일","금요일","토요일" ],
+	dayNamesShort: [ "일","월","화","수","목","금","토" ],
+	dayNamesMin: [ "일","월","화","수","목","금","토" ],
+	weekHeader: "주",
+	dateFormat: "yy. m. d.",
+	firstDay: 0,
+	isRTL: false,
+	showMonthAfterYear: true,
+	yearSuffix: "년" };
+datepicker.setDefaults( datepicker.regional.ko );
+
+return datepicker.regional.ko;
+
+} ) );
diff --git a/wiki/inc/lang/ko/lang.php b/wiki/inc/lang/ko/lang.php
new file mode 100644
index 0000000..91bd8ca
--- /dev/null
+++ b/wiki/inc/lang/ko/lang.php
@@ -0,0 +1,352 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Seungheon Song <esketch@gmail.com>
+ * @author Hyun Kim <lawfully@gmail.com>
+ * @author jk Lee
+ * @author dongnak <dongnak@gmail.com>
+ * @author Song Younghwan <purluno@gmail.com>
+ * @author Seung-Chul Yoo <dryoo@live.com>
+ * @author erial2 <erial2@gmail.com>
+ * @author Myeongjin <aranet100@gmail.com>
+ * @author Gerrit Uitslag <klapinklapin@gmail.com>
+ * @author Garam <rowain8@gmail.com>
+ * @author Young gon Cha <garmede@gmail.com>
+ * @author hyeonsoft <hyeonsoft@live.co.kr>
+ * @author S.H. Lee <tuders@naver.com>
+ */
+$lang['encoding']              = 'utf-8';
+$lang['direction']             = 'ltr';
+$lang['doublequoteopening']    = '“';
+$lang['doublequoteclosing']    = '”';
+$lang['singlequoteopening']    = '‘';
+$lang['singlequoteclosing']    = '’';
+$lang['apostrophe']            = '’';
+$lang['btn_edit']              = '문서 편집';
+$lang['btn_source']            = '원본 보기';
+$lang['btn_show']              = '문서 보기';
+$lang['btn_create']            = '문서 만들기';
+$lang['btn_search']            = '검색';
+$lang['btn_save']              = '저장';
+$lang['btn_preview']           = '미리 보기';
+$lang['btn_top']               = '맨 위로';
+$lang['btn_newer']             = '<< 더 최근';
+$lang['btn_older']             = '덜 최근 >>';
+$lang['btn_revs']              = '이전 판';
+$lang['btn_recent']            = '최근 바뀜';
+$lang['btn_upload']            = '올리기';
+$lang['btn_cancel']            = '취소';
+$lang['btn_index']             = '사이트맵';
+$lang['btn_secedit']           = '편집';
+$lang['btn_login']             = '로그인';
+$lang['btn_logout']            = '로그아웃';
+$lang['btn_admin']             = '관리';
+$lang['btn_update']            = '업데이트';
+$lang['btn_delete']            = '삭제';
+$lang['btn_back']              = '뒤로';
+$lang['btn_backlink']          = '역링크';
+$lang['btn_subscribe']         = '구독 관리';
+$lang['btn_profile']           = '프로필 업데이트';
+$lang['btn_reset']             = '재설정';
+$lang['btn_resendpwd']         = '새 비밀번호 설정';
+$lang['btn_draft']             = '초안 편집';
+$lang['btn_recover']           = '초안 복구';
+$lang['btn_draftdel']          = '초안 삭제';
+$lang['btn_revert']            = '되돌리기';
+$lang['btn_register']          = '등록';
+$lang['btn_apply']             = '적용';
+$lang['btn_media']             = '미디어 관리자';
+$lang['btn_deleteuser']        = '내 계정 제거';
+$lang['btn_img_backto']        = '%s(으)로 돌아가기';
+$lang['btn_mediaManager']      = '미디어 관리자에서 보기';
+$lang['loggedinas']            = '로그인한 사용자:';
+$lang['user']                  = '사용자 이름';
+$lang['pass']                  = '비밀번호';
+$lang['newpass']               = '새 비밀번호';
+$lang['oldpass']               = '현재 비밀번호 확인';
+$lang['passchk']               = '다시 확인';
+$lang['remember']              = '기억하기';
+$lang['fullname']              = '실명';
+$lang['email']                 = '이메일';
+$lang['profile']               = '사용자 프로필';
+$lang['badlogin']              = '죄송하지만 사용자 이름이나 비밀번호가 잘못되었습니다.';
+$lang['badpassconfirm']        = '죄송하지만 비밀번호가 잘못되었습니다';
+$lang['minoredit']             = '사소한 바뀜';
+$lang['draftdate']             = '초안 자동 저장 시간';
+$lang['nosecedit']             = '한 동안 문서가 바뀌었으며, 문단 정보가 오래되어 문서 전체를 대신 열었습니다.';
+$lang['regmissing']            = '죄송하지만 모든 필드를 채워야 합니다.';
+$lang['reguexists']            = '죄송하지만 같은 이름을 사용하는 사용자가 있습니다.';
+$lang['regsuccess']            = '사용자 계정을 만들었으며 비밀번호는 이메일로 보냈습니다.';
+$lang['regsuccess2']           = '사용자 계정을 만들었습니다.';
+$lang['regfail']               = '사용자 계정을 만들 수 없었습니다.';
+$lang['regmailfail']           = '비밀번호를 이메일로 보내는 동안 오류가 발생했습니다. 관리자에게 문의해주세요!';
+$lang['regbadmail']            = '주어진 이메일 주소가 잘못되었습니다 - 오류라고 생각하면 관리자에게 문의해주세요';
+$lang['regbadpass']            = '두 주어진 비밀번호가 일치하지 않습니다, 다시 입력하세요.';
+$lang['regpwmail']             = '도쿠위키 비밀번호';
+$lang['reghere']               = '계정이 없나요? 계정을 등록하세요';
+$lang['profna']                = '이 위키는 프로필 수정을 할 수 없습니다';
+$lang['profnochange']          = '바뀐 내용이 없습니다.';
+$lang['profnoempty']           = '빈 이름이나 이메일 주소는 허용하지 않습니다.';
+$lang['profchanged']           = '프로필이 성공적으로 바뀌었습니다.';
+$lang['profnodelete']          = '이 위키는 사용자 계정 삭제를 지원하지 않습니다';
+$lang['profdeleteuser']        = '계정 삭제';
+$lang['profdeleted']           = '당신의 사용자 계정이 이 위키에서 삭제되었습니다';
+$lang['profconfdelete']        = '이 위키에서 내 계정을 제거하고 싶습니다. <br/> 이 행동은 되돌릴 수 없습니다.';
+$lang['profconfdeletemissing'] = '선택하지 않은 확인 상자를 확인';
+$lang['proffail']              = '사용자 프로필이 업데이트되지 않았습니다.';
+$lang['pwdforget']             = '비밀번호를 잊으셨나요? 비밀번호를 재설정하세요';
+$lang['resendna']              = '이 위키는 비밀번호 재설정을 지원하지 않습니다.';
+$lang['resendpwd']             = '다음으로 새 비밀번호 보내기';
+$lang['resendpwdmissing']      = '죄송하지만 모든 필드를 채워야 합니다.';
+$lang['resendpwdnouser']       = '죄송하지만 데이터베이스에서 이 사용자를 찾을 수 없습니다.';
+$lang['resendpwdbadauth']      = '죄송하지만 인증 코드가 올바르지 않습니다. 잘못된 확인 링크인지 확인하세요.';
+$lang['resendpwdconfirm']      = '확인 링크를 이메일로 보냈습니다.';
+$lang['resendpwdsuccess']      = '새 비밀번호를 이메일로 보냈습니다.';
+$lang['license']               = '별도로 명시하지 않을 경우, 이 위키의 내용은 다음 라이선스에 따라 사용할 수 있습니다:';
+$lang['licenseok']             = '참고: 이 문서를 편집하면 내용은 다음 라이선스에 따라 배포하는 데 동의합니다:';
+$lang['searchmedia']           = '파일 이름 검색:';
+$lang['searchmedia_in']        = '%s에서 검색';
+$lang['txt_upload']            = '올릴 파일 선택:';
+$lang['txt_filename']          = '올릴 파일 이름 (선택 사항):';
+$lang['txt_overwrt']           = '기존 파일에 덮어쓰기';
+$lang['maxuploadsize']         = '최대 올리기 용량. 파일당 %s.';
+$lang['lockedby']              = '현재 잠근 사용자:';
+$lang['lockexpire']            = '잠금 해제 시간:';
+$lang['js']['willexpire']      = '잠시 후 편집 잠금이 해제됩니다.\n편집 충돌을 피하려면 미리 보기를 눌러 잠금 시간을 다시 설정하세요.';
+$lang['js']['notsavedyet']     = '저장하지 않은 바뀜이 사라집니다.';
+$lang['js']['searchmedia']     = '파일 검색';
+$lang['js']['keepopen']        = '선택할 때 열어 놓은 창을 유지하기';
+$lang['js']['hidedetails']     = '자세한 정보 숨기기';
+$lang['js']['mediatitle']      = '링크 설정';
+$lang['js']['mediadisplay']    = '링크 유형';
+$lang['js']['mediaalign']      = '배치';
+$lang['js']['mediasize']       = '그림 크기';
+$lang['js']['mediatarget']     = '링크 타겟';
+$lang['js']['mediaclose']      = '닫기';
+$lang['js']['mediainsert']     = '넣기';
+$lang['js']['mediadisplayimg'] = '그림을 보여줍니다.';
+$lang['js']['mediadisplaylnk'] = '링크만 보여줍니다.';
+$lang['js']['mediasmall']      = '작게';
+$lang['js']['mediamedium']     = '중간';
+$lang['js']['medialarge']      = '크게';
+$lang['js']['mediaoriginal']   = '원본';
+$lang['js']['medialnk']        = '자세한 정보 문서로 링크';
+$lang['js']['mediadirect']     = '원본으로 직접 링크';
+$lang['js']['medianolnk']      = '링크 없음';
+$lang['js']['medianolink']     = '그림을 링크하지 않음';
+$lang['js']['medialeft']       = '왼쪽으로 그림 배치';
+$lang['js']['mediaright']      = '오른쪽으로 그림 배치';
+$lang['js']['mediacenter']     = '가운데으로 그림 배치';
+$lang['js']['medianoalign']    = '배치하지 않음';
+$lang['js']['nosmblinks']      = 'Windows 공유 파일과의 연결은 Microsoft Internet Explorer에서만 동작합니다.\n그러나 링크를 복사하거나 붙여넣기를 할 수 있습니다.';
+$lang['js']['linkwiz']         = '링크 마법사';
+$lang['js']['linkto']          = '다음으로 연결:';
+$lang['js']['del_confirm']     = '정말 선택된 항목을 삭제하겠습니까?';
+$lang['js']['restore_confirm'] = '정말 이 판으로 되돌리겠습니까?';
+$lang['js']['media_diff']      = '차이 보기:';
+$lang['js']['media_diff_both'] = '나란히 보기';
+$lang['js']['media_diff_opacity'] = '겹쳐 보기';
+$lang['js']['media_diff_portions'] = '쪼개 보기';
+$lang['js']['media_select']    = '파일 선택…';
+$lang['js']['media_upload_btn'] = '올리기';
+$lang['js']['media_done_btn']  = '완료';
+$lang['js']['media_drop']      = '올릴 파일을 여기에 끌어넣으세요';
+$lang['js']['media_cancel']    = '제거';
+$lang['js']['media_overwrt']   = '기존 파일에 덮어쓰기';
+$lang['rssfailed']             = '이 피드를 가져오는 동안 오류가 발생했습니다:';
+$lang['nothingfound']          = '아무 것도 없습니다.';
+$lang['mediaselect']           = '미디어 파일';
+$lang['uploadsucc']            = '올리기 성공';
+$lang['uploadfail']            = '올리기가 실패되었습니다. 잘못된 권한 때문일지도 모릅니다.';
+$lang['uploadwrong']           = '올리기가 거부되었습니다. 금지된 파일 확장자입니다!';
+$lang['uploadexist']           = '파일이 이미 존재합니다.';
+$lang['uploadbadcontent']      = '올린 파일이 %s 파일 확장자와 일치하지 않습니다.';
+$lang['uploadspam']            = '스팸 차단 목록이 올리기를 차단했습니다.';
+$lang['uploadxss']             = '악성 코드의 가능성이 있어 올리기를 차단했습니다.';
+$lang['uploadsize']            = '올린 파일이 너무 큽니다. (최대 %s)';
+$lang['deletesucc']            = '"%s" 파일이 삭제되었습니다.';
+$lang['deletefail']            = '"%s" 파일을 삭제할 수 없습니다 - 권한이 있는지 확인하세요.';
+$lang['mediainuse']            = '"%s" 파일을 삭제할 수 없습니다 - 아직 사용 중입니다.';
+$lang['namespaces']            = '이름공간';
+$lang['mediafiles']            = '사용할 수 있는 파일 목록';
+$lang['accessdenied']          = '이 문서를 볼 권한이 없습니다.';
+$lang['mediausage']            = '이 파일을 참조하려면 다음 문법을 사용하세요:';
+$lang['mediaview']             = '원본 파일 보기';
+$lang['mediaroot']             = '루트';
+$lang['mediaupload']           = '파일을 현재 이름공간으로 올립니다. 하위 이름공간으로 만들려면 선택한 파일 이름 앞에 쌍점(:)으로 구분되는 이름을 붙이면 됩니다. 파일을 드래그 앤 드롭해 선택할 수 있습니다.';
+$lang['mediaextchange']        = '파일 확장자가 .%s에서 .%s(으)로 바뀌었습니다!';
+$lang['reference']             = '다음을 참조';
+$lang['ref_inuse']             = '다음 문서에서 아직 사용 중이므로 파일을 삭제할 수 없습니다:';
+$lang['ref_hidden']            = '문서의 일부 참조는 읽을 수 있는 권한이 없습니다';
+$lang['hits']                  = '조회 수';
+$lang['quickhits']             = '일치하는 문서 이름';
+$lang['toc']                   = '목차';
+$lang['current']               = '현재';
+$lang['yours']                 = '판';
+$lang['diff']                  = '현재 판과의 차이 보기';
+$lang['diff2']                 = '선택한 판 사이의 차이 보기';
+$lang['difflink']              = '차이 보기로 링크';
+$lang['diff_type']             = '차이 보기:';
+$lang['diff_inline']           = '직렬 방식';
+$lang['diff_side']             = '다중 창 방식';
+$lang['diffprevrev']           = '이전 판';
+$lang['diffnextrev']           = '다음 판';
+$lang['difflastrev']           = '마지막 판';
+$lang['diffbothprevrev']       = '양쪽 이전 판';
+$lang['diffbothnextrev']       = '양쪽 다음 판';
+$lang['line']                  = '줄';
+$lang['breadcrumb']            = '추적:';
+$lang['youarehere']            = '현재 위치:';
+$lang['lastmod']               = '마지막으로 수정됨:';
+$lang['by']                    = '저자';
+$lang['deleted']               = '제거됨';
+$lang['created']               = '만듦';
+$lang['restored']              = '이전 판으로 되돌림 (%s)';
+$lang['external_edit']         = '바깥 편집';
+$lang['summary']               = '편집 요약';
+$lang['noflash']               = '이 내용을 표시하기 위해서 <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash 플러그인</a>이 필요합니다.';
+$lang['download']              = '조각 다운로드';
+$lang['tools']                 = '도구';
+$lang['user_tools']            = '사용자 도구';
+$lang['site_tools']            = '사이트 도구';
+$lang['page_tools']            = '문서 도구';
+$lang['skip_to_content']       = '내용으로 건너뛰기';
+$lang['sidebar']               = '사이드바';
+$lang['mail_newpage']          = '문서 추가됨:';
+$lang['mail_changed']          = '문서 바뀜:';
+$lang['mail_subscribe_list']   = '이름공간에서 바뀐 문서:';
+$lang['mail_new_user']         = '새 사용자:';
+$lang['mail_upload']           = '파일 올림:';
+$lang['changes_type']          = '차이 보기';
+$lang['pages_changes']         = '문서';
+$lang['media_changes']         = '미디어 파일';
+$lang['both_changes']          = '문서와 미디어 파일 모두';
+$lang['qb_bold']               = '굵은 글씨';
+$lang['qb_italic']             = '기울인 글씨';
+$lang['qb_underl']             = '밑줄 글씨';
+$lang['qb_code']               = '코드 글씨';
+$lang['qb_strike']             = '취소선 글씨';
+$lang['qb_h1']                 = '1단계 문단 제목';
+$lang['qb_h2']                 = '2단계 문단 제목';
+$lang['qb_h3']                 = '3단계 문단 제목';
+$lang['qb_h4']                 = '4단계 문단 제목';
+$lang['qb_h5']                 = '5단계 문단 제목';
+$lang['qb_h']                  = '문단 제목';
+$lang['qb_hs']                 = '문단 제목 선택';
+$lang['qb_hplus']              = '상위 문단 제목';
+$lang['qb_hminus']             = '하위 문단 제목';
+$lang['qb_hequal']             = '동급 문단 제목';
+$lang['qb_link']               = '안쪽 링크';
+$lang['qb_extlink']            = '바깥 링크';
+$lang['qb_hr']                 = '가로줄';
+$lang['qb_ol']                 = '순서 있는 목록';
+$lang['qb_ul']                 = '순서 없는 목록';
+$lang['qb_media']              = '그림과 다른 파일 추가 (새 창에서 열림)';
+$lang['qb_sig']                = '서명 넣기';
+$lang['qb_smileys']            = '이모티콘';
+$lang['qb_chars']              = '특수 문자';
+$lang['upperns']               = '상위 이름공간으로 이동';
+$lang['metaedit']              = '메타데이터 편집';
+$lang['metasaveerr']           = '메타데이터 쓰기 실패';
+$lang['metasaveok']            = '메타데이터 저장됨';
+$lang['img_title']             = '제목:';
+$lang['img_caption']           = '설명:';
+$lang['img_date']              = '날짜:';
+$lang['img_fname']             = '파일 이름:';
+$lang['img_fsize']             = '크기:';
+$lang['img_artist']            = '촬영자:';
+$lang['img_copyr']             = '저작권:';
+$lang['img_format']            = '포맷:';
+$lang['img_camera']            = '카메라:';
+$lang['img_keywords']          = '키워드:';
+$lang['img_width']             = '너비:';
+$lang['img_height']            = '높이:';
+$lang['subscr_subscribe_success'] = '%s 사용자가 %s 구독 목록에 추가했습니다';
+$lang['subscr_subscribe_error'] = '%s 사용자가 %s 구독 목록에 추가하는데 실패했습니다';
+$lang['subscr_subscribe_noaddress'] = '로그인으로 연결된 주소가 없기 때문에 구독 목록에 추가할 수 없습니다';
+$lang['subscr_unsubscribe_success'] = '%s 사용자가 %s 구독 목록에서 제거했습니다';
+$lang['subscr_unsubscribe_error'] = '%s 사용자가 %s 구독 목록에서 삭제하는데 실패했습니다';
+$lang['subscr_already_subscribed'] = '%s 사용자가 이미 %s에 구독하고 있습니다';
+$lang['subscr_not_subscribed'] = '%s 사용자가 %s에 구독하고 있지 않습니다';
+$lang['subscr_m_not_subscribed'] = '문서나 이름공간에 현재 구독하고 있지 않습니다.';
+$lang['subscr_m_new_header']   = '구독 추가';
+$lang['subscr_m_current_header'] = '현재 구독 중인 문서';
+$lang['subscr_m_unsubscribe']  = '구독 취소';
+$lang['subscr_m_subscribe']    = '구독';
+$lang['subscr_m_receive']      = '받기';
+$lang['subscr_style_every']    = '모든 바뀜을 이메일로 받기';
+$lang['subscr_style_digest']   = '각 문서의 바뀜을 요약 (매 %.2f일 마다)';
+$lang['subscr_style_list']     = '마지막 이메일 이후 바뀐 문서의 목록 (매 %.2f일 마다)';
+$lang['authtempfail']          = '사용자 인증을 일시적으로 사용할 수 없습니다. 만약 계속해서 문제가 발생한다면 위키 관리자에게 문의하시기 바랍니다.';
+$lang['i_chooselang']          = '사용할 언어를 선택하세요';
+$lang['i_installer']           = '도쿠위키 설치 관리자';
+$lang['i_wikiname']            = '위키 이름';
+$lang['i_enableacl']           = 'ACL 활성화 (권장)';
+$lang['i_superuser']           = '슈퍼 사용자';
+$lang['i_problems']            = '설치 관리자가 아래에 나와 있는 몇 가지 문제를 찾았습니다. 문제를 해결하지 전까지 설치를 계속할 수 없습니다.';
+$lang['i_modified']            = '보안 상의 이유로 이 스크립트는 수정되지 않은 새 도쿠위키 설치에서만 동작됩니다.
+                                  다운로드한 압축 패키지를 다시 설치하거나 <a href="http://dokuwiki.org/ko:install">도쿠위키 설치 과정</a>을 참조해서 설치하세요.';
+$lang['i_funcna']              = '<code>%s</code> PHP 함수를 사용할 수 없습니다. 호스트 제공자가 어떤 이유에서인지 막아 놓았을지 모릅니다.';
+$lang['i_phpver']              = 'PHP <code>%s</code> 버전은 필요한 <code>%s</code> 버전보다 오래되었습니다. PHP를 업그레이드할 필요가 있습니다.';
+$lang['i_mbfuncoverload']      = '도쿠위키를 실행하려면 mbstring.func_overload를 php.ini에서 비활성화해야 합니다.';
+$lang['i_permfail']            = '<code>%s</code>는 도쿠위키가 쓰기 가능 권한이 없습니다. 먼저 이 디렉터리에 쓰기 권한이 설정되어야 합니다!';
+$lang['i_confexists']          = '<code>%s</code>(은)는 이미 존재합니다';
+$lang['i_writeerr']            = '<code>%s</code>(을)를 만들 수 없습니다. 먼저 디렉터리/파일 권한을 확인하고 파일을 수동으로 만드세요.';
+$lang['i_badhash']             = 'dokuwiki.php를 인식할 수 없거나 원본 파일이 아닙니다 (해시=<code>%s</code>)';
+$lang['i_badval']              = '<code>%s</code> - 잘못되었거나 빈 값입니다';
+$lang['i_success']             = '환경 설정이 성공적으로 끝났습니다. 지금 install.php를 지워도 상관없습니다.
+                                 <a href="doku.php?id=wiki:welcome">새 도쿠위키</a>로 들어가세요.';
+$lang['i_failure']             = '환경 설정 파일에 쓰는 도중에 오류가 발생했습니다.
+                                  <a href="doku.php?id=wiki:welcome">새 도쿠위키</a>를 사용하기 전에 수동으로 문제를 해결해야 합니다.';
+$lang['i_policy']              = '초기 ACL 정책';
+$lang['i_pol0']                = '열린 위키 (누구나 읽기, 쓰기, 올리기가 가능합니다)';
+$lang['i_pol1']                = '공개 위키 (누구나 읽을 수 있지만, 등록된 사용자만 쓰기와 올리기가 가능합니다)';
+$lang['i_pol2']                = '닫힌 위키 (등록된 사용자만 읽기, 쓰기, 올리기가 가능합니다)';
+$lang['i_allowreg']            = '사용자 자신이 등록할 수 있도록 하기';
+$lang['i_retry']               = '다시 시도';
+$lang['i_license']             = '내용을 배포하기 위한 라이선스를 선택하세요:';
+$lang['i_license_none']        = '라이선스 정보를 보여주지 않습니다';
+$lang['i_pop_field']           = '도쿠위키 경험을 개선하는 데 도움을 주세요:';
+$lang['i_pop_label']           = '한 달에 한 번씩, 도쿠위키 개발자에게 익명의 사용 데이터를 보냅니다';
+$lang['recent_global']         = '현재 <b>%s</b> 이름공간을 구독 중입니다. <a href="%s">전체 위키의 최근 바뀜도 볼 수</a> 있습니다.';
+$lang['years']                 = '%d년 전';
+$lang['months']                = '%d개월 전';
+$lang['weeks']                 = '%d주 전';
+$lang['days']                  = '%d일 전';
+$lang['hours']                 = '%d시간 전';
+$lang['minutes']               = '%d분 전';
+$lang['seconds']               = '%d초 전';
+$lang['wordblock']             = '차단 문구(스팸)를 포함하고 있어서 바뀜을 저장하지 않았습니다.';
+$lang['media_uploadtab']       = '올리기';
+$lang['media_searchtab']       = '검색';
+$lang['media_file']            = '파일';
+$lang['media_viewtab']         = '보기';
+$lang['media_edittab']         = '편집';
+$lang['media_historytab']      = '역사';
+$lang['media_list_thumbs']     = '섬네일';
+$lang['media_list_rows']       = '목록';
+$lang['media_sort_name']       = '이름';
+$lang['media_sort_date']       = '날짜';
+$lang['media_namespaces']      = '이름공간 선택';
+$lang['media_files']           = '%s에 있는 파일';
+$lang['media_upload']          = '%s에 올리기';
+$lang['media_search']          = '%s에서 검색';
+$lang['media_view']            = '%s';
+$lang['media_viewold']         = '%2$s에 있는 %1$s';
+$lang['media_edit']            = '%s 편집';
+$lang['media_history']         = '%s의 역사';
+$lang['media_meta_edited']     = '메타데이터 편집됨';
+$lang['media_perm_read']       = '죄송하지만 파일을 읽을 권한이 없습니다.';
+$lang['media_perm_upload']     = '죄송하지만 파일을 올릴 권한이 없습니다.';
+$lang['media_update']          = '새 판 올리기';
+$lang['media_restore']         = '이 판으로 되돌리기';
+$lang['media_acl_warning']     = '이 목록은 ACL로 제한되어 있고 숨겨진 문서이기 때문에 완전하지 않을 수 있습니다.';
+$lang['currentns']             = '현재 이름공간';
+$lang['searchresult']          = '검색 결과';
+$lang['plainhtml']             = '일반 HTML';
+$lang['wikimarkup']            = '위키 문법';
+$lang['page_nonexist_rev']     = '문서가 %s에 존재하지 않았습니다. 그 뒤로 <a href="%s">%s</a>에 만들어졌습니다.';
+$lang['unable_to_parse_date']  = '"%s" 변수에서 구문 분석할 수 없습니다.';
+$lang['email_signature_text']  = '이 메일은 @DOKUWIKIURL@에서 도쿠위키가 생성했습니다';
diff --git a/wiki/inc/lang/ko/locked.txt b/wiki/inc/lang/ko/locked.txt
new file mode 100644
index 0000000..38832d0
--- /dev/null
+++ b/wiki/inc/lang/ko/locked.txt
@@ -0,0 +1,3 @@
+====== 문서 잠김 ======
+
+이 문서는 다른 사용자가 편집하기 위해 현재 잠겨있습니다. 해당 사용자가 편집을 끝내거나 잠금이 만료될 때까지 기다리세요.
\ No newline at end of file
diff --git a/wiki/inc/lang/ko/login.txt b/wiki/inc/lang/ko/login.txt
new file mode 100644
index 0000000..f8af410
--- /dev/null
+++ b/wiki/inc/lang/ko/login.txt
@@ -0,0 +1,3 @@
+====== 로그인 ======
+
+로그인하지 않았습니다! 아래에서 로그인하세요. 로그인하려면 쿠키를 활성화해야 합니다.
\ No newline at end of file
diff --git a/wiki/inc/lang/ko/mailtext.txt b/wiki/inc/lang/ko/mailtext.txt
new file mode 100644
index 0000000..2b22258
--- /dev/null
+++ b/wiki/inc/lang/ko/mailtext.txt
@@ -0,0 +1,12 @@
+도쿠위키 문서가 추가되거나 바뀌었습니다. 자세한 내용은 다음과 같습니다:
+
+날짜: @DATE@
+브라우저: @BROWSER@
+IP 주소: @IPADDRESS@
+호스트 이름: @HOSTNAME@
+이전 판: @OLDPAGE@
+새 판: @NEWPAGE@
+편집 요약: @SUMMARY@
+사용자: @USER@
+
+@DIFF@
diff --git a/wiki/inc/lang/ko/mailwrap.html b/wiki/inc/lang/ko/mailwrap.html
new file mode 100644
index 0000000..7df0cdc
--- /dev/null
+++ b/wiki/inc/lang/ko/mailwrap.html
@@ -0,0 +1,13 @@
+<html>
+<head>
+    <title>@TITLE@</title>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+</head>
+<body>
+
+@HTMLBODY@
+
+<br /><hr />
+<small>@EMAILSIGNATURE@</small>
+</body>
+</html>
diff --git a/wiki/inc/lang/ko/newpage.txt b/wiki/inc/lang/ko/newpage.txt
new file mode 100644
index 0000000..a553cf9
--- /dev/null
+++ b/wiki/inc/lang/ko/newpage.txt
@@ -0,0 +1,3 @@
+====== 이 주제는 아직 없습니다 ======
+
+아직 없는 주제에 대한 링크를 따라왔습니다. "문서 만들기"를 클릭해 새로 만들 수 있습니다.
\ No newline at end of file
diff --git a/wiki/inc/lang/ko/norev.txt b/wiki/inc/lang/ko/norev.txt
new file mode 100644
index 0000000..5cb7360
--- /dev/null
+++ b/wiki/inc/lang/ko/norev.txt
@@ -0,0 +1,3 @@
+====== 지정한 판 없음 ======
+
+지정한 판이 존재하지 않습니다. 이 문서의 이전 판 목록을 보려면 "이전 판"을 클릭하세요.
\ No newline at end of file
diff --git a/wiki/inc/lang/ko/password.txt b/wiki/inc/lang/ko/password.txt
new file mode 100644
index 0000000..1bd9246
--- /dev/null
+++ b/wiki/inc/lang/ko/password.txt
@@ -0,0 +1,6 @@
+@FULLNAME@님 안녕하세요!
+
+여기에 @DOKUWIKIURL@에서 @TITLE@의 사용자 정보가 있습니다.
+
+로그인: @LOGIN@
+비밀번호: @PASSWORD@
diff --git a/wiki/inc/lang/ko/preview.txt b/wiki/inc/lang/ko/preview.txt
new file mode 100644
index 0000000..eed2b21
--- /dev/null
+++ b/wiki/inc/lang/ko/preview.txt
@@ -0,0 +1,3 @@
+====== 미리 보기 ======
+
+입력한 내용이 어떻게 보일지 미리 보여줍니다. 아직 **저장되지 않았다**는 점을 기억해두세요!
\ No newline at end of file
diff --git a/wiki/inc/lang/ko/pwconfirm.txt b/wiki/inc/lang/ko/pwconfirm.txt
new file mode 100644
index 0000000..dfe32a0
--- /dev/null
+++ b/wiki/inc/lang/ko/pwconfirm.txt
@@ -0,0 +1,10 @@
+@FULLNAME@님 안녕하세요!
+
+누군가가 @DOKUWIKIURL@에 @TITLE@에 대해
+새 비밀번호가 필요하다고 요청했습니다.
+
+새 비밀번호를 요청하지 않았다면 이 이메일을 무시해버리세요.
+
+정말로 당신이 요청을 해서 보내졌는지 확인하려면 다음 링크를 사용하세요.
+
+@CONFIRM@
diff --git a/wiki/inc/lang/ko/read.txt b/wiki/inc/lang/ko/read.txt
new file mode 100644
index 0000000..079b8e1
--- /dev/null
+++ b/wiki/inc/lang/ko/read.txt
@@ -0,0 +1 @@
+이 문서는 읽기 전용입니다. 원본을 볼 수는 있지만 바꿀 수는 없습니다. 문제가 있다고 생각하면 관리자에게 문의하세요.
\ No newline at end of file
diff --git a/wiki/inc/lang/ko/recent.txt b/wiki/inc/lang/ko/recent.txt
new file mode 100644
index 0000000..4dd1964
--- /dev/null
+++ b/wiki/inc/lang/ko/recent.txt
@@ -0,0 +1,3 @@
+====== 최근 바뀜 ======
+
+다음 문서는 최근에 바뀌었습니다.
\ No newline at end of file
diff --git a/wiki/inc/lang/ko/register.txt b/wiki/inc/lang/ko/register.txt
new file mode 100644
index 0000000..4d3df29
--- /dev/null
+++ b/wiki/inc/lang/ko/register.txt
@@ -0,0 +1,3 @@
+====== 새 사용자 등록 ======
+
+이 위키에 새 계정을 만드려면 아래의 모든 내용을 입력하세요. **올바른 이메일 주소**를 사용하세요. 비밀번호를 입력하는 곳이 없다면, 새 비밀번호는 해당 주소로 보내집니다. 사용자 이름은 올바른 [[doku>ko:pagename|문서 이름]]이어야 합니다.
\ No newline at end of file
diff --git a/wiki/inc/lang/ko/registermail.txt b/wiki/inc/lang/ko/registermail.txt
new file mode 100644
index 0000000..adc5a08
--- /dev/null
+++ b/wiki/inc/lang/ko/registermail.txt
@@ -0,0 +1,10 @@
+새 사용자가 등록되었습니다. 자세한 내용은 다음과 같습니다:
+
+사용자 이름: @NEWUSER@
+실명: @NEWNAME@
+이메일: @NEWEMAIL@
+
+날짜: @DATE@
+브라우저: @BROWSER@
+IP 주소: @IPADDRESS@
+호스트 이름: @HOSTNAME@
diff --git a/wiki/inc/lang/ko/resendpwd.txt b/wiki/inc/lang/ko/resendpwd.txt
new file mode 100644
index 0000000..44cd5ad
--- /dev/null
+++ b/wiki/inc/lang/ko/resendpwd.txt
@@ -0,0 +1,3 @@
+====== 새 비밀번호 보내기 ======
+
+이 위키 계정에 대한 새 비밀번호를 요청하기 위해 아래 양식에서 사용자 이름을 입력하세요. 확인 링크는 새로 등록한 이메일 주소로 보냅니다.
\ No newline at end of file
diff --git a/wiki/inc/lang/ko/resetpwd.txt b/wiki/inc/lang/ko/resetpwd.txt
new file mode 100644
index 0000000..cc2ec6a
--- /dev/null
+++ b/wiki/inc/lang/ko/resetpwd.txt
@@ -0,0 +1,3 @@
+====== 새 비밀번호 설정 ======
+
+이 위키에 있는 계정의 새 비밀번호를 입력하세요.
\ No newline at end of file
diff --git a/wiki/inc/lang/ko/revisions.txt b/wiki/inc/lang/ko/revisions.txt
new file mode 100644
index 0000000..ed80dbc
--- /dev/null
+++ b/wiki/inc/lang/ko/revisions.txt
@@ -0,0 +1,3 @@
+====== 이전 판 ======
+
+이 문서의 이전 판은 다음과 같습니다. 이전 판으로 되돌리려면, 아래에서 선택한 다음 ''문서 편집''을 클릭하고 나서 저장하세요.
\ No newline at end of file
diff --git a/wiki/inc/lang/ko/searchpage.txt b/wiki/inc/lang/ko/searchpage.txt
new file mode 100644
index 0000000..9a3d2f3
--- /dev/null
+++ b/wiki/inc/lang/ko/searchpage.txt
@@ -0,0 +1,4 @@
+====== 검색 ======
+
+아래에서 검색 결과를 찾을 수 있습니다. @CREATEPAGEINFO@
+
diff --git a/wiki/inc/lang/ko/showrev.txt b/wiki/inc/lang/ko/showrev.txt
new file mode 100644
index 0000000..91be367
--- /dev/null
+++ b/wiki/inc/lang/ko/showrev.txt
@@ -0,0 +1,2 @@
+**문서의 이전 판입니다!**
+----
\ No newline at end of file
diff --git a/wiki/inc/lang/ko/stopwords.txt b/wiki/inc/lang/ko/stopwords.txt
new file mode 100644
index 0000000..b0be851
--- /dev/null
+++ b/wiki/inc/lang/ko/stopwords.txt
@@ -0,0 +1,39 @@
+# 색인이 만들어지지 않는 단어 목록입니다. (한 줄에 한 단어)
+# 이 파일을 편집할 때 UNIX 줄 종료 문자를 사용해야 합니다.(단일 개행 문자)
+# 3문자 이하 단어는 자동으로 무시되므로 3문자보다 짧은 단어는 포함시킬 필요가 없습니다.
+# http://www.ranks.nl/stopwords/ 을 기준으로 만들어진 목록입니다.
+about
+are
+as
+an
+and
+you
+your
+them
+their
+com
+for
+from
+into
+if
+in
+is
+it
+how
+of
+on
+or
+that
+the
+this
+to
+was
+what
+when
+where
+who
+will
+with
+und
+the
+www
\ No newline at end of file
diff --git a/wiki/inc/lang/ko/subscr_digest.txt b/wiki/inc/lang/ko/subscr_digest.txt
new file mode 100644
index 0000000..bdb46ad
--- /dev/null
+++ b/wiki/inc/lang/ko/subscr_digest.txt
@@ -0,0 +1,15 @@
+안녕하세요!
+
+@TITLE@ 위키의 @PAGE@ 문서가 바뀌었습니다.
+바뀜은 다음과 같습니다:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+이전 판: @OLDPAGE@
+새 판: @NEWPAGE@
+
+
+문서 알림을 취소하려면, @DOKUWIKIURL@에 로그인한 뒤
+@SUBSCRIBE@ 문서를 방문해 문서나 이름공간의 구독을 취소하세요.
diff --git a/wiki/inc/lang/ko/subscr_form.txt b/wiki/inc/lang/ko/subscr_form.txt
new file mode 100644
index 0000000..ed380cc
--- /dev/null
+++ b/wiki/inc/lang/ko/subscr_form.txt
@@ -0,0 +1,3 @@
+====== 구독 관리 ======
+
+이 페이지는 현재의 문서와 이름공간의 구독을 관리할 수 있도록 해줍니다.
\ No newline at end of file
diff --git a/wiki/inc/lang/ko/subscr_list.txt b/wiki/inc/lang/ko/subscr_list.txt
new file mode 100644
index 0000000..69a2d53
--- /dev/null
+++ b/wiki/inc/lang/ko/subscr_list.txt
@@ -0,0 +1,11 @@
+안녕하세요!
+
+@TITLE@ 위키의 @PAGE@ 문서가 바뀌었습니다.
+문서의 바뀜은 다음과 같습니다:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+문서의 알림을 취소하려면, @DOKUWIKIURL@에 로그인한 뒤
+@SUBSCRIBE@ 문서를 방문해 문서나 이름공간의 구독을 취소하세요.
diff --git a/wiki/inc/lang/ko/subscr_single.txt b/wiki/inc/lang/ko/subscr_single.txt
new file mode 100644
index 0000000..425d0d9
--- /dev/null
+++ b/wiki/inc/lang/ko/subscr_single.txt
@@ -0,0 +1,17 @@
+안녕하세요!
+
+@TITLE@ 위키의 @PAGE@ 문서가 바뀌었습니다.
+바뀜은 다음과 같습니다:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+날짜: @DATE@
+사용자: @USER@
+편집 요약: @SUMMARY@
+이전 판: @OLDPAGE@
+새 판: @NEWPAGE@
+
+문서의 알림을 취소하려면, @DOKUWIKIURL@에 로그인한 뒤
+@SUBSCRIBE@ 문서를 방문해 문서나 이름공간의 구독을 취소하세요.
diff --git a/wiki/inc/lang/ko/updateprofile.txt b/wiki/inc/lang/ko/updateprofile.txt
new file mode 100644
index 0000000..0ddea30
--- /dev/null
+++ b/wiki/inc/lang/ko/updateprofile.txt
@@ -0,0 +1,3 @@
+====== 계정 프로필 업데이트 ======
+
+바꾸고 싶은 항목을 입력하세요. 사용자 이름은 바꿀 수 없습니다.
\ No newline at end of file
diff --git a/wiki/inc/lang/ko/uploadmail.txt b/wiki/inc/lang/ko/uploadmail.txt
new file mode 100644
index 0000000..1b6e55c
--- /dev/null
+++ b/wiki/inc/lang/ko/uploadmail.txt
@@ -0,0 +1,11 @@
+도쿠위키가 파일을 올렸습니다. 자세한 정보는 다음과 같습니다:
+
+파일: @MEDIA@
+이전 판: @OLD@
+날짜: @DATE@
+브라우저: @BROWSER@
+IP 주소: @IPADDRESS@
+호스트 이름: @HOSTNAME@
+크기: @SIZE@
+MIME 유형: @MIME@
+사용자: @USER@
diff --git a/wiki/inc/lang/ku/backlinks.txt b/wiki/inc/lang/ku/backlinks.txt
new file mode 100644
index 0000000..5fa2ddf
--- /dev/null
+++ b/wiki/inc/lang/ku/backlinks.txt
@@ -0,0 +1,4 @@
+====== Girêdanên paş ======
+
+Di rûpelên di vê lîsteyê de girêdanên ji vê rûpelê re hene.
+
diff --git a/wiki/inc/lang/ku/conflict.txt b/wiki/inc/lang/ku/conflict.txt
new file mode 100644
index 0000000..e139dce
--- /dev/null
+++ b/wiki/inc/lang/ku/conflict.txt
@@ -0,0 +1,6 @@
+====== Guhertoyeke nûtir heye ======
+
+Guhertoyeke nûtir a belgeya ku tu biguherînî heye. Sedema wê, bikarhênerkê/î din di hema demê de belge diguherîne.
+
+Examine the differences shown below thoroughly, then decide which version to keep. If you choose ''save'', your version will be saved. Hit ''cancel'' to keep the current version.
+
diff --git a/wiki/inc/lang/ku/diff.txt b/wiki/inc/lang/ku/diff.txt
new file mode 100644
index 0000000..934ffb6
--- /dev/null
+++ b/wiki/inc/lang/ku/diff.txt
@@ -0,0 +1,4 @@
+====== Cuyawazî ======
+
+Li vê derê cuyawaziyên nav revîziyona hilbijartî û verziyona aniha tên nîşan dan.
+
diff --git a/wiki/inc/lang/ku/edit.txt b/wiki/inc/lang/ku/edit.txt
new file mode 100644
index 0000000..3a259dc
--- /dev/null
+++ b/wiki/inc/lang/ku/edit.txt
@@ -0,0 +1,2 @@
+Rûpelê biguherîne û ''Tomar bike'' bitikîne. Ji bo sîntaksa wîkiyê binihêre [[wiki:syntax]]. Ji kerema xwe rûpelê bi tenê biguherîne, heke tû dikarî **baştir** bikî.  Heke tu dixwazî çend tiştan biceribînî, biçe [[wiki:playground]]. Li vê derê tu dikarî her tiştî biceribînî.
+
diff --git a/wiki/inc/lang/ku/index.txt b/wiki/inc/lang/ku/index.txt
new file mode 100644
index 0000000..4014044
--- /dev/null
+++ b/wiki/inc/lang/ku/index.txt
@@ -0,0 +1,3 @@
+====== Îndeks ======
+
+Ev îndeksa hemû rûpelên heyî ye. Rûpel li gora [[doku>namespaces|namespace]] hatin birêzkirin.
\ No newline at end of file
diff --git a/wiki/inc/lang/ku/lang.php b/wiki/inc/lang/ku/lang.php
new file mode 100644
index 0000000..3bfb5e6
--- /dev/null
+++ b/wiki/inc/lang/ku/lang.php
@@ -0,0 +1,45 @@
+<?php
+/**
+ * kurdish language file
+ *
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @translator Erdal Ronahî <erdal.ronahi@gmail.com>
+ */
+$lang['encoding']   = 'utf-8';
+$lang['direction']  = 'ltr';
+
+$lang['btn_edit']   = 'Vê rûpelê biguherîne';
+$lang['btn_source'] = 'Çavkaniya rûpelê nîşan bide';
+$lang['btn_show']   = 'Rûpelê nîşan bide';
+$lang['btn_create'] = 'Vê rûpelê biafirîne';
+$lang['btn_search'] = 'Lêbigere';
+$lang['btn_save']   = 'Tomar bike';
+$lang['btn_preview']= 'Pêşdîtin';
+$lang['btn_top']    = 'Biçe ser';
+$lang['btn_newer']  = '<< nûtir';
+$lang['btn_older']  = 'kevntir >>';
+$lang['btn_revs']   = 'Revîziyonên kevn';
+$lang['btn_recent'] = 'Guherandinên dawî';
+$lang['btn_upload'] = 'Bar bike';
+$lang['btn_cancel'] = 'Betal';
+$lang['btn_index']  = 'Îndeks';
+$lang['btn_secedit']= 'Biguherîne';
+$lang['btn_login']  = 'Têkeve';
+$lang['btn_logout'] = 'Derkeve';
+$lang['btn_admin']  = 'Admin';
+$lang['btn_update'] = 'Rojanekirin';
+$lang['btn_delete'] = 'Jê bibe';
+$lang['btn_back']   = 'Paş';
+$lang['btn_backlink']    = 'Girêdanên paş';
+
+$lang['nothingfound']= 'Tiştek nehat dîtin.';
+$lang['reference']   = 'Referansa';
+$lang['toc']        = 'Tabloya Navêrokê';
+$lang['line']       = 'Rêz';
+$lang['breadcrumb'] = 'Şop:';
+$lang['lastmod']    = 'Guherandina dawî:';
+$lang['deleted']    = 'hat jê birin';
+$lang['created']    = 'hat afirandin';
+$lang['summary']    = 'Kurteya guhartinê';
+
+//Setup VIM: ex: et ts=2 :
diff --git a/wiki/inc/lang/ku/newpage.txt b/wiki/inc/lang/ku/newpage.txt
new file mode 100644
index 0000000..6d256f0
--- /dev/null
+++ b/wiki/inc/lang/ku/newpage.txt
@@ -0,0 +1,3 @@
+====== Ev rûpel hîn nehat nivîsandin ======
+
+Rûpela tu hatî hîn nehat nivîsandin. Tu dikarî niha dest bi nivîsandina vê rûpelê bikî. Ji bo vê, ''Dest pê bike'' bitikîne.
diff --git a/wiki/inc/lang/ku/preview.txt b/wiki/inc/lang/ku/preview.txt
new file mode 100644
index 0000000..da8f4cb
--- /dev/null
+++ b/wiki/inc/lang/ku/preview.txt
@@ -0,0 +1,3 @@
+====== Pêşdîtin ======
+
+Li vê derê tu dikarî bibîni ku nivîsa te dê çawa xuya bibe. Ji bîr neke: Hîn **nehat tomar kirin**!
\ No newline at end of file
diff --git a/wiki/inc/lang/ku/recent.txt b/wiki/inc/lang/ku/recent.txt
new file mode 100644
index 0000000..268c89a
--- /dev/null
+++ b/wiki/inc/lang/ku/recent.txt
@@ -0,0 +1,3 @@
+====== Guherandinên dawî ======
+
+Ev rûpel di dema nêzîk de hatin guherandin.
diff --git a/wiki/inc/lang/ku/searchpage.txt b/wiki/inc/lang/ku/searchpage.txt
new file mode 100644
index 0000000..90055b1
--- /dev/null
+++ b/wiki/inc/lang/ku/searchpage.txt
@@ -0,0 +1,4 @@
+====== Lêbigere ======
+
+Jêr encamên lêgerandina te tên nîşan dan. @CREATEPAGEINFO@
+
diff --git a/wiki/inc/lang/la/admin.txt b/wiki/inc/lang/la/admin.txt
new file mode 100644
index 0000000..a8e3802
--- /dev/null
+++ b/wiki/inc/lang/la/admin.txt
@@ -0,0 +1,3 @@
+====== Administratio ======
+
+In hac pagina administratio uicis est.
\ No newline at end of file
diff --git a/wiki/inc/lang/la/adminplugins.txt b/wiki/inc/lang/la/adminplugins.txt
new file mode 100644
index 0000000..9f2ec47
--- /dev/null
+++ b/wiki/inc/lang/la/adminplugins.txt
@@ -0,0 +1 @@
+===== Addenda alia =====
\ No newline at end of file
diff --git a/wiki/inc/lang/la/backlinks.txt b/wiki/inc/lang/la/backlinks.txt
new file mode 100644
index 0000000..b3c0d13
--- /dev/null
+++ b/wiki/inc/lang/la/backlinks.txt
@@ -0,0 +1,3 @@
+====== Nexa ======
+
+Index paginarum, quae ad hanc paginam connexae sunt.
diff --git a/wiki/inc/lang/la/conflict.txt b/wiki/inc/lang/la/conflict.txt
new file mode 100644
index 0000000..aebc38b
--- /dev/null
+++ b/wiki/inc/lang/la/conflict.txt
@@ -0,0 +1,5 @@
+====== Recentior forma est ======
+
+Recentior forma est: nam dum hanc paginam recensibas, aliquis paginam mutauit.
+
+Discrimina uides et formam seruandam eligis. Alia forma delebitur.
\ No newline at end of file
diff --git a/wiki/inc/lang/la/denied.txt b/wiki/inc/lang/la/denied.txt
new file mode 100644
index 0000000..1cdaf05
--- /dev/null
+++ b/wiki/inc/lang/la/denied.txt
@@ -0,0 +1,4 @@
+====== Ad hanc paginam accedere non potes ======
+
+Ad hanc paginam accedere non potes: antea in conuentum ineas.
+
diff --git a/wiki/inc/lang/la/diff.txt b/wiki/inc/lang/la/diff.txt
new file mode 100644
index 0000000..ead3827
--- /dev/null
+++ b/wiki/inc/lang/la/diff.txt
@@ -0,0 +1,3 @@
+====== Discrimina ======
+
+Discrimina inter duas paginas ostendere
\ No newline at end of file
diff --git a/wiki/inc/lang/la/draft.txt b/wiki/inc/lang/la/draft.txt
new file mode 100644
index 0000000..23bb20f
--- /dev/null
+++ b/wiki/inc/lang/la/draft.txt
@@ -0,0 +1,5 @@
+====== Propositum inuentum ======
+
+Tua extrema recensio non perfecta est. Vicis propositum in itinere seruauit, sic his seruatis uteris.
+
+Statuas si //restituere// uis, //delere// seruata aut //delere// omnes.
\ No newline at end of file
diff --git a/wiki/inc/lang/la/edit.txt b/wiki/inc/lang/la/edit.txt
new file mode 100644
index 0000000..342b307
--- /dev/null
+++ b/wiki/inc/lang/la/edit.txt
@@ -0,0 +1 @@
+Paginam recensere et "Serua" premere. Vide [[wiki:syntax]] ut uicis stilus uidere possis. Hanc paginam recenses, solum si hanc auges. Prima uestigia apud hunc nexum [[playground:playground|playground]] uidere possis.
\ No newline at end of file
diff --git a/wiki/inc/lang/la/editrev.txt b/wiki/inc/lang/la/editrev.txt
new file mode 100644
index 0000000..6a4d082
--- /dev/null
+++ b/wiki/inc/lang/la/editrev.txt
@@ -0,0 +1,2 @@
+**Vetus forma a te restituta est** Si hanc formam seruabis, nouam creabis.
+----
\ No newline at end of file
diff --git a/wiki/inc/lang/la/index.txt b/wiki/inc/lang/la/index.txt
new file mode 100644
index 0000000..cd65dbb
--- /dev/null
+++ b/wiki/inc/lang/la/index.txt
@@ -0,0 +1,3 @@
+====== Forma Situs ======
+
+Haec forma situs ordinata [[doku>namespaces|generatim]].
\ No newline at end of file
diff --git a/wiki/inc/lang/la/install.html b/wiki/inc/lang/la/install.html
new file mode 100644
index 0000000..e041df9
--- /dev/null
+++ b/wiki/inc/lang/la/install.html
@@ -0,0 +1,8 @@
+<p>Haec pagina te adiuuat in <a href="http://dokuwiki.org">Dokuuiki</a> conformando. Maiores res in
+<a href="http://dokuwiki.org/installer">hac pagina</a> sunt.</p>
+
+<p>DokuWiki documenta ut omnes paginas uicis et omnia (ut imagines, indices, ueteres formas) quae ad easdem pertinent colligat. Vt bene operet DokuWiki omnes facultates scrini habere <strong>debes</strong>. Hoc instrumentum facultates eligere  non potest, his facultatibus locatori spati interretis quaeras uel FTP intrumento uel aliis rebus (ut cPanel) uteraris.</p>
+
+<p>Hoc intrumentum optiones primae DokuWiki <abbr title="index custodiae, aditus">ICA</abbr>, quos rectori situs inire et indicem, ut addenda optiones uicis et alia administrare possit uidere licet. Hoc instrumentum non necessarium DokuWiki ut feliciter operet, sed melius administrare adiuuat.</p>
+
+<p>Periti uel qui certa quaesita habet paginas <a href="http://dokuwiki.org/install">rationis conformandum uicem</a> et <a href="http://dokuwiki.org/config">optionum conformationis</a> uidere possunt.</p>
\ No newline at end of file
diff --git a/wiki/inc/lang/la/lang.php b/wiki/inc/lang/la/lang.php
new file mode 100644
index 0000000..5f5f59e
--- /dev/null
+++ b/wiki/inc/lang/la/lang.php
@@ -0,0 +1,261 @@
+<?php
+/**
+ * la language file
+ *
+ * This file was initially built by fetching translations from other
+ * Wiki projects. See the @url lines below. Additional translations
+ * and fixes where done for DokuWiki by the people mentioned in the
+ * lines starting with @author
+ *
+ * @url http://svn.wikimedia.org/viewvc/mediawiki/trunk/phase3/languages/messages/MessagesLa.php?view=co
+ * @author Massimiliano Vassalli <vassalli.max@gmail.com>
+ */
+$lang['encoding']              = 'utf-8';
+$lang['direction']             = 'ltr';
+$lang['doublequoteopening']    = '&quot;';
+$lang['doublequoteclosing']    = '&quot;';
+$lang['singlequoteopening']    = '`';
+$lang['singlequoteclosing']    = '´';
+$lang['apostrophe']            = '\'';
+$lang['btn_edit']              = 'Recensere hanc paginam';
+$lang['btn_source']            = 'Fontem uidere';
+$lang['btn_show']              = 'Ostendere paginam';
+$lang['btn_create']            = 'Creare paginam';
+$lang['btn_search']            = 'Quaerere';
+$lang['btn_save']              = 'Seruare';
+$lang['btn_preview']           = 'Praeuidere';
+$lang['btn_top']               = 'I ad summa';
+$lang['btn_newer']             = '<< recentiores';
+$lang['btn_older']             = 'minus recentiores >>';
+$lang['btn_revs']              = 'Veteres renouationes';
+$lang['btn_recent']            = 'Nuper mutata';
+$lang['btn_upload']            = 'Onerare';
+$lang['btn_cancel']            = 'Abrogare';
+$lang['btn_index']             = 'Index';
+$lang['btn_secedit']           = 'Recensere';
+$lang['btn_login']             = 'Conuentum aperire';
+$lang['btn_logout']            = 'Conuentum concludere';
+$lang['btn_admin']             = 'Rector';
+$lang['btn_update']            = 'Nouare';
+$lang['btn_delete']            = 'Delere';
+$lang['btn_back']              = 'Redire';
+$lang['btn_backlink']          = 'Nexus ad paginam';
+$lang['btn_subscribe']         = 'Custodire';
+$lang['btn_profile']           = 'Tabellam nouare';
+$lang['btn_reset']             = 'Abrogare';
+$lang['btn_draft']             = 'Propositum recensere';
+$lang['btn_recover']           = 'Propositum reficere';
+$lang['btn_draftdel']          = 'Propositum delere';
+$lang['btn_revert']            = 'Reficere';
+$lang['btn_register']          = 'Te adscribere';
+$lang['loggedinas']            = 'Nomen sodalis:';
+$lang['user']                  = 'Nomen sodalis:';
+$lang['pass']                  = 'Tessera tua';
+$lang['newpass']               = 'Tessera noua';
+$lang['oldpass']               = 'Tessera uetus:';
+$lang['passchk']               = 'Tesseram tuam adfirmare';
+$lang['remember']              = 'Tesseram meam sodalitatis memento';
+$lang['fullname']              = 'Nomen tuom uerum:';
+$lang['email']                 = 'Cursus interretialis:';
+$lang['profile']               = 'Tabella Sodalis';
+$lang['badlogin']              = 'Error in ineundo est, rectum nomen uel tessera cedo.';
+$lang['minoredit']             = 'Recensio minor';
+$lang['draftdate']             = 'Propositum seruatur die:';
+$lang['nosecedit']             = 'Pagina interea mutatur, pars rerum exiit, in loco eius tota pagina reclamata est.';
+$lang['regmissing']            = 'Omnes campi complendi sunt.';
+$lang['reguexists']            = 'Nomen Sodalis ab aliquo iam elegitur.';
+$lang['regsuccess']            = 'Adscriptio feliciter perficitur et tessera cursu interretiali mittitur';
+$lang['regsuccess2']           = 'Adscriptio perficitur';
+$lang['regmailfail']           = 'Error in litteras mittendo est. Rectorem conueni!';
+$lang['regbadmail']            = 'Cursus interretialis non legitimus: si errorem putes, Rectorem conueni.';
+$lang['regbadpass']            = 'Tesserae quas scripsisti inter se non congruont.';
+$lang['regpwmail']             = 'Tessera Dokuuicis tuam';
+$lang['reghere']               = 'Non iam adscriptus\a esne? Te adscribe';
+$lang['profna']                = 'Tabellam tuam mutare non potes.';
+$lang['profnochange']          = 'Si res non mutare uis, nihil agere';
+$lang['profnoempty']           = 'Omnes campi complendi sunt.';
+$lang['profchanged']           = 'Tabella Sodalis feliciter nouatur';
+$lang['pwdforget']             = 'Tesseram amisistine? Nouam petere';
+$lang['resendna']              = 'Tesseram non mutare potest.';
+$lang['resendpwdmissing']      = 'Omnes campi complendi sunt.';
+$lang['resendpwdnouser']       = 'In tabellis Sodalium nomen non inuentum est.';
+$lang['resendpwdbadauth']      = 'Tesseram non legitima est.';
+$lang['resendpwdconfirm']      = 'Confirmatio cursu interretiali mittitur.';
+$lang['resendpwdsuccess']      = 'Tessera noua cursu interretiali mittitur.';
+$lang['license']               = 'Praeter ubi adnotatum, omnia scripta Corporis Gentis Latinae cum his facultatibus:';
+$lang['licenseok']             = 'Caue: si paginam recenseas, has facultates confirmas:';
+$lang['searchmedia']           = 'Quaere titulum:';
+$lang['searchmedia_in']        = 'Quaere "%s":';
+$lang['txt_upload']            = 'Eligere documenta oneranda:';
+$lang['txt_filename']          = 'Onerare (optio):';
+$lang['txt_overwrt']           = 'Documento ueteri imponere:';
+$lang['lockedby']              = 'Nunc hoc intercludit:';
+$lang['lockexpire']            = 'Hoc apertum:';
+$lang['js']['willexpire']            = 'Interclusio paginae recensendae uno minuto finita est.\nUt errores uites, \'praeuisio\' preme ut interclusionem ripristines.';
+$lang['js']['notsavedyet']     = 'Res non seruatae amissurae sunt.';
+$lang['js']['searchmedia']     = 'Quaere inter documenta';
+$lang['js']['keepopen']        = 'Fenestram apertam tene';
+$lang['js']['hidedetails']     = 'Singulas res abscondere';
+$lang['js']['mediatitle']      = 'Optiones nexorum';
+$lang['js']['mediadisplay']    = 'Genus nexi';
+$lang['js']['mediaalign']      = 'Collocatio';
+$lang['js']['mediasize']       = 'Amplitudo imaginis';
+$lang['js']['mediatarget']     = 'Cui nexum est';
+$lang['js']['mediaclose']      = 'Claudere';
+$lang['js']['mediainsert']     = 'Insere';
+$lang['js']['mediadisplayimg'] = 'Imaginem ostendere';
+$lang['js']['mediadisplaylnk'] = 'Solum nexum ostendere';
+$lang['js']['mediasmall']      = 'Forma minor';
+$lang['js']['mediamedium']     = 'Forma media';
+$lang['js']['medialarge']      = 'Forma maior';
+$lang['js']['mediaoriginal']   = 'Forma primigenia';
+$lang['js']['medialnk']        = 'Singulis rebus paginae nexum';
+$lang['js']['mediadirect']     = 'Primigeniae formae nexum';
+$lang['js']['medianolnk']      = 'Connectio deest';
+$lang['js']['medianolink']     = 'Imaginem non connectere';
+$lang['js']['medialeft']       = 'Imaginem ad sinistram collocare';
+$lang['js']['mediaright']      = 'Imaginem ad dextram collocare';
+$lang['js']['mediacenter']     = 'Imaginem in mediam collocare';
+$lang['js']['medianoalign']    = 'Collocationem remouere';
+$lang['js']['nosmblinks']      = 'Windows nexa solum cum Microsoft Internet Explorer ostendi possunt.
+Adhuc transcribere nexum potes.';
+$lang['js']['linkwiz']         = 'Connectendi ductor';
+$lang['js']['linkto']          = 'Nexum ad:';
+$lang['js']['del_confirm']     = 'Delere electas res uin?';
+$lang['rssfailed']             = 'Error in restituendo ';
+$lang['nothingfound']          = 'Nihil inuentum est.';
+$lang['mediaselect']           = 'Documenta uisiua:';
+$lang['uploadsucc']            = 'Oneratum perfectum';
+$lang['uploadfail']            = 'Error onerandi.';
+$lang['uploadwrong']           = 'Onerare non potest. Genus documenti non legitimum!';
+$lang['uploadexist']           = 'Documentum iam est.';
+$lang['uploadspam']            = 'Onerare non potest: nam in indice perscriptionis documentum est.';
+$lang['uploadxss']             = 'Onerare non potest: nam forsitan malum scriptum in documento est.';
+$lang['uploadsize']            = 'Documentum onerandum ponderosius est. (Maxime "%s")';
+$lang['deletesucc']            = 'Documentum "%s" deletum est.';
+$lang['deletefail']            = '"%s" non deletur: uide facultates.';
+$lang['mediainuse']            = 'documentum "%s" non deletur, nam aliquis hoc utitur.';
+$lang['namespaces']            = 'Genus';
+$lang['mediafiles']            = 'Documentum liberum in:';
+$lang['accessdenied']          = 'Non uidere documentum potes.';
+$lang['mediausage']            = 'Hac forma uteris ut documentum referas:';
+$lang['mediaview']             = 'Vide documentum primigenium';
+$lang['mediaroot']             = 'scrinium';
+$lang['mediaupload']           = 'Hic genus oneras. Si nouom genus creare uis, ante "Onerare ut" nomen documenti diuisum a duabus punctis ponas.';
+$lang['mediaextchange']        = 'Genus documenti mutatum a(b) ".%s" ad ".%s"!';
+$lang['reference']             = 'Referre:';
+$lang['ref_inuse']             = 'Documentum non deleri potest, nam in his paginis apertum est:';
+$lang['ref_hidden']            = 'Aliquae mentiones ad paginas, ad quas ire non potes, habent';
+$lang['hits']                  = 'Ictus';
+$lang['quickhits']             = 'Spatium nominis conguens';
+$lang['toc']                   = 'Index';
+$lang['current']               = 'nouos\a\um';
+$lang['yours']                 = 'Tua forma';
+$lang['diff']                  = 'Discrimina inter formas ostendere';
+$lang['diff2']                 = 'Discrimina inter electas recensiones ostendere';
+$lang['difflink']              = 'Nexum ad comparandum';
+$lang['line']                  = 'Linea';
+$lang['breadcrumb']            = 'Vestigium';
+$lang['youarehere']            = 'Hic es';
+$lang['lastmod']               = 'Extrema mutatio';
+$lang['by']                    = 'a(b)';
+$lang['deleted']               = 'deletur';
+$lang['created']               = 'creatur';
+$lang['restored']              = 'Recensio uetus restituta (%s)';
+$lang['external_edit']         = 'Externe recensere';
+$lang['summary']               = 'Indicem recensere';
+$lang['noflash']               = '<a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> necessarium est.';
+$lang['download']              = 'Snippet capere';
+$lang['mail_newpage']          = 'Pagina addita:';
+$lang['mail_changed']          = 'Pagina mutata:';
+$lang['mail_subscribe_list']   = 'Paginae in genere mutatae:';
+$lang['mail_new_user']         = 'Nouos Sodalis:';
+$lang['mail_upload']           = 'Documentum oneratum:';
+$lang['qb_bold']               = 'Litterae pingues';
+$lang['qb_italic']             = 'Litterae italicae';
+$lang['qb_underl']             = 'Litterae sullineatae';
+$lang['qb_code']               = 'Codex scripti';
+$lang['qb_strike']             = 'Litterae illineatae';
+$lang['qb_h1']                 = 'Caput I';
+$lang['qb_h2']                 = 'Caput II';
+$lang['qb_h3']                 = 'Caput III';
+$lang['qb_h4']                 = 'Caput IV';
+$lang['qb_h5']                 = 'Caput V';
+$lang['qb_h']                  = 'Caput';
+$lang['qb_hs']                 = 'Caput eligere';
+$lang['qb_hplus']              = 'Caput maius';
+$lang['qb_hminus']             = 'Caput minus';
+$lang['qb_hequal']             = 'Caput eiusdem gradus';
+$lang['qb_link']               = 'Nexus internus';
+$lang['qb_extlink']            = 'Nexus externus (memento praefigere http://)';
+$lang['qb_hr']                 = 'Linea directa (noli saepe uti)';
+$lang['qb_ol']                 = 'Index ordinatus rerum';
+$lang['qb_ul']                 = 'Index non ordinatus rerum';
+$lang['qb_media']              = 'Imagines et documenta addere';
+$lang['qb_sig']                = 'Subscriptio tua cum indicatione temporis';
+$lang['qb_smileys']            = 'Pupuli';
+$lang['qb_chars']              = 'Signa singularia';
+$lang['upperns']               = 'I ad anterius genus';
+$lang['metaedit']              = 'Res codicis mutare';
+$lang['metasaveerr']           = 'Res codicis non scribitur.';
+$lang['metasaveok']            = 'Res codicis seruatae.';
+$lang['btn_img_backto']            = 'Redere ad %s';
+$lang['img_title']             = 'Titulus:';
+$lang['img_caption']           = 'Descriptio:';
+$lang['img_date']              = 'Dies:';
+$lang['img_fname']             = 'Titulus documenti:';
+$lang['img_fsize']             = 'Pondus:';
+$lang['img_artist']            = 'Imaginum exprimitor\trix:';
+$lang['img_copyr']             = 'Iura exemplarium:';
+$lang['img_format']            = 'Forma:';
+$lang['img_camera']            = 'Cella:';
+$lang['img_keywords']          = 'Verba claues:';
+$lang['subscr_subscribe_success'] = '%s additur indici subscriptionis quod %s';
+$lang['subscr_subscribe_error'] = '%s non additur indici subscriptionis quod %s';
+$lang['subscr_subscribe_noaddress'] = 'Cursus interretialis tuus deest, sic in indice subscriptionis non scribi potes';
+$lang['subscr_unsubscribe_success'] = 'A subscriptione %s deletur quod %s';
+$lang['subscr_unsubscribe_error'] = 'Error delendi %s a subscriptione quod %s';
+$lang['subscr_already_subscribed'] = '%s iam subscriptus\a est in %s';
+$lang['subscr_not_subscribed'] = '%s non subscriptus\a est in %s';
+$lang['subscr_m_not_subscribed'] = 'Non hanc paginam uel genus subscribere potes.';
+$lang['subscr_m_new_header']   = 'Subscriptionem addere';
+$lang['subscr_m_current_header'] = 'haec subscriptio:';
+$lang['subscr_m_unsubscribe']  = 'Delere';
+$lang['subscr_m_subscribe']    = 'Subscribere';
+$lang['subscr_m_receive']      = 'Accipere';
+$lang['subscr_style_every']    = 'Cursus mutationibus omnibus';
+$lang['subscr_style_digest']   = 'Accipere litteras in mutando paginam (%.2f dies)';
+$lang['subscr_style_list']     = 'Index mutatarum paginarum ab extremis litteris (%.2f dies)';
+$lang['authtempfail']          = 'Confirmare non potes. Rectorem conuenis.';
+$lang['i_chooselang']          = 'Linguam eligere';
+$lang['i_installer']           = 'Docuuicis creator';
+$lang['i_wikiname']            = 'Nomen Vicis';
+$lang['i_enableacl']           = 'ICA aptum facias (consulatum est)';
+$lang['i_superuser']           = 'Magister\stra';
+$lang['i_problems']            = 'Creator hos errores habes. Continuare potes postquam omnia soluentur.';
+$lang['i_modified']            = 'Hoc scriptum solum cum noua forma Dokuuicis est. Hoc rursum capere in pagina, in qua haec machina capta est, potes aut i ad <a href="http://dokuwiki.org/install">Dokuuicis installation instructions</a>';
+$lang['i_funcna']              = 'PHP functio <code>%s</code> inepta est.';
+$lang['i_phpver']              = 'Forma tua PHP <code>%s</code> minor quam illa necessaria <code>%s</code>.';
+$lang['i_permfail']            = '<code>%s</code> non a uice scribitur. Facultates inspicere.';
+$lang['i_confexists']          = '<code>%s</code> iam est.';
+$lang['i_writeerr']            = '<code>%s</code> non creari potest. Manu illum creas.';
+$lang['i_badhash']             = 'Ignotum uel mutatum dokuwiki.php (<code>%s</code>)';
+$lang['i_badval']              = '<code>%s</code> non legitimum uel uacuom';
+$lang['i_success']             = 'Administratio feliciter perficitur. Delere install.php documentum potes. I ad <a href="doku.php?id=wiki:welcome">hanc paginam</a> ut continues.';
+$lang['i_failure']             = 'Aliqui errores dum documenta administrantur sunt. Manu onerare omnes potes priusquam <a href="doku.php?id=wiki:welcome">tuo nouo uice</a> uteris.';
+$lang['i_policy']              = 'ICA ratio prima';
+$lang['i_pol0']                = 'Vicem aperire (omnes legere, scribere, onerare possunt)';
+$lang['i_pol1']                = 'Publicus uicis (omnes legere, Sodales scribere et onerare possunt)';
+$lang['i_pol2']                = 'Clausus uicis (Soli Sodales legere scribere et onerare poccunt)';
+$lang['i_retry']               = 'Rursum temptas';
+$lang['i_license']             = 'Elige facultatem sub qua tuus uicis est:';
+$lang['years']                 = 'ab annis %d';
+$lang['months']                = 'a mensibus %d';
+$lang['weeks']                 = 'a septimanis %d';
+$lang['days']                  = 'a diebus %d';
+$lang['hours']                 = 'a horis %d';
+$lang['minutes']               = 'a minutis %d';
+$lang['seconds']               = 'a secundis %d';
+$lang['wordblock']             = 'Mutationes non seruantur, eo quod mala uerba contenit';
+$lang['email_signature_text'] = 'Hic cursus generatus a
+@DOKUWIKIURL@';
diff --git a/wiki/inc/lang/la/locked.txt b/wiki/inc/lang/la/locked.txt
new file mode 100644
index 0000000..65446df
--- /dev/null
+++ b/wiki/inc/lang/la/locked.txt
@@ -0,0 +1,3 @@
+====== Pagina inclusa ======
+
+Haec pagina inclusa est: nullam mutationem facere potest.
\ No newline at end of file
diff --git a/wiki/inc/lang/la/login.txt b/wiki/inc/lang/la/login.txt
new file mode 100644
index 0000000..25d4cd1
--- /dev/null
+++ b/wiki/inc/lang/la/login.txt
@@ -0,0 +1,3 @@
+====== Aditus ======
+
+Nomen Sodalis et tesseram scribere debes ut in conuentum inire uelis.
\ No newline at end of file
diff --git a/wiki/inc/lang/la/mailtext.txt b/wiki/inc/lang/la/mailtext.txt
new file mode 100644
index 0000000..8348378
--- /dev/null
+++ b/wiki/inc/lang/la/mailtext.txt
@@ -0,0 +1,11 @@
+Pagina in uice addita uel mutata. Hae singulae res sunt:
+
+Dies : @DATE@
+IP-Numerus : @IPADDRESS@
+Hospes situs : @HOSTNAME@
+Vetus recensio: @OLDPAGE@
+Noua recensio: @NEWPAGE@
+Summa recensere: @SUMMARY@
+Sodalis : @USER@
+
+@DIFF@
diff --git a/wiki/inc/lang/la/newpage.txt b/wiki/inc/lang/la/newpage.txt
new file mode 100644
index 0000000..13cfff7
--- /dev/null
+++ b/wiki/inc/lang/la/newpage.txt
@@ -0,0 +1,3 @@
+====== Hoc argumentum deest ======
+
+Nexum, quod pressisti, ad argumentum nullum fert. Si facultatem habes, creare nouam paginam potes.
\ No newline at end of file
diff --git a/wiki/inc/lang/la/norev.txt b/wiki/inc/lang/la/norev.txt
new file mode 100644
index 0000000..19b60fe
--- /dev/null
+++ b/wiki/inc/lang/la/norev.txt
@@ -0,0 +1,3 @@
+====== Forma non reperta ======
+
+Haec forma non reperta est. Aliam formam quaeris.
\ No newline at end of file
diff --git a/wiki/inc/lang/la/password.txt b/wiki/inc/lang/la/password.txt
new file mode 100644
index 0000000..0557357
--- /dev/null
+++ b/wiki/inc/lang/la/password.txt
@@ -0,0 +1,6 @@
+Aue @FULLNAME@!
+
+Hae res @TITLE@, i ad paginam: @DOKUWIKIURL@
+
+Sodalis nomen : @LOGIN@
+Tessera : @PASSWORD@
diff --git a/wiki/inc/lang/la/preview.txt b/wiki/inc/lang/la/preview.txt
new file mode 100644
index 0000000..7e5a137
--- /dev/null
+++ b/wiki/inc/lang/la/preview.txt
@@ -0,0 +1,3 @@
+====== Praeuisio ======
+
+In hac pagina scriptum praeuidere potes. Memento hunc non seruatum iam esse.
\ No newline at end of file
diff --git a/wiki/inc/lang/la/pwconfirm.txt b/wiki/inc/lang/la/pwconfirm.txt
new file mode 100644
index 0000000..ade0a1c
--- /dev/null
+++ b/wiki/inc/lang/la/pwconfirm.txt
@@ -0,0 +1,10 @@
+Aue, @FULLNAME@!
+
+Aliquis tesseram nouam @TITLE@
+ut ineas in @DOKUWIKIURL@
+
+Si nouam tesseram non petiuisti, hoc nuntium ignorat.
+
+Ut hoc nuntium petiuisti, premendo hunc nexum confirmas.
+
+@CONFIRM@
diff --git a/wiki/inc/lang/la/read.txt b/wiki/inc/lang/la/read.txt
new file mode 100644
index 0000000..b1710f2
--- /dev/null
+++ b/wiki/inc/lang/la/read.txt
@@ -0,0 +1 @@
+Hanc paginam solum legere potes. Fontem uidere, sed non mutare potes.
\ No newline at end of file
diff --git a/wiki/inc/lang/la/recent.txt b/wiki/inc/lang/la/recent.txt
new file mode 100644
index 0000000..d8e721c
--- /dev/null
+++ b/wiki/inc/lang/la/recent.txt
@@ -0,0 +1,3 @@
+====== Recentes Mutationes ======
+
+Hae paginae mutatae sunt in recentibus temporibus
\ No newline at end of file
diff --git a/wiki/inc/lang/la/register.txt b/wiki/inc/lang/la/register.txt
new file mode 100644
index 0000000..71ca8dd
--- /dev/null
+++ b/wiki/inc/lang/la/register.txt
@@ -0,0 +1,3 @@
+====== Nouom\am Sodalem Adscribere ======
+
+Nomen Sodalis legitimus esse debes: [[doku>pagename|pagename]].
\ No newline at end of file
diff --git a/wiki/inc/lang/la/registermail.txt b/wiki/inc/lang/la/registermail.txt
new file mode 100644
index 0000000..1f28659
--- /dev/null
+++ b/wiki/inc/lang/la/registermail.txt
@@ -0,0 +1,10 @@
+Nouos\a Sodalis est. Hae suae res:
+
+Sodalis nomen : @NEWUSER@
+Nomen uerum : @NEWNAME@
+Cursus interretialis : @NEWEMAIL@
+
+Dies : @DATE@
+Machina interretis : @BROWSER@
+IP-numerus : @IPADDRESS@
+Hostname : @HOSTNAME@
diff --git a/wiki/inc/lang/la/resendpwd.txt b/wiki/inc/lang/la/resendpwd.txt
new file mode 100644
index 0000000..5a4972f
--- /dev/null
+++ b/wiki/inc/lang/la/resendpwd.txt
@@ -0,0 +1,3 @@
+====== ouam Tesseram mittere ======
+
+Inserere nomen Sodalis priusquam tesseram petere. Confirmatio mittibitur.
\ No newline at end of file
diff --git a/wiki/inc/lang/la/revisions.txt b/wiki/inc/lang/la/revisions.txt
new file mode 100644
index 0000000..38b9bae
--- /dev/null
+++ b/wiki/inc/lang/la/revisions.txt
@@ -0,0 +1,3 @@
+====== Veteres recensiones ======
+
+In hac pagina ueteres recensiones paginae sunt: ut unam ex his restituas, illam eligis et deinde "Recensere paginam" premis et serua.
\ No newline at end of file
diff --git a/wiki/inc/lang/la/searchpage.txt b/wiki/inc/lang/la/searchpage.txt
new file mode 100644
index 0000000..76255d5
--- /dev/null
+++ b/wiki/inc/lang/la/searchpage.txt
@@ -0,0 +1,4 @@
+====== Quaerere ======
+
+Responsiones in hac pagina uidere potes. @CREATEPAGEINFO@
+
diff --git a/wiki/inc/lang/la/showrev.txt b/wiki/inc/lang/la/showrev.txt
new file mode 100644
index 0000000..b95e682
--- /dev/null
+++ b/wiki/inc/lang/la/showrev.txt
@@ -0,0 +1,2 @@
+**Haec uetus forma documenti est!**
+----
\ No newline at end of file
diff --git a/wiki/inc/lang/la/stopwords.txt b/wiki/inc/lang/la/stopwords.txt
new file mode 100644
index 0000000..f063ba7
--- /dev/null
+++ b/wiki/inc/lang/la/stopwords.txt
@@ -0,0 +1,37 @@
+apud
+sunt
+etsi
+atque
+et
+tu
+tuus
+eius
+eorum
+infra
+ad
+in
+inter
+si
+in
+a
+ab
+de
+ut
+super
+aut
+uel
+illud
+illa
+ille
+ad
+fuit
+quid
+quod
+ubi
+hoc
+ex
+e
+cum
+haec
+hic
+www
\ No newline at end of file
diff --git a/wiki/inc/lang/la/subscr_digest.txt b/wiki/inc/lang/la/subscr_digest.txt
new file mode 100644
index 0000000..d4ca79a
--- /dev/null
+++ b/wiki/inc/lang/la/subscr_digest.txt
@@ -0,0 +1,16 @@
+Aue!
+
+Pagina @PAGE@ in @TITLE@ uici mutata.
+Haec mutationes sunt:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Vetus recensio: @OLDPAGE@
+Noua recensio: @NEWPAGE@
+
+Ut paginae adnotationes deleas, in uicem ineas in
+@DOKUWIKIURL@, deinde uideas
+@SUBSCRIBE@
+et paginarum generum optiones mutes.
diff --git a/wiki/inc/lang/la/subscr_form.txt b/wiki/inc/lang/la/subscr_form.txt
new file mode 100644
index 0000000..23000b3
--- /dev/null
+++ b/wiki/inc/lang/la/subscr_form.txt
@@ -0,0 +1,3 @@
+====== Inscriptionis Administratio ======
+
+In hac pagina inscriptiones huius paginae et generis sunt.
\ No newline at end of file
diff --git a/wiki/inc/lang/la/subscr_list.txt b/wiki/inc/lang/la/subscr_list.txt
new file mode 100644
index 0000000..3921ff6
--- /dev/null
+++ b/wiki/inc/lang/la/subscr_list.txt
@@ -0,0 +1,13 @@
+Aue!
+
+Paginae in spatio nominis @PAGE@  @TITLE@ uicis mutatae.
+Hae mutationes sunt:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Ut adnotationes deleas, preme hic
+@DOKUWIKIURL@ then visit
+@SUBSCRIBE@
+et paginarum et\aut generum mutationes tollis.
diff --git a/wiki/inc/lang/la/subscr_single.txt b/wiki/inc/lang/la/subscr_single.txt
new file mode 100644
index 0000000..4bfd7ef
--- /dev/null
+++ b/wiki/inc/lang/la/subscr_single.txt
@@ -0,0 +1,19 @@
+Aue!
+
+Pagina "@PAGE@" in titulo "@TITlE@" mutata.
+Hae mutationes sunt:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Dies : @DATE@
+Sodalis : @USER@
+Summa recensita: @SUMMARY@
+Vetus recensio: @OLDPAGE@
+Noua recensio: @NEWPAGE@
+
+Ut paginae adnotationes deleas, in uicem ineas in
+@DOKUWIKIURL@, deinde uideas
+@SUBSCRIBE@
+et paginarum et\aut generum optiones mutasa.
diff --git a/wiki/inc/lang/la/updateprofile.txt b/wiki/inc/lang/la/updateprofile.txt
new file mode 100644
index 0000000..565f81a
--- /dev/null
+++ b/wiki/inc/lang/la/updateprofile.txt
@@ -0,0 +1,3 @@
+====== Nouare Sodalis tabellas ======
+
+Solum in campis, quos mutare uis, scribis. Nomen Sodalis non mutare potes.
\ No newline at end of file
diff --git a/wiki/inc/lang/la/uploadmail.txt b/wiki/inc/lang/la/uploadmail.txt
new file mode 100644
index 0000000..329bf31
--- /dev/null
+++ b/wiki/inc/lang/la/uploadmail.txt
@@ -0,0 +1,10 @@
+Documentum nouatum est. Hae mutatione sunt:
+
+Documentum : @MEDIA@
+Dies : @DATE@
+Machina interretis : @BROWSER@
+IP-Numerus : @IPADDRESS@
+Hospes situs : @HOSTNAME@
+Pondus : @SIZE@
+MIME Genus : @MIME@
+Sodalis : @USER@
diff --git a/wiki/inc/lang/lb/admin.txt b/wiki/inc/lang/lb/admin.txt
new file mode 100644
index 0000000..08f8b2f
--- /dev/null
+++ b/wiki/inc/lang/lb/admin.txt
@@ -0,0 +1,3 @@
+====== Administratioun ======
+
+Hei ënnendrënner fënns de eng Lëscht mat administrativen Aufgaben déi am Dokuwiki zuer Verfügung stinn.
diff --git a/wiki/inc/lang/lb/adminplugins.txt b/wiki/inc/lang/lb/adminplugins.txt
new file mode 100644
index 0000000..9581400
--- /dev/null
+++ b/wiki/inc/lang/lb/adminplugins.txt
@@ -0,0 +1 @@
+===== Zousätzlech Pluginen =====
\ No newline at end of file
diff --git a/wiki/inc/lang/lb/backlinks.txt b/wiki/inc/lang/lb/backlinks.txt
new file mode 100644
index 0000000..8b8fbd4
--- /dev/null
+++ b/wiki/inc/lang/lb/backlinks.txt
@@ -0,0 +1,3 @@
+====== Linken zeréck ======
+
+Dëst ass eng Lëscht mat Säiten déi schéngen op déi aktuell Säit zeréck ze verlinken.
diff --git a/wiki/inc/lang/lb/conflict.txt b/wiki/inc/lang/lb/conflict.txt
new file mode 100644
index 0000000..3a84e72
--- /dev/null
+++ b/wiki/inc/lang/lb/conflict.txt
@@ -0,0 +1,5 @@
+====== Et gëtt méi eng nei Versioun ======
+
+Et gëtt méi eng nei Versioun vum Dokument wats de g'ännert hues. Dat geschitt wann en anere Benotzer dat selwecht Dokument ännert wärenddeems du et änners. 
+
+Ënnersich d'Ënnerscheeder déi hei ënnendrënner ugewise gi grëndlech. Wanns de  ''Späicheren'' auswiels, da gëtt deng Version gespäicher. Dréck op ''Ofbriechen'' fir déi aktuell Versioun ze halen.
diff --git a/wiki/inc/lang/lb/denied.txt b/wiki/inc/lang/lb/denied.txt
new file mode 100644
index 0000000..1a7fd8f
--- /dev/null
+++ b/wiki/inc/lang/lb/denied.txt
@@ -0,0 +1,4 @@
+======Erlaabnis verweigert======
+
+Et deet mer leed, du hues net genuch Rechter fir weiderzefueren.
+
diff --git a/wiki/inc/lang/lb/diff.txt b/wiki/inc/lang/lb/diff.txt
new file mode 100644
index 0000000..7838b98
--- /dev/null
+++ b/wiki/inc/lang/lb/diff.txt
@@ -0,0 +1,3 @@
+====== Ënnerscheeder ======
+
+Hei sinn d'Ënnerscheeder zwëscht 2 Versiounen vun der Säit.
diff --git a/wiki/inc/lang/lb/draft.txt b/wiki/inc/lang/lb/draft.txt
new file mode 100644
index 0000000..2e2fc9d
--- /dev/null
+++ b/wiki/inc/lang/lb/draft.txt
@@ -0,0 +1,5 @@
+====== Entworf fond ======
+
+Deng lescht Ännersessioun op dëser Säit gouf net richteg ofgeschloss. DokuWiki huet automatesch en Entworf wärend denger Aarbecht gespäichert deens de elo kanns benotzen fir mat dengen Ännerunge weiderzefueren. Hei ënnendrënner gesäiss de wat vun denger leschter Sessioun gespäichert gouf.
+
+Decidéier w.e.g. obs de deng verlueren Ännerungssessioun //zeréckhuelen//, den Entworf //läschen// oder d'Änneren //ofbrieche// wëlls.
diff --git a/wiki/inc/lang/lb/edit.txt b/wiki/inc/lang/lb/edit.txt
new file mode 100644
index 0000000..ca039d1
--- /dev/null
+++ b/wiki/inc/lang/lb/edit.txt
@@ -0,0 +1 @@
+Änner d'Säit an dréck ''Späicheren''. Kuck [[wiki:syntax]] fir d'Wiki-Syntax. Änner d'Säit w.e.g. nëmme wanns de se **verbessere** kanns. Wanns de Saache probéiere wëlls, da léier deng éischt Schréck an der [[playground:playground|Sandkaul]].
diff --git a/wiki/inc/lang/lb/editrev.txt b/wiki/inc/lang/lb/editrev.txt
new file mode 100644
index 0000000..6d7a129
--- /dev/null
+++ b/wiki/inc/lang/lb/editrev.txt
@@ -0,0 +1,2 @@
+**Du hues eng al Versioun vum Dokument gelueden!** Wanns de se änners, mëss de eng nei Versioun mat dësen Daten.
+----
\ No newline at end of file
diff --git a/wiki/inc/lang/lb/index.txt b/wiki/inc/lang/lb/index.txt
new file mode 100644
index 0000000..183e07a
--- /dev/null
+++ b/wiki/inc/lang/lb/index.txt
@@ -0,0 +1,3 @@
+====== Index ======
+
+Dëst ass em Index vun all de Säiten gesënnert no [[doku>namespaces|namespaces]].
diff --git a/wiki/inc/lang/lb/jquery.ui.datepicker.js b/wiki/inc/lang/lb/jquery.ui.datepicker.js
new file mode 100644
index 0000000..02a9c51
--- /dev/null
+++ b/wiki/inc/lang/lb/jquery.ui.datepicker.js
@@ -0,0 +1,45 @@
+/* Luxembourgish initialisation for the jQuery UI date picker plugin. */
+/* Written by Michel Weimerskirch <michel@weimerskirch.net> */
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "../widgets/datepicker" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery.datepicker );
+	}
+}( function( datepicker ) {
+
+datepicker.regional.lb = {
+	closeText: "Fäerdeg",
+	prevText: "Zréck",
+	nextText: "Weider",
+	currentText: "Haut",
+	monthNames: [ "Januar","Februar","Mäerz","Abrëll","Mee","Juni",
+	"Juli","August","September","Oktober","November","Dezember" ],
+	monthNamesShort: [ "Jan", "Feb", "Mäe", "Abr", "Mee", "Jun",
+	"Jul", "Aug", "Sep", "Okt", "Nov", "Dez" ],
+	dayNames: [
+		"Sonndeg",
+		"Méindeg",
+		"Dënschdeg",
+		"Mëttwoch",
+		"Donneschdeg",
+		"Freideg",
+		"Samschdeg"
+	],
+	dayNamesShort: [ "Son", "Méi", "Dën", "Mët", "Don", "Fre", "Sam" ],
+	dayNamesMin: [ "So","Mé","Dë","Më","Do","Fr","Sa" ],
+	weekHeader: "W",
+	dateFormat: "dd.mm.yy",
+	firstDay: 1,
+	isRTL: false,
+	showMonthAfterYear: false,
+	yearSuffix: "" };
+datepicker.setDefaults( datepicker.regional.lb );
+
+return datepicker.regional.lb;
+
+} ) );
diff --git a/wiki/inc/lang/lb/lang.php b/wiki/inc/lang/lb/lang.php
new file mode 100644
index 0000000..d4d0fb4
--- /dev/null
+++ b/wiki/inc/lang/lb/lang.php
@@ -0,0 +1,195 @@
+<?php
+/**
+ * lb language file
+ *
+ * @author joel@schintgen.net
+ */
+$lang['encoding']              = 'utf-8';
+$lang['direction']             = 'ltr';
+$lang['doublequoteopening']    = '“';
+$lang['doublequoteclosing']    = '”';
+$lang['singlequoteopening']    = '‘';
+$lang['singlequoteclosing']    = '’';
+$lang['apostrophe']            = '\'';
+$lang['btn_edit']              = 'Dës Säit änneren';
+$lang['btn_source']            = 'Säitequell weisen';
+$lang['btn_show']              = 'Säit weisen';
+$lang['btn_create']            = 'Dës Säit uleeën';
+$lang['btn_search']            = 'Sichen';
+$lang['btn_save']              = 'Späicheren';
+$lang['btn_preview']           = 'Kucken ouni ofzespäicheren';
+$lang['btn_top']               = 'Zréck no uewen';
+$lang['btn_newer']             = '<< méi rezent';
+$lang['btn_older']             = 'manner rezent >>';
+$lang['btn_revs']              = 'Al Versiounen';
+$lang['btn_recent']            = 'Kierzlech Ännerungen';
+$lang['btn_upload']            = 'Eroplueden';
+$lang['btn_cancel']            = 'Ofbriechen';
+$lang['btn_index']             = 'Index';
+$lang['btn_secedit']           = 'Änneren';
+$lang['btn_login']             = 'Login';
+$lang['btn_logout']            = 'Logout';
+$lang['btn_admin']             = 'Admin';
+$lang['btn_update']            = 'Update';
+$lang['btn_delete']            = 'Läschen';
+$lang['btn_back']              = 'Zeréck';
+$lang['btn_backlink']          = 'Linker zeréck';
+$lang['btn_profile']           = 'Profil aktualiséieren';
+$lang['btn_reset']             = 'Zerécksetzen';
+$lang['btn_draft']             = 'Entworf änneren';
+$lang['btn_recover']           = 'Entworf zeréckhuelen';
+$lang['btn_draftdel']          = 'Entworf läschen';
+$lang['btn_register']          = 'Registréieren';
+$lang['loggedinas']            = 'Ageloggt als:';
+$lang['user']                  = 'Benotzernumm';
+$lang['pass']                  = 'Passwuert';
+$lang['newpass']               = 'Nei Passwuert';
+$lang['oldpass']               = 'Aktuell Passwuert confirméieren';
+$lang['passchk']               = 'nach eng Kéier';
+$lang['remember']              = 'Verhal mech';
+$lang['fullname']              = 'Richtegen Numm';
+$lang['email']                 = 'E-Mail';
+$lang['profile']               = 'Benotzerprofil';
+$lang['badlogin']              = 'Entschëllegt, de Benotzernumm oder d\'Passwuert war falsch';
+$lang['minoredit']             = 'Kleng Ännerungen';
+$lang['draftdate']             = 'Entworf automatesch gespäichert den';
+$lang['nosecedit']             = 'D\'Säit gouf an Zwëschenzäit g\'ännert, Sektiounsinfo veralt. Ganz Säit gouf aplaz gelueden.';
+$lang['regmissing']            = 'Du muss all d\'Felder ausfëllen.';
+$lang['reguexists']            = 'Et get schonn e Benotzer mat deem Numm.';
+$lang['regsuccess']            = 'De Benotzer gouf erstallt an d\'Passwuert via Email geschéckt.';
+$lang['regsuccess2']           = 'De Benotzer gouf erstallt.';
+$lang['regmailfail']           = 'Et gesäit aus wéi wann e Feeler beim schécke vun der Passwuertmail virkomm wier. Kontaktéier den Admin w.e.g.!';
+$lang['regbadmail']            = 'Déi Emailadress gesäit ongëlteg aus - wanns de mengs dat wier e Feeler, da kontaktéier den Admin w.e.g.';
+$lang['regbadpass']            = 'Déi 2 Passwieder si net t\'selwecht. Probéier nach eng Kéier w.e.g.';
+$lang['regpwmail']             = 'Däin DokuWiki Passwuert';
+$lang['reghere']               = 'Hues du nach keen Account? Da maach der een';
+$lang['profna']                = 'Dëse Wiki ënnestëtzt keng Ännerunge vum Profil';
+$lang['profnochange']          = 'Keng Ännerungen. Näischt ze man.';
+$lang['profnoempty']           = 'En eidele Numm oder Emailadress ass net erlaabt.';
+$lang['profchanged']           = 'Benotzerprofil erfollegräicht aktualiséiert.';
+$lang['pwdforget']             = 'Passwuert vergiess? Fro der e Neit';
+$lang['resendna']              = 'Dëse Wiki ënnerstëtzt net d\'Neiverschécke vu Passwieder.';
+$lang['resendpwdmissing']      = 'Du muss all Felder ausfëllen.';
+$lang['resendpwdnouser']       = 'Kann dëse Benotzer net an der Datebank fannen.';
+$lang['resendpwdbadauth']      = 'Den "Auth"-Code ass ongëlteg. Kuck no obs de dee ganze Konfirmationslink benotzt hues.';
+$lang['resendpwdconfirm']      = 'De Konfirmatiounslink gouf iwwer Email geschéckt.';
+$lang['resendpwdsuccess']      = 'Däi nei Passwuert gouf iwwer Email geschéckt.';
+$lang['license']               = 'Wann näischt anescht do steet, ass den Inhalt vun dësem Wiki ënner folgender Lizenz:';
+$lang['licenseok']             = 'Pass op: Wanns de dës Säit änners, bass de dermat averstan dass den Inhalt ënner folgender Lizenz lizenzéiert gëtt:';
+$lang['txt_upload']            = 'Wiel eng Datei fir eropzelueden:';
+$lang['txt_filename']          = 'Eroplueden als (optional):';
+$lang['txt_overwrt']           = 'Bestehend Datei iwwerschreiwen';
+$lang['lockedby']              = 'Am Moment gespaart vun:';
+$lang['lockexpire']            = 'D\'Spär leeft of ëm:';
+$lang['js']['willexpire']            = 'Deng Spär fir d\'Säit ze änneren leeft an enger Minutt of.\nFir Konflikter ze verhënneren, dréck op Kucken ouni ofzespäicheren.';
+$lang['js']['notsavedyet']     = 'Net gespäicher Ännerunge gi verluer.\nWierklech weiderfueren?';
+$lang['rssfailed']             = 'Et ass e Feeler virkomm beim erofluede vun dësem Feed: ';
+$lang['nothingfound']          = 'Näischt fond.';
+$lang['mediaselect']           = 'Mediadateien';
+$lang['uploadsucc']            = 'Upload erfollegräich';
+$lang['uploadfail']            = 'Feeler beim Upload. Vläicht falsch Rechter?';
+$lang['uploadwrong']           = 'Eroplueden net erlaabt. Dës Dateiendung ass verbueden!';
+$lang['uploadexist']           = 'Datei gët et schonn. Näischt gemaach.';
+$lang['uploadbadcontent']      = 'Den eropgeluedenen Inhalt stëmmt net mat der Dateiendung %s iwwereneen.';
+$lang['uploadspam']            = 'D\'Eropluede gouf duerch d\'Schwaarz Spamlëscht blockéiert.';
+$lang['uploadxss']             = 'D\'Eropluede gouf wéinst méiglechem béisaartegem Inhalt blockéiert.';
+$lang['uploadsize']            = 'Déi eropgelueden Datei war ze grouss. (max. %s)';
+$lang['deletesucc']            = 'D\'Datei "%s" gouf geläscht.';
+$lang['deletefail']            = '"%s" konnt net geläscht ginn. Kontroléier d\'Rechter.';
+$lang['mediainuse']            = 'D\'Datei "%s" gouf net geläscht - se ass nach am Gebrauch.';
+$lang['namespaces']            = 'Namespaces';
+$lang['mediafiles']            = 'Verfügbar Dateien am';
+$lang['js']['keepopen']        = 'Fënster beim Auswielen oploossen';
+$lang['js']['hidedetails']     = 'Deteiler verstoppen';
+$lang['mediausage']            = 'Benotz folgend Syntax fir dës Datei ze referenzéieren:';
+$lang['mediaview']             = 'Originaldatei weisen';
+$lang['mediaroot']             = 'root';
+$lang['mediaextchange']        = 'Dateiendung vun .%s op .%s g\'ännert!';
+$lang['reference']             = 'Referenzen fir';
+$lang['ref_inuse']             = 'D\'Datei ka net geläscht ginn wëll se nach ëmmer vu folgende Säite gebraucht gëtt:';
+$lang['ref_hidden']            = 'Verschidde Referenze sinn op Säiten wous de keng Rechter hues fir se ze kucken';
+$lang['hits']                  = 'Treffer';
+$lang['quickhits']             = 'Säitenimm déi iwwereneestëmmen';
+$lang['toc']                   = 'Inhaltsverzeechnes';
+$lang['current']               = 'aktuell';
+$lang['yours']                 = 'Deng Versioun';
+$lang['diff']                  = 'Weis d\'Ënnerscheeder zuer aktueller Versioun';
+$lang['diff2']                 = 'Weis d\'Ënnerscheeder zwescht den ausgewielte Versiounen';
+$lang['line']                  = 'Linn';
+$lang['breadcrumb']            = 'Spuer:';
+$lang['youarehere']            = 'Du bass hei:';
+$lang['lastmod']               = 'Fir d\'lescht g\'ännert:';
+$lang['by']                    = 'vun';
+$lang['deleted']               = 'geläscht';
+$lang['created']               = 'erstallt';
+$lang['restored']              = 'al Versioun zeréckgeholl (%s)';
+$lang['external_edit']         = 'extern Ännerung';
+$lang['summary']               = 'Resumé vun den Ännerungen';
+$lang['noflash']               = 'Den <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> get gebraucht fir dësen Inhalt unzeweisen.';
+$lang['mail_newpage']          = 'Säit bäigesat:';
+$lang['mail_changed']          = 'Säit geännert:';
+$lang['mail_subscribe_list']   = 'g\'ännert Säiten am Namespace:';
+$lang['mail_new_user']         = 'Neie Benotzer:';
+$lang['mail_upload']           = 'Datei eropgelueden:';
+$lang['qb_bold']               = 'Fetten Text';
+$lang['qb_italic']             = 'Schiefen Text';
+$lang['qb_underl']             = 'Ënnerstrachenen Text';
+$lang['qb_code']               = 'Code Text';
+$lang['qb_strike']             = 'Duerchgestrachenen Text';
+$lang['qb_h1']                 = 'Iwwerschrëft vum 1. Niveau';
+$lang['qb_h2']                 = 'Iwwerschrëft vum 2. Niveau';
+$lang['qb_h3']                 = 'Iwwerschrëft vum 3. Niveau';
+$lang['qb_h4']                 = 'Iwwerschrëft vum 4. Niveau';
+$lang['qb_h5']                 = 'Iwwerschrëft vum 5. Niveau';
+$lang['qb_h']                  = 'Iwwerschrëft';
+$lang['qb_hs']                 = 'Iwwerschrëft auswielen';
+$lang['qb_hplus']              = 'Méi grouss Iwwerschrëft';
+$lang['qb_hminus']             = 'Méi kleng Iwwerschrëft';
+$lang['qb_hequal']             = 'Iwwerschrëft vum selwechte Niveau';
+$lang['qb_link']               = 'Interne Link';
+$lang['qb_extlink']            = 'Externe Link';
+$lang['qb_hr']                 = 'Horizontale Stréch';
+$lang['qb_ol']                 = 'Nummeréiert Lëscht';
+$lang['qb_ul']                 = 'Onnummeréiert Lëscht';
+$lang['qb_media']              = 'Biller an aner Dateie bäisetzen';
+$lang['qb_sig']                = 'Ënnerschrëft afügen';
+$lang['qb_smileys']            = 'Smilien';
+$lang['qb_chars']              = 'Spezialzeechen';
+$lang['upperns']               = 'An de Namespace uewendriwwer sprangen';
+$lang['metaedit']              = 'Metadaten änneren';
+$lang['metasaveerr']           = 'Feeler beim Schreiwe vun de Metadaten';
+$lang['metasaveok']            = 'Metadate gespäichert';
+$lang['btn_img_backto']            = 'Zeréck op %s';
+$lang['img_title']             = 'Titel:';
+$lang['img_caption']           = 'Beschreiwung:';
+$lang['img_date']              = 'Datum:';
+$lang['img_fname']             = 'Dateinumm:';
+$lang['img_fsize']             = 'Gréisst:';
+$lang['img_artist']            = 'Fotograf:';
+$lang['img_copyr']             = 'Copyright:';
+$lang['img_format']            = 'Format:';
+$lang['img_camera']            = 'Kamera:';
+$lang['img_keywords']          = 'Schlësselwieder:';
+$lang['authtempfail']          = 'D\'Benotzerautentifikatioun ass de Moment net verfügbar. Wann dës Situatioun unhält, dann informéier w.e.g. de Wiki Admin.';
+$lang['i_chooselang']          = 'Wiel deng Sprooch';
+$lang['i_installer']           = 'DokuWiki Installer';
+$lang['i_wikiname']            = 'Numm vum Wiki';
+$lang['i_enableacl']           = 'ACL uschalten (rekommandéiert)';
+$lang['i_problems']            = 'Den Installer huet Problemer fond. Se stinn hei ënnendrënner. Du kanns net weiderfueren bis de se behuewen hues.';
+$lang['i_modified']            = 'Aus Sécherheetsgrënn funktionnéiert dëse Script nëmme mat enger neier an onverännerter Dokuwiki Installatioun. Entweder muss de d\'Dateie frësch extrahéieren oder kuck d\'komplett <a href="http://dokuwiki.org/install">Dokuwiki Installatiounsinstruktiounen</a>';
+$lang['i_funcna']              = 'PHP-Funktioun <code>%s</code> ass net verfügbar. Vläicht huet däi Provider se aus iergend engem Grond ausgeschalt.';
+$lang['i_phpver']              = 'Deng PHP-Versioun <code>%s</code> ass méi kleng wéi déi gebrauchte Versioun <code>%s</code>. Du muss deng PHP-Installatioun aktualiséieren. ';
+$lang['i_pol0']                = 'Oppene Wiki (liese, schreiwen an eroplueden fir jidfereen)';
+$lang['i_pol1']                = 'Ëffentleche Wiki (liesen fir jidfereen, schreiwen an eroplueden fir registréiert Benotzer)';
+$lang['i_pol2']                = 'Zouene Wiki (liesen, schreiwen, eroplueden nëmme fir registréiert Benotzer)';
+$lang['i_retry']               = 'Nach eng Kéier probéieren';
+$lang['recent_global']         = 'Du kucks am Moment d\'Ännerungen innerhalb vum <b>%s</b> Namespace. Du kanns och <a href="%s">d\'Kierzilech Ännerungen vum ganze Wiki kucken</a>.';
+$lang['years']                 = 'virun %d Joer';
+$lang['months']                = 'virun %d Méint';
+$lang['weeks']                 = 'virun %d Wochen';
+$lang['days']                  = 'virun %d Deeg';
+$lang['hours']                 = 'virun %d Stonnen';
+$lang['minutes']               = 'virun %d Minutten';
+$lang['seconds']               = 'virun %d Sekonnen';
+$lang['email_signature_text'] = 'Dës Mail gouf generéiert vun DokuWiki op
+@DOKUWIKIURL@';
diff --git a/wiki/inc/lang/lb/locked.txt b/wiki/inc/lang/lb/locked.txt
new file mode 100644
index 0000000..944efb2
--- /dev/null
+++ b/wiki/inc/lang/lb/locked.txt
@@ -0,0 +1,3 @@
+====== Säit gespaart ======
+
+Dës Säit ass am Moment duerch en anere Benotzer fir Ännerunge gespart. Du muss waarde bis e mat sengen Ännerunge fäerdeg ass oder d'Spär ofleeft.
\ No newline at end of file
diff --git a/wiki/inc/lang/lb/login.txt b/wiki/inc/lang/lb/login.txt
new file mode 100644
index 0000000..7d0548e
--- /dev/null
+++ b/wiki/inc/lang/lb/login.txt
@@ -0,0 +1,3 @@
+====== Aloggen ======
+
+Du bass am Moment net ageloggt! Gëff deng Autoriséierungsinformatiounen hei ënnendrënner an. Du muss d'Cookien erlaabt hunn fir dech kënnen anzeloggen.
diff --git a/wiki/inc/lang/lb/mailtext.txt b/wiki/inc/lang/lb/mailtext.txt
new file mode 100644
index 0000000..59c46e0
--- /dev/null
+++ b/wiki/inc/lang/lb/mailtext.txt
@@ -0,0 +1,12 @@
+Et gouf eng Säit an dengem DokuWiki g'ännert oder nei erstallt. Hei sinn d'Detailer:
+
+Datum          : @DATE@
+Browser        : @BROWSER@
+IP-Address     : @IPADDRESS@
+Hostname       : @HOSTNAME@
+Al Versioun    : @OLDPAGE@
+Nei Versioun   : @NEWPAGE@
+Zesummefaassung: @SUMMARY@
+Benotzer       : @USER@
+
+@DIFF@
diff --git a/wiki/inc/lang/lb/newpage.txt b/wiki/inc/lang/lb/newpage.txt
new file mode 100644
index 0000000..9391761
--- /dev/null
+++ b/wiki/inc/lang/lb/newpage.txt
@@ -0,0 +1,4 @@
+======Dësen Thema gëtt et nach net======
+
+Du hues op e Link vun enger Säit geklickt, déi et nach net gëtt. Wanns de déi néideg Rechter hues, da kanns de dës Säit uleeën andeems de op ''Dës Säit uleeën'' klicks.
+
diff --git a/wiki/inc/lang/lb/norev.txt b/wiki/inc/lang/lb/norev.txt
new file mode 100644
index 0000000..45a36ee
--- /dev/null
+++ b/wiki/inc/lang/lb/norev.txt
@@ -0,0 +1,3 @@
+====== Keng sou Versioun ======
+
+Déi Versioun gëtt et net. Benotz de Kneppchen ''Al Versiounen'' fir eng Lëscht vun ale Versiounen vun dësem Dokument.
diff --git a/wiki/inc/lang/lb/password.txt b/wiki/inc/lang/lb/password.txt
new file mode 100644
index 0000000..1d05832
--- /dev/null
+++ b/wiki/inc/lang/lb/password.txt
@@ -0,0 +1,6 @@
+Moien @FULLNAME@!
+
+Hei sinn deng Benotzerdaten fir @TITLE@ op @DOKUWIKIURL@
+
+Benotzernumm : @LOGIN@
+Passwuert    : @PASSWORD@
diff --git a/wiki/inc/lang/lb/preview.txt b/wiki/inc/lang/lb/preview.txt
new file mode 100644
index 0000000..f131cda
--- /dev/null
+++ b/wiki/inc/lang/lb/preview.txt
@@ -0,0 +1,3 @@
+======Net gespäichert Versioun======
+
+Dëst ass nëmmen eng net gespäichert Versioun; d'Ännerunge sinn nach **net** gespäichert!
diff --git a/wiki/inc/lang/lb/pwconfirm.txt b/wiki/inc/lang/lb/pwconfirm.txt
new file mode 100644
index 0000000..efb0406
--- /dev/null
+++ b/wiki/inc/lang/lb/pwconfirm.txt
@@ -0,0 +1,11 @@
+Moien @FULLNAME@!
+
+Iergendeen huet e neit Passwuert fir däin @TITLE@
+login op @DOKUWIKIURL@ gefrot
+
+Wanns de kee nei Passwuert gefrot hues, dann ignoréier dës Mail.
+
+Fir ze konfirméieren dass du wierklech en neit Passwuert gefrot hues,
+klick op folgende Link.
+
+@CONFIRM@
diff --git a/wiki/inc/lang/lb/read.txt b/wiki/inc/lang/lb/read.txt
new file mode 100644
index 0000000..3f52bd6
--- /dev/null
+++ b/wiki/inc/lang/lb/read.txt
@@ -0,0 +1 @@
+Dës Säit ass nëmme fir ze kucken. Du kanns d'Quell kucken, mee net änneren. Fro däin Administrator wanns de mengs dat wier falsch.
diff --git a/wiki/inc/lang/lb/recent.txt b/wiki/inc/lang/lb/recent.txt
new file mode 100644
index 0000000..c7359e2
--- /dev/null
+++ b/wiki/inc/lang/lb/recent.txt
@@ -0,0 +1,4 @@
+====== Rezent Ännerungen ======
+
+Folgend Säite goufen an der lescht g'ännert.
+
diff --git a/wiki/inc/lang/lb/register.txt b/wiki/inc/lang/lb/register.txt
new file mode 100644
index 0000000..1e017e9
--- /dev/null
+++ b/wiki/inc/lang/lb/register.txt
@@ -0,0 +1,4 @@
+====== Als neie Benotzer registréieren ======
+
+Fëll alles hei ënnendrënner aus fir en neie Kont op dësem Wiki unzeleeën. Pass op dass de eng **gëlteg Emailadress** ugëss - wanns de net gefrot gëss hei e Passwuert anzeginn, da kriss de e neit op déi Adress geschéckt. De Benotzernumm soll e gëltege [[doku>pagename|Säitenumm]] sinn.
+
diff --git a/wiki/inc/lang/lb/registermail.txt b/wiki/inc/lang/lb/registermail.txt
new file mode 100644
index 0000000..5240dee
--- /dev/null
+++ b/wiki/inc/lang/lb/registermail.txt
@@ -0,0 +1,10 @@
+Et huet sech e neie Benotzer registréiert. Hei sinn d'Deteiler:
+
+Benotzernumm: @NEWUSER@
+Ganze Numm  : @NEWNAME@
+Email       : @NEWEMAIL@
+
+Datum       : @DATE@
+Browser     : @BROWSER@
+IP-Adress   : @IPADDRESS@
+Hostnumm    : @HOSTNAME@
diff --git a/wiki/inc/lang/lb/resendpwd.txt b/wiki/inc/lang/lb/resendpwd.txt
new file mode 100644
index 0000000..6ca4518
--- /dev/null
+++ b/wiki/inc/lang/lb/resendpwd.txt
@@ -0,0 +1,3 @@
+====== Nei Passwuert schécken ======
+
+Gëff w.e.g. däi Benotzernumm an de Formulär hei ënnendrënner an fir e neit Passwuert fir dëse Wiki unzefroen. E Konfirmatiounslink gëtt dann op deng registréiert Emailadress geschéckt.
diff --git a/wiki/inc/lang/lb/revisions.txt b/wiki/inc/lang/lb/revisions.txt
new file mode 100644
index 0000000..7dec327
--- /dev/null
+++ b/wiki/inc/lang/lb/revisions.txt
@@ -0,0 +1,3 @@
+====== Al Versiounen ======
+
+Hei sinn déi al Versiounen vun dësem Dokument. Fir op eng al Versioun zeréckzegoen, wiel se hei ënnendrënner eraus, klick ''Dës Säit änneren'' a späicher se.
diff --git a/wiki/inc/lang/lb/searchpage.txt b/wiki/inc/lang/lb/searchpage.txt
new file mode 100644
index 0000000..c2e76eb
--- /dev/null
+++ b/wiki/inc/lang/lb/searchpage.txt
@@ -0,0 +1,4 @@
+======Sich======
+
+Hei ënnendrënner sinn d'Resultater vun der Sich. @CREATEPAGEINFO@
+
diff --git a/wiki/inc/lang/lb/showrev.txt b/wiki/inc/lang/lb/showrev.txt
new file mode 100644
index 0000000..f6e2dee
--- /dev/null
+++ b/wiki/inc/lang/lb/showrev.txt
@@ -0,0 +1,2 @@
+**Dat hei ass eng al Versioun vum Document!**
+----
\ No newline at end of file
diff --git a/wiki/inc/lang/lb/updateprofile.txt b/wiki/inc/lang/lb/updateprofile.txt
new file mode 100644
index 0000000..326d622
--- /dev/null
+++ b/wiki/inc/lang/lb/updateprofile.txt
@@ -0,0 +1,4 @@
+====== Profil aktualiséieren ======
+
+Du brauchs just d'Felder auszefëllen déis de wëlls änneren. Du kanns däi Benotzernumm net änneren.
+
diff --git a/wiki/inc/lang/lb/uploadmail.txt b/wiki/inc/lang/lb/uploadmail.txt
new file mode 100644
index 0000000..c4b9e8d
--- /dev/null
+++ b/wiki/inc/lang/lb/uploadmail.txt
@@ -0,0 +1,10 @@
+Eng Datei gouf op däin DokuWiki eropgelueden. Hei sinn d'Deteiler:
+
+Datei       : @MEDIA@
+Datum       : @DATE@
+Browser     : @BROWSER@
+IP-Adress   : @IPADDRESS@
+Hostnumm    : @HOSTNAME@
+Gréisst     : @SIZE@
+MIME Typ    : @MIME@
+Benotzer    : @USER@
diff --git a/wiki/inc/lang/lt/admin.txt b/wiki/inc/lang/lt/admin.txt
new file mode 100644
index 0000000..fd9ae9a
--- /dev/null
+++ b/wiki/inc/lang/lt/admin.txt
@@ -0,0 +1,4 @@
+====== Administracija ======
+
+Žemiau matote veiksmų, kuriuos gali atlikti administratorius, sąrašą.
+
diff --git a/wiki/inc/lang/lt/backlinks.txt b/wiki/inc/lang/lt/backlinks.txt
new file mode 100644
index 0000000..ad0d5b8
--- /dev/null
+++ b/wiki/inc/lang/lt/backlinks.txt
@@ -0,0 +1,4 @@
+====== Atgalinės nuorodos ======
+
+Čia matote sąrašą puslapių, kuriuose yra nuorodos į esamą puslapį.
+
diff --git a/wiki/inc/lang/lt/conflict.txt b/wiki/inc/lang/lt/conflict.txt
new file mode 100644
index 0000000..be0c5ff
--- /dev/null
+++ b/wiki/inc/lang/lt/conflict.txt
@@ -0,0 +1,6 @@
+====== Egzistuoja naujesnė versija ======
+
+Rasta naujesnė dokumento, kurį redagavote, versija. Tai atsitinka tada, kai kitas vartotojas modifikuoja dokumentą tuo metu, kai jūs jį redaguojate.
+
+Atidžiai peržvelkite žemiau esančius skirtumus ir nuspręskite, kurią versiją išsaugoti. Paspausdami ''Išsaugoti'' išsaugosite saviškę versiją. Paspausdami ''Atšaukti'' išsaugosite esamą versiją.
+
diff --git a/wiki/inc/lang/lt/denied.txt b/wiki/inc/lang/lt/denied.txt
new file mode 100644
index 0000000..9a85446
--- /dev/null
+++ b/wiki/inc/lang/lt/denied.txt
@@ -0,0 +1,4 @@
+====== Priėjimas uždraustas ======
+
+Jūs neturite reikiamų teisių, kad galėtumėte tęsti.
+
diff --git a/wiki/inc/lang/lt/diff.txt b/wiki/inc/lang/lt/diff.txt
new file mode 100644
index 0000000..dc5e59f
--- /dev/null
+++ b/wiki/inc/lang/lt/diff.txt
@@ -0,0 +1,4 @@
+====== Skirtumai ======
+
+Čia matote skirtumus tarp pasirinktos versijos ir esamo dokumento.
+
diff --git a/wiki/inc/lang/lt/edit.txt b/wiki/inc/lang/lt/edit.txt
new file mode 100644
index 0000000..8fadf97
--- /dev/null
+++ b/wiki/inc/lang/lt/edit.txt
@@ -0,0 +1,2 @@
+Modifikuokite šį puslapį ir paspauskite ''Išsaugoti''. Apie wiki sintaksę galite paskaityti [[wiki:syntax|čia]]. Prašome redaguoti šį puslapį tik tada, kai galite jį **patobulinti**. Jei tik norite išbandyti wiki galimybes, prašytume tai daryti [[playground:playground|čia]].
+
diff --git a/wiki/inc/lang/lt/editrev.txt b/wiki/inc/lang/lt/editrev.txt
new file mode 100644
index 0000000..9e5eaee
--- /dev/null
+++ b/wiki/inc/lang/lt/editrev.txt
@@ -0,0 +1,2 @@
+**Jūs naudojate seną šio dokumento versiją!** jei ją išsaugosite, su šiais duomenimis sukursite naują versiją.
+----
\ No newline at end of file
diff --git a/wiki/inc/lang/lt/index.txt b/wiki/inc/lang/lt/index.txt
new file mode 100644
index 0000000..d13683c
--- /dev/null
+++ b/wiki/inc/lang/lt/index.txt
@@ -0,0 +1,4 @@
+====== Indeksas ======
+
+Čia matote visų šiuo metu egzistuojančių puslapių sąrašą. Jie išrūšiuoti pagal [[doku>namespaces|pavadinimą]].
+
diff --git a/wiki/inc/lang/lt/jquery.ui.datepicker.js b/wiki/inc/lang/lt/jquery.ui.datepicker.js
new file mode 100644
index 0000000..a57fd9d
--- /dev/null
+++ b/wiki/inc/lang/lt/jquery.ui.datepicker.js
@@ -0,0 +1,45 @@
+/* Lithuanian (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* @author Arturas Paleicikas <arturas@avalon.lt> */
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "../widgets/datepicker" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery.datepicker );
+	}
+}( function( datepicker ) {
+
+datepicker.regional.lt = {
+	closeText: "Uždaryti",
+	prevText: "&#x3C;Atgal",
+	nextText: "Pirmyn&#x3E;",
+	currentText: "Šiandien",
+	monthNames: [ "Sausis","Vasaris","Kovas","Balandis","Gegužė","Birželis",
+	"Liepa","Rugpjūtis","Rugsėjis","Spalis","Lapkritis","Gruodis" ],
+	monthNamesShort: [ "Sau","Vas","Kov","Bal","Geg","Bir",
+	"Lie","Rugp","Rugs","Spa","Lap","Gru" ],
+	dayNames: [
+		"sekmadienis",
+		"pirmadienis",
+		"antradienis",
+		"trečiadienis",
+		"ketvirtadienis",
+		"penktadienis",
+		"šeštadienis"
+	],
+	dayNamesShort: [ "sek","pir","ant","tre","ket","pen","šeš" ],
+	dayNamesMin: [ "Se","Pr","An","Tr","Ke","Pe","Še" ],
+	weekHeader: "SAV",
+	dateFormat: "yy-mm-dd",
+	firstDay: 1,
+	isRTL: false,
+	showMonthAfterYear: true,
+	yearSuffix: "" };
+datepicker.setDefaults( datepicker.regional.lt );
+
+return datepicker.regional.lt;
+
+} ) );
diff --git a/wiki/inc/lang/lt/lang.php b/wiki/inc/lang/lt/lang.php
new file mode 100644
index 0000000..67fabef
--- /dev/null
+++ b/wiki/inc/lang/lt/lang.php
@@ -0,0 +1,183 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Linas Valiukas <shirshegsm@gmail.com>
+ * @author Edmondas Girkantas <eg@zemaitija.net>
+ * @author Arūnas Vaitekūnas <aras@fan.lt>
+ * @author audrius.klevas@gmail.com
+ * @author Tomas Darius Davainis <tomasdd@gmail.com>
+ */
+$lang['encoding']              = 'utf-8';
+$lang['direction']             = 'ltr';
+$lang['doublequoteopening']    = '„';
+$lang['doublequoteclosing']    = '“';
+$lang['singlequoteopening']    = '‚';
+$lang['singlequoteclosing']    = '‘';
+$lang['apostrophe']            = '’';
+$lang['btn_edit']              = 'Redaguoti šį puslapį';
+$lang['btn_source']            = 'Parodyti puslapio kodą';
+$lang['btn_show']              = 'Parodyti puslapį';
+$lang['btn_create']            = 'Sukurti šį puslapį';
+$lang['btn_search']            = 'Paieška';
+$lang['btn_save']              = 'Išsaugoti';
+$lang['btn_preview']           = 'Peržiūra';
+$lang['btn_top']               = 'Į viršų';
+$lang['btn_newer']             = '<< naujesnė';
+$lang['btn_older']             = 'senesnė >>';
+$lang['btn_revs']              = 'Senos versijos';
+$lang['btn_recent']            = 'Naujausi keitimai';
+$lang['btn_upload']            = 'Atsiųsti bylą';
+$lang['btn_cancel']            = 'Atšaukti';
+$lang['btn_index']             = 'Indeksas';
+$lang['btn_secedit']           = 'Redaguoti';
+$lang['btn_login']             = 'Prisijungti';
+$lang['btn_logout']            = 'Atsijungti';
+$lang['btn_admin']             = 'Administracija';
+$lang['btn_update']            = 'Atnaujinti';
+$lang['btn_delete']            = 'Ištrinti';
+$lang['btn_back']              = 'Atgal';
+$lang['btn_backlink']          = 'Atgalinės nuorodos';
+$lang['btn_subscribe']         = 'Užsisakyti keitimų prenumeratą';
+$lang['btn_profile']           = 'Atnaujinti profilį';
+$lang['btn_reset']             = 'Atstata';
+$lang['btn_draft']             = 'Redaguoti juodraštį';
+$lang['btn_recover']           = 'Atkurti juodraštį';
+$lang['btn_draftdel']          = 'Šalinti juodraštį';
+$lang['btn_register']          = 'Registruotis';
+$lang['btn_img_backto']        = 'Atgal į %s';
+$lang['loggedinas']            = 'Prisijungęs kaip:';
+$lang['user']                  = 'Vartotojo vardas';
+$lang['pass']                  = 'Slaptažodis';
+$lang['newpass']               = 'Naujas slaptažodis';
+$lang['oldpass']               = 'Patvirtinti esamą slaptažodį';
+$lang['passchk']               = 'dar kartą';
+$lang['remember']              = 'Prisiminti mane';
+$lang['fullname']              = 'Visas vardas';
+$lang['email']                 = 'El. pašto adresas';
+$lang['profile']               = 'Vartotojo profilis';
+$lang['badlogin']              = 'Nurodėte blogą vartotojo vardą arba slaptažodį.';
+$lang['minoredit']             = 'Nedidelis pataisymas';
+$lang['draftdate']             = 'Juodraštis automatiškai išsaugotas';
+$lang['nosecedit']             = 'Puslapis buvo kažkieno pataisytas, teksto dalies informacija tapo pasenusi, todėl pakrautas visas puslapis.';
+$lang['regmissing']            = 'Turite užpildyti visus laukus.';
+$lang['reguexists']            = 'Vartotojas su pasirinktu prisijungimo vardu jau egzistuoja.';
+$lang['regsuccess']            = 'Vartotojas sukurtas, slaptažodis išsiųstas el. paštu.';
+$lang['regsuccess2']           = 'Vartotojas sukurtas.';
+$lang['regmailfail']           = 'Siunčiant slaptažodį el. paštu įvyko klaida - susisiekite su administracija!';
+$lang['regbadmail']            = 'Nurodytas el. pašto adresas yra neteisingas - jei manote, kad tai klaida, susisiekite su administracija';
+$lang['regbadpass']            = 'Įvesti slaptažodžiai nesutampa, bandykite dar kartą.';
+$lang['regpwmail']             = 'Jūsų DokuWiki slaptažodis';
+$lang['reghere']               = 'Dar neužsiregistravote? Padarykite tai dabar';
+$lang['profna']                = 'Ši vikisvetainė neleidžia pakeisti profilio';
+$lang['profnochange']          = 'Nėra pakeitimų, todėl nėra ką atlikti.';
+$lang['profnoempty']           = 'Tuščias vardo arba el. pašto adreso laukas nėra leidžiamas.';
+$lang['profchanged']           = 'Vartotojo profilis sėkmingai atnaujintas.';
+$lang['pwdforget']             = 'Pamiršote slaptažodį? Gaukite naują';
+$lang['resendna']              = 'Ši vikisvetainė neleidžia persiųsti slaptažodžių.';
+$lang['resendpwdmissing']      = 'Jūs turite užpildyti visus laukus.';
+$lang['resendpwdnouser']       = 'Tokio vartotojo nėra duomenų bazėje.';
+$lang['resendpwdbadauth']      = 'Atsiprašome, bet šis tapatybės nustatymo kodas netinkamas. Įsitikinkite, kad panaudojote pilną patvirtinimo nuorodą.';
+$lang['resendpwdconfirm']      = 'Patvirtinimo nuoroda išsiųsta el. paštu.';
+$lang['resendpwdsuccess']      = 'Jūsų naujas slaptažodis buvo išsiųstas el. paštu.';
+$lang['license']               = 'Jei nenurodyta kitaip, šio wiki turinys ginamas tokia licencija:';
+$lang['licenseok']             = 'Pastaba: Redaguodami šį puslapį jūs sutinkate jog jūsų turinys atitinka licencijavima pagal šią licenciją';
+$lang['txt_upload']            = 'Išsirinkite atsiunčiamą bylą:';
+$lang['txt_filename']          = 'Įveskite wikivardą (nebūtina):';
+$lang['txt_overwrt']           = 'Perrašyti egzistuojančią bylą';
+$lang['lockedby']              = 'Užrakintas vartotojo:';
+$lang['lockexpire']            = 'Užraktas bus nuimtas:';
+$lang['js']['willexpire']      = 'Šio puslapio redagavimo užrakto galiojimo laikas baigsis po minutės.\nNorėdami išvengti nesklandumų naudokite peržiūros mygtuką ir užraktas atsinaujins.';
+$lang['js']['notsavedyet']     = 'Pakeitimai nebus išsaugoti.\nTikrai tęsti?';
+$lang['js']['keepopen']        = 'Pažymėjus palikti langą atvertą';
+$lang['js']['hidedetails']     = 'Paslėpti Detales';
+$lang['js']['nosmblinks']      = 'Nurodos į "Windows shares" veikia tik su Microsoft Internet Explorer naršykle.
+Vis dėlto, jūs galite nukopijuoti šią nuorodą.';
+$lang['js']['del_confirm']     = 'Ar tikrai ištrinti pažymėtą(us) įrašą(us)?';
+$lang['rssfailed']             = 'Siunčiant šį feed\'ą įvyko klaida: ';
+$lang['nothingfound']          = 'Paieškos rezultatų nėra.';
+$lang['mediaselect']           = 'Mediabylos išsirinkimas';
+$lang['uploadsucc']            = 'Atsiuntimas pavyko';
+$lang['uploadfail']            = 'Atsiuntimas nepavyko. Blogi priėjimo leidimai??';
+$lang['uploadwrong']           = 'Atsiuntimas atmestas. Bylos tipas neleistinas';
+$lang['uploadexist']           = 'Tokia byla jau egzistuoja. Veiksmai atšaukti.';
+$lang['uploadbadcontent']      = 'Įkeltas turinys neatitinka %s failo išplėtimo.';
+$lang['uploadspam']            = 'Įkėlimas blokuotas pagal šiukšlintojų juodajį šąrašą.';
+$lang['uploadxss']             = 'Įkėlimas blokuotas greičiausiai dėl netinkamo teksto.';
+$lang['uploadsize']            = 'Įkeltas failas per didelis (maks. %s)';
+$lang['deletesucc']            = 'Byla "%s" ištrinta.';
+$lang['deletefail']            = 'Byla "%s" negali būti ištrinta - patikrinkite leidimus.';
+$lang['mediainuse']            = 'Byla "%s" nebuvo ištrinta - ji vis dar naudojama.';
+$lang['namespaces']            = 'Pavadinimai';
+$lang['mediafiles']            = 'Prieinamos bylos';
+$lang['mediausage']            = 'Failo nuorodai užrašyti naudokite tokią sintaksę:';
+$lang['mediaview']             = 'Žiūrėti pirminį failą';
+$lang['mediaroot']             = 'pradžia (root)';
+$lang['mediaextchange']        = 'Failo galūnė pasikeitė iš .%s į .%s!';
+$lang['reference']             = 'Paminėjimai';
+$lang['ref_inuse']             = 'Byla negali būti ištrinta, nes ji vis dar yra naudojama šiuose puslapiuose:';
+$lang['ref_hidden']            = 'Kai kurie paminėjimai yra puslapiuose, kurių jums neleista skaityti.';
+$lang['hits']                  = 'Atidarymai';
+$lang['quickhits']             = 'Sutampantys pavadinimai';
+$lang['toc']                   = 'Turinys';
+$lang['current']               = 'esamas';
+$lang['yours']                 = 'Jūsų versija';
+$lang['diff']                  = 'rodyti skirtumus tarp šios ir esamos versijos';
+$lang['diff2']                 = 'Parodyti skirtumus tarp pasirinktų versijų';
+$lang['line']                  = 'Linija';
+$lang['breadcrumb']            = 'Kelias:';
+$lang['youarehere']            = 'Jūs esate čia:';
+$lang['lastmod']               = 'Keista:';
+$lang['by']                    = 'vartotojo';
+$lang['deleted']               = 'ištrintas';
+$lang['created']               = 'sukurtas';
+$lang['restored']              = 'atstatyta sena versija (%s)';
+$lang['external_edit']         = 'redaguoti papildomomis priemonėmis';
+$lang['summary']               = 'Redaguoti santrauką';
+$lang['noflash']               = '<a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> reikalingas šios medžiagos peržiūrai.';
+$lang['mail_newpage']          = '[DokuWiki] puslapis pridėtas:';
+$lang['mail_changed']          = '[DokuWiki] puslapis pakeistas:';
+$lang['mail_new_user']         = 'naujas vartotojas:';
+$lang['mail_upload']           = 'failas įkeltas:';
+$lang['qb_bold']               = 'Pusjuodis';
+$lang['qb_italic']             = 'Kursyvas';
+$lang['qb_underl']             = 'Pabrauktas';
+$lang['qb_code']               = 'Kodas';
+$lang['qb_strike']             = 'Perbraukta';
+$lang['qb_h1']                 = 'Pirmo lygio antraštė';
+$lang['qb_h2']                 = 'Antro lygio antraštė';
+$lang['qb_h3']                 = 'Trečio lygio antraštė';
+$lang['qb_h4']                 = 'Ketvirto lygio antraštė';
+$lang['qb_h5']                 = 'Penkto lygio antraštė';
+$lang['qb_link']               = 'Vidinė nuoroda';
+$lang['qb_extlink']            = 'Išorinė nuoroda';
+$lang['qb_hr']                 = 'Horizontali linija';
+$lang['qb_ol']                 = 'Numeruotas sąrašas';
+$lang['qb_ul']                 = 'Nenumetuotas sąrašas';
+$lang['qb_media']              = 'Paveikslėliai ir kitos bylos';
+$lang['qb_sig']                = 'Įterpti parašą';
+$lang['qb_smileys']            = 'Šypsenėlės';
+$lang['qb_chars']              = 'Specialūs simboliai';
+$lang['metaedit']              = 'Redaguoti metaduomenis';
+$lang['metasaveerr']           = 'Nepavyko išsaugoti metaduomenų';
+$lang['metasaveok']            = 'Metaduomenys išsaugoti';
+$lang['img_title']             = 'Pavadinimas:';
+$lang['img_caption']           = 'Antraštė:';
+$lang['img_date']              = 'Data:';
+$lang['img_fname']             = 'Bylos pavadinimas:';
+$lang['img_fsize']             = 'Dydis:';
+$lang['img_artist']            = 'Fotografas:';
+$lang['img_copyr']             = 'Autorinės teisės:';
+$lang['img_format']            = 'Formatas:';
+$lang['img_camera']            = 'Kamera:';
+$lang['img_keywords']          = 'Raktiniai žodžiai:';
+$lang['authtempfail']          = 'Vartotojo tapatumo nustatymas laikinai nepasiekiamas. Jei ši situacija kartojasi, tai praneškite savo administratoriui.';
+$lang['i_chooselang']          = 'Pasirinkite kalbą';
+$lang['i_installer']           = 'DokuWiki Instaliatorius';
+$lang['i_wikiname']            = 'Wiki vardas';
+$lang['i_enableacl']           = 'Įjungti ACL (rekomenduojama)';
+$lang['i_superuser']           = 'Supervartotojas';
+$lang['i_problems']            = 'Instaliavimo metu buvo klaidų, kurios pateiktos žemiau. Tęsti negalima, kol nebus pašalintos priežastys.';
+$lang['email_signature_text'] = 'Šis laiškas buvo sugeneruotas DokuWiki
+@DOKUWIKIURL@';
diff --git a/wiki/inc/lang/lt/locked.txt b/wiki/inc/lang/lt/locked.txt
new file mode 100644
index 0000000..3f6d000
--- /dev/null
+++ b/wiki/inc/lang/lt/locked.txt
@@ -0,0 +1,3 @@
+====== Puslapis užrakintas ======
+
+Šis puslapis yra apsaugotas (užrakintas) nuo kitų vartotojų pakeitimų. Norėdami redaguoti puslapį, turėsite palaukti, kol kitas vartotojas baigs tai daryti arba „užrakto“ galiojimo laikas pasibaigs.
diff --git a/wiki/inc/lang/lt/login.txt b/wiki/inc/lang/lt/login.txt
new file mode 100644
index 0000000..2a6e21d
--- /dev/null
+++ b/wiki/inc/lang/lt/login.txt
@@ -0,0 +1,5 @@
+====== Prisijungimas ======
+
+Šiuo metu jūs nesate prisijungęs. Įveskite savo prisijungimo duomenis žemiau. „Cookies“ palaikymas jūsų naršyklėje turi būti įjungtas.
+
+
diff --git a/wiki/inc/lang/lt/mailtext.txt b/wiki/inc/lang/lt/mailtext.txt
new file mode 100644
index 0000000..2abd3ab
--- /dev/null
+++ b/wiki/inc/lang/lt/mailtext.txt
@@ -0,0 +1,14 @@
+Jūsų DokuWiki buvo sukurtas arba pakeistas puslapis. Detalės:
+
+Data        : @DATE@
+Naršyklė     : @BROWSER@
+IP adresas  : @IPADDRESS@
+Host'as    : @HOSTNAME@
+Sena versija: @OLDPAGE@
+Nauja versija: @NEWPAGE@
+Redagavimo aprašas: @SUMMARY@
+Vartotojas        : @USER@
+
+Pakeitimo diff'as:
+
+@DIFF@
diff --git a/wiki/inc/lang/lt/newpage.txt b/wiki/inc/lang/lt/newpage.txt
new file mode 100644
index 0000000..c28e30b
--- /dev/null
+++ b/wiki/inc/lang/lt/newpage.txt
@@ -0,0 +1,4 @@
+====== Šis puslapis dar neegzistuoja ======
+
+Nuoroda, kurią jūs paspaudėte, atvedė į dar neegzistuojantį puslapį. Jūs galite jį sukurti paspausdami ''Sukurti šį puslapį'' mygtuką.
+
diff --git a/wiki/inc/lang/lt/norev.txt b/wiki/inc/lang/lt/norev.txt
new file mode 100644
index 0000000..028ebe7
--- /dev/null
+++ b/wiki/inc/lang/lt/norev.txt
@@ -0,0 +1,5 @@
+====== Tokios versijos nėra ======
+
+Nurodyta versija neegzistuoja. Norėdami pamatyti visas dokumento versijas, paspauskite ''Senos versijos'' mygtuką
+
+
diff --git a/wiki/inc/lang/lt/password.txt b/wiki/inc/lang/lt/password.txt
new file mode 100644
index 0000000..0bcc8e7
--- /dev/null
+++ b/wiki/inc/lang/lt/password.txt
@@ -0,0 +1,6 @@
+Labas, @FULLNAME@!
+
+Čia yra jūsų prisijungimo duomenys prie tinklalapio @TITLE@ (@DOKUWIKIURL@):
+
+Prisijungimo vardas:  @LOGIN@
+Slaptažodis:          @PASSWORD@
diff --git a/wiki/inc/lang/lt/preview.txt b/wiki/inc/lang/lt/preview.txt
new file mode 100644
index 0000000..2d24e21
--- /dev/null
+++ b/wiki/inc/lang/lt/preview.txt
@@ -0,0 +1,5 @@
+====== Peržiūra ======
+
+Čia matote, kaip atrodo jūsų pakeitimai. **Pakeitimai dar nėra išsaugoti!**
+
+
diff --git a/wiki/inc/lang/lt/read.txt b/wiki/inc/lang/lt/read.txt
new file mode 100644
index 0000000..91ea7e6
--- /dev/null
+++ b/wiki/inc/lang/lt/read.txt
@@ -0,0 +1,3 @@
+Šį puslapį galima tik skaityti. Jūs galite peržvelgti jo kodą (source), bet negalite jo keisti. Jei manote, kad tai klaida - susisiekite su administratoriumi.
+
+
diff --git a/wiki/inc/lang/lt/recent.txt b/wiki/inc/lang/lt/recent.txt
new file mode 100644
index 0000000..5065386
--- /dev/null
+++ b/wiki/inc/lang/lt/recent.txt
@@ -0,0 +1,5 @@
+====== Naujausi keitimai ======
+
+Šie puslapiai buvo neseniai pakeisti.
+
+
diff --git a/wiki/inc/lang/lt/register.txt b/wiki/inc/lang/lt/register.txt
new file mode 100644
index 0000000..f595826
--- /dev/null
+++ b/wiki/inc/lang/lt/register.txt
@@ -0,0 +1,4 @@
+====== Naujo vartotojo registracija ======
+
+Norėdami tapti nauju registruotu šio tinklalapio vartotoju, užpildykite žemiau esančią formą. Būtinai turite nurodyti **veikiantį el. pašto adresą**, nes jūsų slaptažodis bus išsiųstas pastaruoju adresu. Prisijungimo vardas turėtų būti sukurtas pagal [[doku>pagename|puslapio pavadinimo]] taisykles.
+
diff --git a/wiki/inc/lang/lt/resendpwd.txt b/wiki/inc/lang/lt/resendpwd.txt
new file mode 100644
index 0000000..7538271
--- /dev/null
+++ b/wiki/inc/lang/lt/resendpwd.txt
@@ -0,0 +1,3 @@
+====== Siųsti naują slaptažodį ======
+
+Naujo slaptažodžio gavimui, užpildykite visus žemiau esančius laukus. Naujas slaptažodis bus atsiųstas į jūsų užregistruotą el. pašto adresą. Vartotojo vardas turi būti toks pat kaip ir wiki sistemoje.
diff --git a/wiki/inc/lang/lt/revisions.txt b/wiki/inc/lang/lt/revisions.txt
new file mode 100644
index 0000000..9999767
--- /dev/null
+++ b/wiki/inc/lang/lt/revisions.txt
@@ -0,0 +1,4 @@
+====== Senos versijos ======
+
+Čia matote senas šio dokumento versijas. Jei norite atstatyti dokumentą į jo senesniąją versiją, paspauskite "Redaguoti šį puslapį" prie norimos versijos ir išsaugokite ją.
+
diff --git a/wiki/inc/lang/lt/searchpage.txt b/wiki/inc/lang/lt/searchpage.txt
new file mode 100644
index 0000000..111029d
--- /dev/null
+++ b/wiki/inc/lang/lt/searchpage.txt
@@ -0,0 +1,4 @@
+====== Paieška ======
+
+Žemiau matote Jūsų atliktos paieškos rezultatus. @CREATEPAGEINFO@
+
diff --git a/wiki/inc/lang/lt/showrev.txt b/wiki/inc/lang/lt/showrev.txt
new file mode 100644
index 0000000..ed77424
--- /dev/null
+++ b/wiki/inc/lang/lt/showrev.txt
@@ -0,0 +1,2 @@
+**Čia yra sena dokumento versija!**
+----
diff --git a/wiki/inc/lang/lt/updateprofile.txt b/wiki/inc/lang/lt/updateprofile.txt
new file mode 100644
index 0000000..7ede1a0
--- /dev/null
+++ b/wiki/inc/lang/lt/updateprofile.txt
@@ -0,0 +1,4 @@
+====== Redaguoti savo profilį ======
+
+Užpildykite tik tuos laukus, kuriuos norite pakeisti. Vartotojo vardo keisti nebūtina.
+
diff --git a/wiki/inc/lang/lv/admin.txt b/wiki/inc/lang/lv/admin.txt
new file mode 100644
index 0000000..3b37fa3
--- /dev/null
+++ b/wiki/inc/lang/lv/admin.txt
@@ -0,0 +1,6 @@
+====== Administrēšana ======
+
+DokuWiki pieejamas šādas administrēšanas iespējas:
+
+
+
diff --git a/wiki/inc/lang/lv/adminplugins.txt b/wiki/inc/lang/lv/adminplugins.txt
new file mode 100644
index 0000000..e8d208d
--- /dev/null
+++ b/wiki/inc/lang/lv/adminplugins.txt
@@ -0,0 +1 @@
+===== Papildu moduļi =====
\ No newline at end of file
diff --git a/wiki/inc/lang/lv/backlinks.txt b/wiki/inc/lang/lv/backlinks.txt
new file mode 100644
index 0000000..19bebf7
--- /dev/null
+++ b/wiki/inc/lang/lv/backlinks.txt
@@ -0,0 +1,5 @@
+====== Saistītās lapas ======
+
+Norāde uz šo lapu ir atrodama dokumentos:
+
+
diff --git a/wiki/inc/lang/lv/conflict.txt b/wiki/inc/lang/lv/conflict.txt
new file mode 100644
index 0000000..5aa6442
--- /dev/null
+++ b/wiki/inc/lang/lv/conflict.txt
@@ -0,0 +1,8 @@
+====== Ir jaunāka versija ======
+
+Tevis labotajam dokumentam jau ir jaunāka versija. Tā gadās, ja cits lietotājs tavas labošanas laikā ir paguvis veikt savus labojumus.
+
+Rūpīgi pārlūko šeit parādītās atšķirības un tad izlem, kuru variantu paturēt. Ja nospiedīsi  ''Saglabāt'', saglabāsies tavs teksts. Ja nospiedīsi ''Atlikt'' paliks pašreizējais variants.
+
+
+
diff --git a/wiki/inc/lang/lv/denied.txt b/wiki/inc/lang/lv/denied.txt
new file mode 100644
index 0000000..6733fb2
--- /dev/null
+++ b/wiki/inc/lang/lv/denied.txt
@@ -0,0 +1,4 @@
+====== Piekļuve aizliegta ======
+
+Atvaino, tev nav tiesību turpināt.
+
diff --git a/wiki/inc/lang/lv/diff.txt b/wiki/inc/lang/lv/diff.txt
new file mode 100644
index 0000000..40e1b54
--- /dev/null
+++ b/wiki/inc/lang/lv/diff.txt
@@ -0,0 +1,7 @@
+====== Atšķirības ======
+
+Norādītais vecais variants no patreizējās lapas atšķiras ar:
+
+
+
+
diff --git a/wiki/inc/lang/lv/draft.txt b/wiki/inc/lang/lv/draft.txt
new file mode 100644
index 0000000..525f7cb
--- /dev/null
+++ b/wiki/inc/lang/lv/draft.txt
@@ -0,0 +1,5 @@
+====== Atrasts melnraksta fails ======
+
+Iepriekšējā šīs lapas labošana nav pabeigta. DokuWiki darba laikā automātiski saglabāja melnrakstu, kuru tagad var labot tālāk. Zemāk redzami iepriekšējās labošanas dati.
+
+Nolem, vai vajag //atjaunot// zudušos labojumus, //dzēst// saglabāto melnrakstu vai //atlikt// labošanu.
diff --git a/wiki/inc/lang/lv/edit.txt b/wiki/inc/lang/lv/edit.txt
new file mode 100644
index 0000000..9da6f2d
--- /dev/null
+++ b/wiki/inc/lang/lv/edit.txt
@@ -0,0 +1,2 @@
+Labo lapu un uzklikšķini uz ''Saglabāt''. Par lietojamo sintaksi skaties rakstu  [[wiki:syntax]]. Lūdzu labo tika tad, ja vari lapu **uzlabot**. Ja gribi tikai kaut ko izmēģināt, izmanto [[wiki:playground|smilšukasti]].
+
diff --git a/wiki/inc/lang/lv/editrev.txt b/wiki/inc/lang/lv/editrev.txt
new file mode 100644
index 0000000..6fa7a4c
--- /dev/null
+++ b/wiki/inc/lang/lv/editrev.txt
@@ -0,0 +1 @@
+---- **Tu skaties vecu dokumenta versiju!** Ja to saglabāsi, tad izveidosies jauns dokuments ar šo veco saturu. ----
diff --git a/wiki/inc/lang/lv/index.txt b/wiki/inc/lang/lv/index.txt
new file mode 100644
index 0000000..6baa2a3
--- /dev/null
+++ b/wiki/inc/lang/lv/index.txt
@@ -0,0 +1,4 @@
+====== Rādītājs ======
+
+Visu pieejamo lapu rādītājs. Sakārtots pēc [[doku>namespaces|sadaļām]].
+
diff --git a/wiki/inc/lang/lv/install.html b/wiki/inc/lang/lv/install.html
new file mode 100644
index 0000000..26dd8d7
--- /dev/null
+++ b/wiki/inc/lang/lv/install.html
@@ -0,0 +1,12 @@
+<p>Šī lapa palīdz <a href="http://dokuwiki.org">Dokuwiki</a>pirmajā instalācijā un konfigurēšanā.
+Vairāk par instalatoru var lasīt tā
+<a href="http://dokuwiki.org/installer">documentācijas lapā</a>.</p>
+
+<p>DokuWiki lapu un ar to saistīto datu (piem.: attēlu, meklēšanas indeksu, veco versiju utt.) glabāšanai lieto parastus failus.  Lai Dokuwiki veiksmīgi darbotos <strong>vajag</strong> rakstīšanas tiesības direktorijās, kur šie faili glabājas. Instalators tiesības nomainīt nespēj. Tas parasti jums jāizdara komandrindā vai ar FTP vadības paneli (piem. cPanel).</p>
+
+<p>Instalators konfigurēs DokuWiki <abbr title="access control list">ACL</abbr> lietošanai, kas ļauj administratoram ielogoties un piekļūt DokuWiki administrēšanas izvēlnei, lai instalētu moduļus, pārvaldītu lietotājus, notiektu piekļuves tiesības Wiki lapām un mainītu DokuWiki konfigurāciju.
+Tas nav vajadzīgs, lai DokuWiki darbotos, bet ar to var vieglāk administrēt.</p>
+
+<p>Pieredzējušiem lietotājiem ar īpašām prasībām  jāmeklē sīkākas ziņas
+<a href="http://dokuwiki.org/install">uzstādīšanas instrukcijā</a>
+un <a href="http://dokuwiki.org/config">konfigurēšanas padomos</a>.</p>
\ No newline at end of file
diff --git a/wiki/inc/lang/lv/jquery.ui.datepicker.js b/wiki/inc/lang/lv/jquery.ui.datepicker.js
new file mode 100644
index 0000000..04556fb
--- /dev/null
+++ b/wiki/inc/lang/lv/jquery.ui.datepicker.js
@@ -0,0 +1,45 @@
+/* Latvian (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* @author Arturas Paleicikas <arturas.paleicikas@metasite.net> */
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "../widgets/datepicker" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery.datepicker );
+	}
+}( function( datepicker ) {
+
+datepicker.regional.lv = {
+	closeText: "Aizvērt",
+	prevText: "Iepr.",
+	nextText: "Nāk.",
+	currentText: "Šodien",
+	monthNames: [ "Janvāris","Februāris","Marts","Aprīlis","Maijs","Jūnijs",
+	"Jūlijs","Augusts","Septembris","Oktobris","Novembris","Decembris" ],
+	monthNamesShort: [ "Jan","Feb","Mar","Apr","Mai","Jūn",
+	"Jūl","Aug","Sep","Okt","Nov","Dec" ],
+	dayNames: [
+		"svētdiena",
+		"pirmdiena",
+		"otrdiena",
+		"trešdiena",
+		"ceturtdiena",
+		"piektdiena",
+		"sestdiena"
+	],
+	dayNamesShort: [ "svt","prm","otr","tre","ctr","pkt","sst" ],
+	dayNamesMin: [ "Sv","Pr","Ot","Tr","Ct","Pk","Ss" ],
+	weekHeader: "Ned.",
+	dateFormat: "dd.mm.yy",
+	firstDay: 1,
+	isRTL: false,
+	showMonthAfterYear: false,
+	yearSuffix: "" };
+datepicker.setDefaults( datepicker.regional.lv );
+
+return datepicker.regional.lv;
+
+} ) );
diff --git a/wiki/inc/lang/lv/lang.php b/wiki/inc/lang/lv/lang.php
new file mode 100644
index 0000000..1a101ad
--- /dev/null
+++ b/wiki/inc/lang/lv/lang.php
@@ -0,0 +1,339 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Oskars Pakers <oskars.pakers@gmail.com>
+ * @author Aivars Miška <allefm@gmail.com>
+ */
+$lang['encoding']              = 'utf-8';
+$lang['direction']             = 'ltr';
+$lang['doublequoteopening']    = '„';
+$lang['doublequoteclosing']    = '“';
+$lang['singlequoteopening']    = '‚';
+$lang['singlequoteclosing']    = '‘';
+$lang['apostrophe']            = '’';
+$lang['btn_edit']              = 'Labot lapu';
+$lang['btn_source']            = 'Parādīt lapas kodu';
+$lang['btn_show']              = 'Parādīt lapu';
+$lang['btn_create']            = 'Izveidot lapu';
+$lang['btn_search']            = 'Meklēt';
+$lang['btn_save']              = 'Saglabāt';
+$lang['btn_preview']           = 'Priekšskats';
+$lang['btn_top']               = 'Atpakaļ uz sākumu';
+$lang['btn_newer']             = '<< jaunāki';
+$lang['btn_older']             = 'vecāki >>';
+$lang['btn_revs']              = 'Vecās versijas';
+$lang['btn_recent']            = 'Jaunākie grozījumi';
+$lang['btn_upload']            = 'Augšupielādēt';
+$lang['btn_cancel']            = 'Atlikt';
+$lang['btn_index']             = 'Rādītājs';
+$lang['btn_secedit']           = 'Labot';
+$lang['btn_login']             = 'Ieiet';
+$lang['btn_logout']            = 'Iziet';
+$lang['btn_admin']             = 'Administrēt';
+$lang['btn_update']            = 'Atjaunot';
+$lang['btn_delete']            = 'Dzēst';
+$lang['btn_back']              = 'Atpakaļ';
+$lang['btn_backlink']          = 'Norādes uz lapu';
+$lang['btn_subscribe']         = 'Abonēt izmaiņu paziņojumus';
+$lang['btn_profile']           = 'Labot savu profilu';
+$lang['btn_reset']             = 'Atsaukt izmaiņas';
+$lang['btn_resendpwd']         = 'Uzstādīt jaunu paroli';
+$lang['btn_draft']             = 'Labot melnrakstu';
+$lang['btn_recover']           = 'Atjaunot melnrakstu';
+$lang['btn_draftdel']          = 'Dzēst melnrakstu';
+$lang['btn_revert']            = 'Atjaunot';
+$lang['btn_register']          = 'Reģistrēties';
+$lang['btn_apply']             = 'Labi';
+$lang['btn_media']             = 'Mēdiju pārvaldnieks';
+$lang['btn_deleteuser']        = 'Dzēst manu kontu';
+$lang['btn_img_backto']        = 'Atpakaļ uz %s';
+$lang['btn_mediaManager']      = 'Skatīt mēdiju pārvaldniekā';
+$lang['loggedinas']            = 'Pieteicies kā:';
+$lang['user']                  = 'Lietotājvārds';
+$lang['pass']                  = 'Parole';
+$lang['newpass']               = 'Jaunā parole';
+$lang['oldpass']               = 'Atkārto patreizējo paroli';
+$lang['passchk']               = 'vēlreiz';
+$lang['remember']              = 'Atceries mani';
+$lang['fullname']              = 'Pilns vārds';
+$lang['email']                 = 'E-pasts';
+$lang['profile']               = 'Lietotāja vārds';
+$lang['badlogin']              = 'Atvaino, lietotājvārds vai parole aplama.';
+$lang['badpassconfirm']        = 'Atvaino, aplama parole';
+$lang['minoredit']             = 'Sīki labojumi';
+$lang['draftdate']             = 'Melnraksts automātiski saglabāts';
+$lang['nosecedit']             = 'Lapa pa šo laiku ir mainījusies, sekcijas informācija novecojusi. Ielādēta lapas  pilnās versija.';
+$lang['regmissing']            = 'Atvaino, jāaizpilda visas ailes.';
+$lang['reguexists']            = 'Atvaino, tāds lietotājs jau ir.';
+$lang['regsuccess']            = 'Lietotājs izveidots. Parole nosūtīta pa pastu.';
+$lang['regsuccess2']           = 'Lietotājs izveidots.';
+$lang['regfail']               = 'Neizdevās izveidot lietotāju.';
+$lang['regmailfail']           = 'Šķiet, ka ir problēmas nosūtīt pastu. Lūdzu sazinies ar administratoru!';
+$lang['regbadmail']            = 'Uzdotā epasta adrese izskatās aplama. Ja tas nav tiesa, sazinies ar administratoru.';
+$lang['regbadpass']            = 'Abas ierakstītās paroles nav vienādas, lūdzu atkārto.';
+$lang['regpwmail']             = 'Tava DokuWiki parole';
+$lang['reghere']               = 'Tev vēl nav sava konta? Izveido!';
+$lang['profna']                = 'Labot profilu nav iespējams';
+$lang['profnochange']          = 'Izmaiņu nav. Nav, ko darīt.';
+$lang['profnoempty']           = 'Bez vārda vai e-pasta adreses nevar.';
+$lang['profchanged']           = 'Profils veiksmīgi izlabots.';
+$lang['profnodelete']          = 'Šajā viki lietotājus izdzēst nevar';
+$lang['profdeleteuser']        = 'Dzēst kontu';
+$lang['profdeleted']           = 'Jūsu lietotāja konts ir izdzēsts';
+$lang['profconfdelete']        = 'Es vēlos dzēst savu kontu no viki. <br/> Šo darbību vairs nevarēs atsaukt.';
+$lang['profconfdeletemissing'] = 'Nav atzīmēta apstiprinājuma rūtiņa.';
+$lang['proffail']              = 'Neizdevās atjaunot profilu.';
+$lang['pwdforget']             = 'Aizmirsi paroli? Saņem jaunu';
+$lang['resendna']              = 'Paroļu izsūtīšanu nepiedāvāju.';
+$lang['resendpwd']             = 'Uzstādīt jaunu paroli lietotājam';
+$lang['resendpwdmissing']      = 'Atvaino, jāizpilda visas ailes.';
+$lang['resendpwdnouser']       = 'Atvaino, tāda lietotāja nav.';
+$lang['resendpwdbadauth']      = 'Atvaino, šis autorizācijas kods nav derīgs. Pārliecinies, ka lietoji pilnu apstiprināšanas adresi.';
+$lang['resendpwdconfirm']      = 'Apstiprināšanas adrese nosūtīta pa epastu.';
+$lang['resendpwdsuccess']      = 'Jaunā parole nosūtīta pa e-pastu.';
+$lang['license']               = 'Ja nav norādīts citādi, viki saturs pieejams ar šādas licenzes  noteikumiem:';
+$lang['licenseok']             = 'Ievēro: Labojot lapu, tu piekrīti šādiem licenzes noteikumiem.';
+$lang['searchmedia']           = 'Meklētais faila vārds: ';
+$lang['searchmedia_in']        = 'Meklēt iekš %s';
+$lang['txt_upload']            = 'Norādi augšupielādējamo failu:';
+$lang['txt_filename']          = 'Ievadi vikivārdu (nav obligāts):';
+$lang['txt_overwrt']           = 'Aizstāt esošo failu';
+$lang['maxuploadsize']         = 'Augšuplādējamā faila ierobežojums: %s.';
+$lang['lockedby']              = 'Patlaban bloķējis :';
+$lang['lockexpire']            = 'Bloķējums beigsies :';
+$lang['js']['willexpire']      = 'Tavs bloķējums uz šo lapu pēc minūtes beigsies.\nLai izvairītos no konflikta, nospied Iepriekšapskata pogu\n un bloķējuma laiku sāks skaitīt no jauna.';
+$lang['js']['notsavedyet']     = 'Veiktas bet nav saglabātas izmaiņas.
+Vai tiešām tās nevajag?';
+$lang['js']['searchmedia']     = 'Meklēt failus';
+$lang['js']['keepopen']        = 'Pēc faila izvēles logu paturēt atvērtu';
+$lang['js']['hidedetails']     = 'Slēpt detaļas';
+$lang['js']['mediatitle']      = 'Saites īpašības';
+$lang['js']['mediadisplay']    = 'Saites tips';
+$lang['js']['mediaalign']      = 'Slēgums';
+$lang['js']['mediasize']       = 'Attēla izmērs';
+$lang['js']['mediatarget']     = 'Saite ved uz ';
+$lang['js']['mediaclose']      = 'Aizvērt';
+$lang['js']['mediainsert']     = 'Ievietot';
+$lang['js']['mediadisplayimg'] = 'Rādīt attēlu';
+$lang['js']['mediadisplaylnk'] = 'Rādīt tikai saiti';
+$lang['js']['mediasmall']      = 'Mazs';
+$lang['js']['mediamedium']     = 'Vidējs';
+$lang['js']['medialarge']      = 'Liels';
+$lang['js']['mediaoriginal']   = 'Oriģināls';
+$lang['js']['medialnk']        = 'Saite uz detaļām';
+$lang['js']['mediadirect']     = 'Tieša saite uz oriģinālu';
+$lang['js']['medianolnk']      = 'Bez saites';
+$lang['js']['medianolink']     = 'Bez saites uz attēlu';
+$lang['js']['medialeft']       = 'kreisais';
+$lang['js']['mediaright']      = 'labais';
+$lang['js']['mediacenter']     = 'centra';
+$lang['js']['medianoalign']    = 'neizlīdzināt';
+$lang['js']['nosmblinks']      = 'Saites uz Windows resursiem darbojas tikai Microsoft Internet Explorer.
+Protams, ka vari saiti kopēt un iespraust citā programmā.';
+$lang['js']['linkwiz']         = 'Saišu vednis';
+$lang['js']['linkto']          = 'Saite uz: ';
+$lang['js']['del_confirm']     = 'Dzēst šo šķirkli?';
+$lang['js']['restore_confirm'] = 'Tiešām atjaunot šo versiju';
+$lang['js']['media_diff']      = 'Skatīt atšķirību';
+$lang['js']['media_diff_both'] = 'Blakus';
+$lang['js']['media_diff_opacity'] = 'Pārklāti';
+$lang['js']['media_diff_portions'] = 'Pa daļām';
+$lang['js']['media_select']    = 'Norādīt failus...';
+$lang['js']['media_upload_btn'] = 'Augšuplādēt';
+$lang['js']['media_done_btn']  = 'Gatavs';
+$lang['js']['media_drop']      = 'Nomet te augšuplādējamos failus';
+$lang['js']['media_cancel']    = 'atlikt';
+$lang['js']['media_overwrt']   = 'Rakstīt pāri esošajiem failiem';
+$lang['rssfailed']             = 'Kļūda saņemot saturu no ';
+$lang['nothingfound']          = 'Nekas nav atrasts.';
+$lang['mediaselect']           = 'Mēdiju faila izvēle';
+$lang['uploadsucc']            = 'Veiksmīgi ielādēts';
+$lang['uploadfail']            = 'Ielādes kļūme. Varbūt aplamas tiesības?';
+$lang['uploadwrong']           = 'Ielāde aizliegta. Neatļauts faila paplašinājums';
+$lang['uploadexist']           = 'Neko nedarīju, jo fails jau ir.';
+$lang['uploadbadcontent']      = 'Augšupielādētā saturs neatbilst faila paplašinājumam %s.';
+$lang['uploadspam']            = 'Augšupielāde bloķēta ar melno sarakstu.';
+$lang['uploadxss']             = 'Augšupielāde bloķēta iespējama slikta satura dēļ.';
+$lang['uploadsize']            = 'Augšup lādētais fails pārāk liels. Maksimums ir  %s.';
+$lang['deletesucc']            = 'Fails "%s" dzēsts.';
+$lang['deletefail']            = 'Nevar dzēst "%s". Pārbaudi tiesības.';
+$lang['mediainuse']            = 'Fails "%s" nav izdzēsts, to lieto.';
+$lang['namespaces']            = 'Nodaļas';
+$lang['mediafiles']            = 'Pieejamie faili';
+$lang['accessdenied']          = 'Šo lapu nav atļauts skatīt.';
+$lang['mediausage']            = 'Atsaucei uz failu lietot šādu sintaksi:';
+$lang['mediaview']             = 'Skatīt oriģinālo failu';
+$lang['mediaroot']             = 'sakne';
+$lang['mediaupload']           = 'Augšupielādēt failu patreizējā nodaļā. Lai izveidotu apakšnodaļu, pieraksti to, atdalot ar kolu, pirms augšupielādējamā faila vārda.';
+$lang['mediaextchange']        = 'Faila paplašinājums mainīts no .%s uz .%s!';
+$lang['reference']             = 'Norādes uz failu';
+$lang['ref_inuse']             = 'Failu nevar dzēst, jo izmanto šādas lapas:';
+$lang['ref_hidden']            = 'Dažas norādes ir lapās, ko nav tiesību skatīt';
+$lang['hits']                  = 'Apmeklējumi';
+$lang['quickhits']             = 'Atbilstošās lapas';
+$lang['toc']                   = 'Satura rādītājs';
+$lang['current']               = 'patlaban';
+$lang['yours']                 = 'Tava versija';
+$lang['diff']                  = 'atšķirības no patreizējas versijas';
+$lang['diff2']                 = 'norādīto versiju atšķirības';
+$lang['difflink']              = 'Saite uz salīdzināšanas skatu.';
+$lang['diff_type']             = 'Skatīt atšķirības:';
+$lang['diff_inline']           = 'Iekļauti';
+$lang['diff_side']             = 'Blakus';
+$lang['diffprevrev']           = 'Iepriekšējā versija';
+$lang['diffnextrev']           = 'Nākamā versija';
+$lang['difflastrev']           = 'Jaunākā versija';
+$lang['diffbothprevrev']       = 'Abās pusēs iepriekšējo versiju';
+$lang['diffbothnextrev']       = 'Abās pusēs nākamo versiju';
+$lang['line']                  = 'Rinda';
+$lang['breadcrumb']            = 'Apmeklēts:';
+$lang['youarehere']            = 'Tu atrodies šeit:';
+$lang['lastmod']               = 'Labota:';
+$lang['by']                    = ', labojis';
+$lang['deleted']               = 'dzēsts';
+$lang['created']               = 'izveidots';
+$lang['restored']              = 'vecā versija atjaunota (%s)';
+$lang['external_edit']         = 'ārpussistēmas labojums';
+$lang['summary']               = 'Anotācija';
+$lang['noflash']               = 'Lai attēlotu lapas saturu, vajag <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a>.';
+$lang['download']              = 'Lejuplādēt «kodiņu»((snippet))';
+$lang['tools']                 = 'Rīki';
+$lang['user_tools']            = 'Lietotāja rīki';
+$lang['site_tools']            = 'Vietnes rīki';
+$lang['page_tools']            = 'Lapas rīki';
+$lang['skip_to_content']       = 'uz rakstu';
+$lang['sidebar']               = 'Izvēlne';
+$lang['mail_newpage']          = 'lapa pievienota:';
+$lang['mail_changed']          = 'lapa mainīta:';
+$lang['mail_subscribe_list']   = 'Nodaļā mainītās lapas:';
+$lang['mail_new_user']         = 'Jauns lietotājs:';
+$lang['mail_upload']           = 'augšupielādētais fails:';
+$lang['changes_type']          = 'Skatīt izmaiņas';
+$lang['pages_changes']         = 'Lapās';
+$lang['media_changes']         = 'Mēdiju failos';
+$lang['both_changes']          = 'Gan lapās, gan mēdiju failos';
+$lang['qb_bold']               = 'Trekninājums';
+$lang['qb_italic']             = 'Kursīvs';
+$lang['qb_underl']             = 'Pasvītrojums';
+$lang['qb_code']               = 'Vienplatuma burti';
+$lang['qb_strike']             = 'Pārsvītrots teksts';
+$lang['qb_h1']                 = '1. līmeņa virsraksts';
+$lang['qb_h2']                 = '2. līmeņa virsraksts';
+$lang['qb_h3']                 = '3. līmeņa virsraksts';
+$lang['qb_h4']                 = '4. līmeņa virsraksts';
+$lang['qb_h5']                 = '5. līmeņa virsraksts';
+$lang['qb_h']                  = 'Virsraksts';
+$lang['qb_hs']                 = 'Izraudzīties virsrakstu';
+$lang['qb_hplus']              = 'Lielāks virsraksts';
+$lang['qb_hminus']             = 'Mazāks virsraksts';
+$lang['qb_hequal']             = 'Tāds pats virsraksts';
+$lang['qb_link']               = 'Iekšēja saite';
+$lang['qb_extlink']            = 'Ārēja saite';
+$lang['qb_hr']                 = 'Horizontāla līnija';
+$lang['qb_ol']                 = 'Numurēts saraksts';
+$lang['qb_ul']                 = 'Nenumurēts saraksts';
+$lang['qb_media']              = 'Pielikt attēlus un citus failus.';
+$lang['qb_sig']                = 'Ievietot parakstu';
+$lang['qb_smileys']            = 'Emotikoni';
+$lang['qb_chars']              = 'Īpašās zīmes';
+$lang['upperns']               = 'vienu nodaļu līmeni augstāk';
+$lang['metaedit']              = 'Labot metadatus';
+$lang['metasaveerr']           = 'Metadati nav saglabāti';
+$lang['metasaveok']            = 'Metadati saglabāti';
+$lang['img_title']             = 'Virsraksts:';
+$lang['img_caption']           = 'Apraksts:';
+$lang['img_date']              = 'Datums:';
+$lang['img_fname']             = 'Faila vārds:';
+$lang['img_fsize']             = 'Izmērs:';
+$lang['img_artist']            = 'Fotogrāfs:';
+$lang['img_copyr']             = 'Autortiesības:';
+$lang['img_format']            = 'Formāts:';
+$lang['img_camera']            = 'Fotoaparāts:';
+$lang['img_keywords']          = 'Atslēgvārdi:';
+$lang['img_width']             = 'Platums:';
+$lang['img_height']            = 'Augstums:';
+$lang['subscr_subscribe_success'] = '%s pievienots %s abonēšanas sarakstam';
+$lang['subscr_subscribe_error'] = 'Kļūme pievienojot %s %s abonēšanas sarakstam.';
+$lang['subscr_subscribe_noaddress'] = 'Nav zināma jūsu e-pasta adrese, tāpēc nevarat abonēt.';
+$lang['subscr_unsubscribe_success'] = '%s abonements uz %s atsaukts';
+$lang['subscr_unsubscribe_error'] = 'Kļūme svītrojot %s no %s abonēšanas saraksta';
+$lang['subscr_already_subscribed'] = '%s jau abonē %s';
+$lang['subscr_not_subscribed'] = '%s neabonē %s';
+$lang['subscr_m_not_subscribed'] = 'Šī lapa vai nodaļa nav abonēta';
+$lang['subscr_m_new_header']   = 'Pievienot abonementu';
+$lang['subscr_m_current_header'] = 'Patlaban ir abonēts';
+$lang['subscr_m_unsubscribe']  = 'Atteikties no abonēšanas';
+$lang['subscr_m_subscribe']    = 'Abonēt';
+$lang['subscr_m_receive']      = 'Saņemt';
+$lang['subscr_style_every']    = 'vēstuli par katru izmaiņu';
+$lang['subscr_style_digest']   = 'kopsavilkumu par katru lapu (reizi %.2f dienās)';
+$lang['subscr_style_list']     = 'kopš pēdējās vēstules notikušo labojumu sarakstu (reizi %.2f dienās)';
+$lang['authtempfail']          = 'Lietotāju autentifikācija pašlaik nedarbojas. Ja tas turpinās ilgstoši, lūduz ziņo Wiki administratoram.';
+$lang['i_chooselang']          = 'Izvēlies valodu';
+$lang['i_installer']           = 'DokuWiki instalētājs';
+$lang['i_wikiname']            = 'Wiki vārds';
+$lang['i_enableacl']           = 'Lietot ACL (ieteikts)';
+$lang['i_superuser']           = 'Superuser';
+$lang['i_problems']            = 'Instalētājs atrada zemāk minētās problēmas. Kamēr tās nenovērš, nav iespējam turpināt.';
+$lang['i_modified']            = 'Drošības nolūkos šis skripts darbosies tika ar jaunu nemodificētu Dokuwiki instalāciju.
+Vai nu no jauna jāatarhivē faili no lejupielādētās pakas vai jāraugās pēc padoma pilnā Dokuwiki instalācijas instrukcijā <a href="http://dokuwiki.org/install"></a>';
+$lang['i_funcna']              = 'PHP funkcija <code>%s</code> nav pieejama. Varbūt jūsu servera īpašnieks to kāda iemesla dēļ atslēdzis?';
+$lang['i_phpver']              = 'Jūsu PHP versija <code>%s</code> ir par vecu. Vajag versiju <code>%s</code>. Atjaunojiet savu PHP instalāciju.';
+$lang['i_mbfuncoverload']      = 'Lai darbinātu  DokuWiki,  php.ini failā ir jāatspējo mbstring.func_overload.';
+$lang['i_permfail']            = 'Dokuwiki nevar ierakstīt <code>%s</code>. Jālabo direktorijas tiesības!';
+$lang['i_confexists']          = '<code>%s</code> jau ir';
+$lang['i_writeerr']            = 'Nevar izveidot <code>%s</code>. Jāpārbauda direktorijas/faila tiesības un fails jāizveido pašam.';
+$lang['i_badhash']             = 'nepazīstams vai izmainīts dokuwiki.php fails (hash=<code>%s</code>)';
+$lang['i_badval']              = '<code>%s</code> - neatļauta vai tukša vērtība';
+$lang['i_success']             = 'Konfigurēšana veiksmīgi pabeigta. Tagad vari nodzēst failu install.php. Tālāk turpini <a href="doku.php?id=wiki:welcome">savā jaunajā DokuWiki</a>.';
+$lang['i_failure']             = 'Rakstot konfigurācijas failu, gadījās dažas kļūmes. Pirms lieto <a href="doku.php?id=wiki:welcome">savu jauno DokuWiki</a>, tās varbūt jāizlabo.';
+$lang['i_policy']              = 'Sākotnējā ACL politika';
+$lang['i_pol0']                = 'Atvērts Wiki (raksta, lasa un augšupielādē ikviens)';
+$lang['i_pol1']                = 'Publisks Wiki (lasa ikviens, raksta un augšupielādē reģistrēti lietotāji)';
+$lang['i_pol2']                = 'Slēgts Wiki (raksta, lasa un augšupielādē tikai reģistrēti lietotāji)';
+$lang['i_allowreg']            = 'Atļaut lietotājiem reģistrēties.';
+$lang['i_retry']               = 'Atkārtot';
+$lang['i_license']             = 'Ar kādu licenci saturs tiks publicēts:';
+$lang['i_license_none']        = 'Nerādīt nekādu licences informāciju';
+$lang['i_pop_field']           = 'Lūdzu palīdziet uzlabot DokuWiki';
+$lang['i_pop_label']           = 'Rezi mēnesī nosūtīt DokuWiki izstrādātājiem anonīmus lietošanas datus.';
+$lang['recent_global']         = 'Tu skati izmaiņas nodaļā <b>%s</b>. Ir iespējams <a href="%s">skatīt jaunākos grozījums visā viki</a>. ';
+$lang['years']                 = 'pirms %d gadiem';
+$lang['months']                = 'pirms %d mēnešiem';
+$lang['weeks']                 = 'pirms %d nedēļām';
+$lang['days']                  = 'pirms %d  dienām';
+$lang['hours']                 = 'pirms %d stundām';
+$lang['minutes']               = 'pirms %d minūtēm';
+$lang['seconds']               = 'pirms %d sekundēm';
+$lang['wordblock']             = 'Grozījumus nevarēju saglabāt, jo tie satur aizliegto vārdu (spamu).';
+$lang['media_uploadtab']       = 'Augšuplādēt';
+$lang['media_searchtab']       = 'Meklēt';
+$lang['media_file']            = 'Fails';
+$lang['media_viewtab']         = 'Skatīt';
+$lang['media_edittab']         = 'Labot';
+$lang['media_historytab']      = 'Vēsture';
+$lang['media_list_thumbs']     = 'Sīktēli';
+$lang['media_list_rows']       = 'Rindas';
+$lang['media_sort_name']       = 'Nosaukums';
+$lang['media_sort_date']       = 'Datums';
+$lang['media_namespaces']      = 'Norādīt nodaļu';
+$lang['media_files']           = 'Faili nodaļā %s';
+$lang['media_upload']          = 'Augšuplādēt nodaļā %s';
+$lang['media_search']          = 'Meklēt nodaļā %s';
+$lang['media_view']            = '%s';
+$lang['media_viewold']         = '%s nodaļā %s';
+$lang['media_edit']            = 'Labot %s';
+$lang['media_history']         = '%s vēsture';
+$lang['media_meta_edited']     = 'metadati laboti';
+$lang['media_perm_read']       = 'Atvainojiet, jums nav tiesību skatīt failus. ';
+$lang['media_perm_upload']     = 'Atvainojiet, jums nav tiesību augšupielādēt. ';
+$lang['media_update']          = 'Augšupielādēt jaunu versiju';
+$lang['media_restore']         = 'Atjaunot šo versiju';
+$lang['currentns']             = 'Pašreizējā sadaļa';
+$lang['searchresult']          = 'Meklēšanas rezultāti';
+$lang['plainhtml']             = 'Tīrs HTML';
+$lang['wikimarkup']            = 'Viki iezīmēšana valoda';
+$lang['email_signature_text']  = 'Vēstuli nosūtījusi DokuWiki programma no
+@DOKUWIKIURL@';
diff --git a/wiki/inc/lang/lv/locked.txt b/wiki/inc/lang/lv/locked.txt
new file mode 100644
index 0000000..7d57ce9
--- /dev/null
+++ b/wiki/inc/lang/lv/locked.txt
@@ -0,0 +1,5 @@
+====== Lapa aizņemta ======
+
+Lapa aizņemta, to patlaban labo cits lietotājs. Tev ir jāgaida, kamēr to pabeigs labot vai arī iztecēs labotājam atvēlētais laiks.
+
+
diff --git a/wiki/inc/lang/lv/login.txt b/wiki/inc/lang/lv/login.txt
new file mode 100644
index 0000000..a98d21d
--- /dev/null
+++ b/wiki/inc/lang/lv/login.txt
@@ -0,0 +1,3 @@
+====== Login ======
+Tu neesi ielogojies! Ievadi savu lietotājvārdu un paroli. Pārlūkprogrammai jāpieņem //cookies//.
+
diff --git a/wiki/inc/lang/lv/mailtext.txt b/wiki/inc/lang/lv/mailtext.txt
new file mode 100644
index 0000000..8316003
--- /dev/null
+++ b/wiki/inc/lang/lv/mailtext.txt
@@ -0,0 +1,12 @@
+Tavā DokuWiki pievienota vai labota lapa. Šeit ir sīkākas ziņas:
+
+Datums       : @DATE@
+Pārlūks      : @BROWSER@
+IP adrese    : @IPADDRESS@
+Dators       : @HOSTNAME@
+Vecā versija : @OLDPAGE@
+Jaunā versija: @NEWPAGE@
+Anotācija    : @SUMMARY@
+Lietotājs    : @USER@
+
+@DIFF@
diff --git a/wiki/inc/lang/lv/mailwrap.html b/wiki/inc/lang/lv/mailwrap.html
new file mode 100644
index 0000000..d257190
--- /dev/null
+++ b/wiki/inc/lang/lv/mailwrap.html
@@ -0,0 +1,13 @@
+<html>
+<head>
+<title>@TITLE@</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+</head>
+<body>
+
+@HTMLBODY@
+
+<br /><hr />
+<small>@EMAILSIGNATURE@</small>
+</body>
+</html>
\ No newline at end of file
diff --git a/wiki/inc/lang/lv/newpage.txt b/wiki/inc/lang/lv/newpage.txt
new file mode 100644
index 0000000..a4a05fd
--- /dev/null
+++ b/wiki/inc/lang/lv/newpage.txt
@@ -0,0 +1,5 @@
+====== Šķirklis vēl nav izveidots ======
+
+Tu izvēlējies saiti uz vēl neizveidotu šķirkli. Ja tiesības ļauj, vari to izveidot, uzklikšķinot uz pogas ''Izveidot lapu''.
+
+
diff --git a/wiki/inc/lang/lv/norev.txt b/wiki/inc/lang/lv/norev.txt
new file mode 100644
index 0000000..b7c4624
--- /dev/null
+++ b/wiki/inc/lang/lv/norev.txt
@@ -0,0 +1,5 @@
+====== Nav šādas versijas ======
+
+Norādītās lapas versijas nav. Lieto pogu ''Vecās versijas'', lai redzētu dokumenta veco versiju sarakstu.
+
+
diff --git a/wiki/inc/lang/lv/password.txt b/wiki/inc/lang/lv/password.txt
new file mode 100644
index 0000000..7cd7d8b
--- /dev/null
+++ b/wiki/inc/lang/lv/password.txt
@@ -0,0 +1,6 @@
+Sveiki, @FULLNAME@!
+
+Tavi  dati @TITLE@ lapām uz servera @DOKUWIKIURL@ ir
+
+Lietotājvārds:  @LOGIN@
+Parole:  @PASSWORD@
diff --git a/wiki/inc/lang/lv/preview.txt b/wiki/inc/lang/lv/preview.txt
new file mode 100644
index 0000000..c3d618a
--- /dev/null
+++ b/wiki/inc/lang/lv/preview.txt
@@ -0,0 +1,5 @@
+====== Priekšskats ======
+
+Tavs teksts izskatīsies šādi. Ievēro, tas vēl **nav saglabāts** !
+
+
diff --git a/wiki/inc/lang/lv/pwconfirm.txt b/wiki/inc/lang/lv/pwconfirm.txt
new file mode 100644
index 0000000..62c8bed
--- /dev/null
+++ b/wiki/inc/lang/lv/pwconfirm.txt
@@ -0,0 +1,10 @@
+Sveiki, @FULLNAME@!
+
+Kāds pieprasījis jaunu paroli tavam @TITLE@ kontam
+@DOKUWIKIURL@ sistēmā.
+
+Ja paroli neesi prasījis, ignorē šo vēstuli.
+
+Lai apstiprinātu, ka esi paroli pieprasījis  lieto norādīto saiti.
+
+@CONFIRM@
diff --git a/wiki/inc/lang/lv/read.txt b/wiki/inc/lang/lv/read.txt
new file mode 100644
index 0000000..876e53c
--- /dev/null
+++ b/wiki/inc/lang/lv/read.txt
@@ -0,0 +1,4 @@
+Šī lapa ir tikai lasāma. Vari apskatīt izejas kodu, bet nevari to mainīt. Ja domā, ka tas nav pareizi, vaicā administratoram.
+
+
+
diff --git a/wiki/inc/lang/lv/recent.txt b/wiki/inc/lang/lv/recent.txt
new file mode 100644
index 0000000..70cf1aa
--- /dev/null
+++ b/wiki/inc/lang/lv/recent.txt
@@ -0,0 +1,8 @@
+====== Jaunākie grozījumi ======
+
+Jaunākie labojumi ir:
+
+
+
+
+
diff --git a/wiki/inc/lang/lv/register.txt b/wiki/inc/lang/lv/register.txt
new file mode 100644
index 0000000..5e6477d
--- /dev/null
+++ b/wiki/inc/lang/lv/register.txt
@@ -0,0 +1,4 @@
+====== Jauna lietotāja reģistrācija ======
+
+Lai izveidotu jaunu kontu, aizpildi visas prasītās ailes. Pārliecinies, ka uzdod **derīgu pasta adresi**, jo jauno paroli tev nosūtīs pa pastu. Lietotājvārdam jāatbilst [[doku>pagename|wiki vārdu nosacījumiem]].
+
diff --git a/wiki/inc/lang/lv/registermail.txt b/wiki/inc/lang/lv/registermail.txt
new file mode 100644
index 0000000..2a2084c
--- /dev/null
+++ b/wiki/inc/lang/lv/registermail.txt
@@ -0,0 +1,10 @@
+Reģistrēts jauns lietotājs. Tā dati:
+
+Lietotājvārds : @NEWUSER@
+Pilns vārds   : @NEWNAME@
+E-pasts       : @NEWEMAIL@
+
+Datums      : @DATE@
+Pārlūks     : @BROWSER@
+IP aderese  : @IPADDRESS@
+Datora vārds: @HOSTNAME@
diff --git a/wiki/inc/lang/lv/resendpwd.txt b/wiki/inc/lang/lv/resendpwd.txt
new file mode 100644
index 0000000..3f4597a
--- /dev/null
+++ b/wiki/inc/lang/lv/resendpwd.txt
@@ -0,0 +1,3 @@
+====== Nosūtīt jaunu paroli ======
+
+Azipildi zemāk prasīto, lai saņemtu savam kontam jaunu paroli. Jauno paroli nosūtīs uz reģistrēto e-pasta adresi. Lietotāja vārdam jābūt tavam //wiki sistēmas// lietotājavārdam.
diff --git a/wiki/inc/lang/lv/resetpwd.txt b/wiki/inc/lang/lv/resetpwd.txt
new file mode 100644
index 0000000..757f34c
--- /dev/null
+++ b/wiki/inc/lang/lv/resetpwd.txt
@@ -0,0 +1,3 @@
+====== Uzstādīt jaunu paroli ======
+
+Lūdzu izvēlies savam kontam jaunu paroli.
\ No newline at end of file
diff --git a/wiki/inc/lang/lv/revisions.txt b/wiki/inc/lang/lv/revisions.txt
new file mode 100644
index 0000000..51ad849
--- /dev/null
+++ b/wiki/inc/lang/lv/revisions.txt
@@ -0,0 +1,5 @@
+====== Vecās versijas ======
+
+Dokumentam ir šādas vecās versijas. Lai atgrieztos pie vecā varianta, izvēlies to no saraksta,  uzklikšķini uz "Labot šo lapu" un saglabā to.
+
+
diff --git a/wiki/inc/lang/lv/searchpage.txt b/wiki/inc/lang/lv/searchpage.txt
new file mode 100644
index 0000000..a4b5aae
--- /dev/null
+++ b/wiki/inc/lang/lv/searchpage.txt
@@ -0,0 +1,4 @@
+====== Meklēšana ======
+
+Te vari redzēt meklēšanas rezultātus. @CREATEPAGEINFO@
+
diff --git a/wiki/inc/lang/lv/showrev.txt b/wiki/inc/lang/lv/showrev.txt
new file mode 100644
index 0000000..7d5c0fa
--- /dev/null
+++ b/wiki/inc/lang/lv/showrev.txt
@@ -0,0 +1,2 @@
+**Šī ir veca dokumenta versija!**
+----
diff --git a/wiki/inc/lang/lv/stopwords.txt b/wiki/inc/lang/lv/stopwords.txt
new file mode 100644
index 0000000..846c869
--- /dev/null
+++ b/wiki/inc/lang/lv/stopwords.txt
@@ -0,0 +1,48 @@
+# Šis ir to vārdu sarakstus, kurus indeksētājs neņem vērā. Katru vārdu savā rindā!
+# Labojot failu ievēro, ja jālieto UNIX rindu aplauzumi (single newline)
+# Nevajag likt sarakstā par 3 burtiem īsākus vārdus, tos tā pat neņem vērā
+# Angļu valodai saraksts ņemts no http://www.ranks.nl/stopwords/
+gar
+par
+pār
+pret
+starp
+caur
+uz
+aiz
+apakš
+bez
+iz
+kopš
+no
+pēc
+pie
+pirms
+priekš
+uz
+virs
+zem
+apakšpus
+ārpus
+augšpus
+iekšpus
+lejpus
+otrpus
+šaipus
+viņpus
+virspus
+dēļ
+labad
+pēc 
+līdz 
+pa
+vai
+jā
+nē
+kaut 
+nav
+itin
+jo 
+taču
+
+
diff --git a/wiki/inc/lang/lv/subscr_digest.txt b/wiki/inc/lang/lv/subscr_digest.txt
new file mode 100644
index 0000000..fb24a31
--- /dev/null
+++ b/wiki/inc/lang/lv/subscr_digest.txt
@@ -0,0 +1,15 @@
+Labdien!
+
+@TITLE@ viki nodaļā @PAGE@ ir mainījušās šadas lapas:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Vecā versija: @OLDPAGE@
+Jaunā versija: @NEWPAGE@
+
+Lai atceltu izmaiņu paziņošanu, ielogojieties
+@DOKUWIKIURL@, apmeklējiet
+@SUBSCRIBE@
+un atsakieties no lapas vai nodaļas izmaiņu paziņojumiem .
diff --git a/wiki/inc/lang/lv/subscr_form.txt b/wiki/inc/lang/lv/subscr_form.txt
new file mode 100644
index 0000000..9e3145f
--- /dev/null
+++ b/wiki/inc/lang/lv/subscr_form.txt
@@ -0,0 +1,3 @@
+====== Abonementu pārvaldnieks ======
+
+Te varat mainīt savu lapas vai nodaļas abonementu.
\ No newline at end of file
diff --git a/wiki/inc/lang/lv/subscr_list.txt b/wiki/inc/lang/lv/subscr_list.txt
new file mode 100644
index 0000000..9c0ecf8
--- /dev/null
+++ b/wiki/inc/lang/lv/subscr_list.txt
@@ -0,0 +1,12 @@
+Labdien!
+
+@TITLE@ viki nodaļā @PAGE@ ir mainījušās šadas lapas:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Lai atceltu izmaiņu paziņošanu, ielogojieties
+@DOKUWIKIURL@, apmeklējiet
+@SUBSCRIBE@
+un atsakieties no lapas vai nodaļas izmaiņu paziņojumiem .
diff --git a/wiki/inc/lang/lv/subscr_single.txt b/wiki/inc/lang/lv/subscr_single.txt
new file mode 100644
index 0000000..b5b05d3
--- /dev/null
+++ b/wiki/inc/lang/lv/subscr_single.txt
@@ -0,0 +1,19 @@
+Labdien!
+
+@TITLE@ viki nodaļā @PAGE@ ir mainījušās šadas lapas:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Datums : @DATE@
+Lietotājs : @USER@
+Izmaiņu anotācija: @SUMMARY@
+Vecā versija: @OLDPAGE@
+Jaunā versija: @NEWPAGE@
+
+
+Lai atceltu izmaiņu paziņošanu, ielogojieties
+@DOKUWIKIURL@, apmeklējiet
+@SUBSCRIBE@
+un atsakieties no lapas vai nodaļas izmaiņu paziņojumiem .
diff --git a/wiki/inc/lang/lv/updateprofile.txt b/wiki/inc/lang/lv/updateprofile.txt
new file mode 100644
index 0000000..12fbd8d
--- /dev/null
+++ b/wiki/inc/lang/lv/updateprofile.txt
@@ -0,0 +1,8 @@
+====== Atjaunot sava konta datus ======
+
+Jāaizpilda tikai tie lauki, kuru saturu vēlies mainīt.  Nav iespējams mainīt savu lietotājvārdu.
+
+
+
+
+
diff --git a/wiki/inc/lang/lv/uploadmail.txt b/wiki/inc/lang/lv/uploadmail.txt
new file mode 100644
index 0000000..8d664d6
--- /dev/null
+++ b/wiki/inc/lang/lv/uploadmail.txt
@@ -0,0 +1,10 @@
+Fails augšupielādēts DokuWiki. Sīkākas ziņas:
+
+Fails         : @MEDIA@
+Datums        : @DATE@
+Pārlūks       : @BROWSER@
+IP adrese     : @IPADDRESS@
+Datora vārds  : @HOSTNAME@
+Izmērs        : @SIZE@
+MIME tips     : @MIME@
+Lietotājs     : @USER@
diff --git a/wiki/inc/lang/mg/admin.txt b/wiki/inc/lang/mg/admin.txt
new file mode 100644
index 0000000..2c4fc3f
--- /dev/null
+++ b/wiki/inc/lang/mg/admin.txt
@@ -0,0 +1,4 @@
+====== Administration ======
+
+Hitanao eo ambany lisitry ny asa fanaovana admin misy amin'ny DokuWiki.
+
diff --git a/wiki/inc/lang/mg/backlinks.txt b/wiki/inc/lang/mg/backlinks.txt
new file mode 100644
index 0000000..c625e65
--- /dev/null
+++ b/wiki/inc/lang/mg/backlinks.txt
@@ -0,0 +1,5 @@
+====== Verindrohy ======
+
+Lisitr'ireo pejy misy rohy manondro amin'ity pejy ity.
+
+
diff --git a/wiki/inc/lang/mg/conflict.txt b/wiki/inc/lang/mg/conflict.txt
new file mode 100644
index 0000000..96b369e
--- /dev/null
+++ b/wiki/inc/lang/mg/conflict.txt
@@ -0,0 +1,6 @@
+====== A newer version exists ======
+
+Efa misy kinova vaovao ny tahirin-kevitra novainao. Rehefa misy olona hafa nanova koa nandritra anao nanova no mitranga ny toy izao.
+
+Jereo ny tsy fitoviany miseho etsy ambany ireo, avy eo safidio izay kinova tianao hotazonina. Raha misafidy ny bokotra ''Raketo'' ianao, dia ny nataonao no horaketina. Ny bokotra ''Aoka ihany'' tsindriana raha hitazonana izay kinova misy ao.
+
diff --git a/wiki/inc/lang/mg/denied.txt b/wiki/inc/lang/mg/denied.txt
new file mode 100644
index 0000000..d6d2b81
--- /dev/null
+++ b/wiki/inc/lang/mg/denied.txt
@@ -0,0 +1,4 @@
+====== Tsy tafiditra ======
+
+Miala tsiny fa tsy manana alalana hanohizana mankany ianao.
+
diff --git a/wiki/inc/lang/mg/diff.txt b/wiki/inc/lang/mg/diff.txt
new file mode 100644
index 0000000..8d7d69b
--- /dev/null
+++ b/wiki/inc/lang/mg/diff.txt
@@ -0,0 +1,4 @@
+====== Tsy fitoviana ======
+
+Ireto ny maha-samihafa ny kinova nosafidiana sy ny kinovan'ny pejy amin'izao.
+
diff --git a/wiki/inc/lang/mg/edit.txt b/wiki/inc/lang/mg/edit.txt
new file mode 100644
index 0000000..2cde9de
--- /dev/null
+++ b/wiki/inc/lang/mg/edit.txt
@@ -0,0 +1,2 @@
+Rehefa avy manova ny pejy dia tsindrio ny bokotra ''Raketo''. Jereo ny [[wiki:syntax]] misy ny fomba fanoratana. Raha misy zavatra tianao handramana dia ianaro ao amin'ny [[wiki:playground]].
+
diff --git a/wiki/inc/lang/mg/editrev.txt b/wiki/inc/lang/mg/editrev.txt
new file mode 100644
index 0000000..a6ff5ba
--- /dev/null
+++ b/wiki/inc/lang/mg/editrev.txt
@@ -0,0 +1,2 @@
+**Kinovan'ny pejy taloha no nosokafanao!** Raha raketinao io, dia hanamboatra kinova vaovao miaraka amin'io ianao.
+----
\ No newline at end of file
diff --git a/wiki/inc/lang/mg/index.txt b/wiki/inc/lang/mg/index.txt
new file mode 100644
index 0000000..614fd64
--- /dev/null
+++ b/wiki/inc/lang/mg/index.txt
@@ -0,0 +1,4 @@
+====== Index ======
+
+Ity misy index mahasarona ireo pejy misy milahatra arakaraka ny [[doku>namespaces|namespaces]].
+
diff --git a/wiki/inc/lang/mg/lang.php b/wiki/inc/lang/mg/lang.php
new file mode 100644
index 0000000..aea3942
--- /dev/null
+++ b/wiki/inc/lang/mg/lang.php
@@ -0,0 +1,119 @@
+<?php
+/**
+ * mg language file
+ */
+$lang['encoding']   = 'utf-8';
+$lang['direction']  = 'ltr';
+
+$lang['btn_edit']   = 'Hanova ny pejy';
+$lang['btn_source'] = 'Asehoy ny source';
+$lang['btn_show']   = 'Asehoy ny pejy';
+$lang['btn_create'] = 'Amboary ity pejy';
+$lang['btn_search'] = 'Hikaroka';
+$lang['btn_save']   = 'Raketo';
+$lang['btn_preview']= 'Topi-maso';
+$lang['btn_top']    = 'Ho ery ambony';
+$lang['btn_newer']  = '<< taloha kokoa';
+$lang['btn_older']  = 'taoriana kokoa >>';
+$lang['btn_revs']   = 'Kinova taloha';
+$lang['btn_recent'] = 'Fiovana farany';
+$lang['btn_upload'] = 'Alefaso';
+$lang['btn_cancel'] = 'Aoka ihany';
+$lang['btn_index']  = 'Index';
+$lang['btn_secedit']= 'Edit';
+$lang['btn_login']  = 'Hiditra';
+$lang['btn_logout'] = 'Hivoaka';
+$lang['btn_admin']  = 'Admin';
+$lang['btn_update'] = 'Update';
+$lang['btn_delete'] = 'Fafao';
+$lang['btn_back']   = 'Miverina';
+$lang['btn_register'] = 'Hisoratra';
+
+$lang['loggedinas'] = 'Anaranao:';
+$lang['user']       = 'Anarana';
+$lang['pass']       = 'Alahidy';
+$lang['passchk']    = 'Ataovy indray';
+$lang['remember']   = 'Tsarovy';
+$lang['fullname']   = 'Anarana feno';
+$lang['email']      = 'Imailaka';
+$lang['badlogin']   = 'Miala tsiny fa misy diso ny anarana na ny alahidy.';
+
+$lang['regmissing'] = 'Tsy maintsy fenoina ny saha rehetra.';
+$lang['reguexists'] = 'Indrisy fa efa nisy namandrika io anarana io.';
+$lang['regsuccess'] = 'Voaforona ny kaontinao, halefa any imailaka ny alahidy.';
+$lang['regsuccess2']= 'Voaforona ilay kaonty.';
+$lang['regmailfail']= 'Ohatra ny nisy olana ny nandefasana imailaka. Miangavy anao hilaza ny Admin!';
+$lang['regbadmail'] = 'Toa tsy mandeha ny imailaka nomenao - Raha heverinao fa erreur io dia ilazao ny admin';
+$lang['regbadpass'] = 'Tsy mitovy ny alahidy roa nomenao, avereno indray.';
+$lang['regpwmail']  = 'Ny alahidy Wiki-nao';
+$lang['reghere']    = 'Mbola tsy manana kaonty ianao? Manaova vaovao';
+
+$lang['txt_upload']   = 'Misafidiana rakitra halefa:';
+$lang['txt_filename'] = 'Ampidiro ny anaran\'ny wiki (tsy voatery):';
+$lang['txt_overwrt']  = 'Fafana izay rakitra efa misy?';
+$lang['lockedby']     = 'Mbola voahidin\'i:';
+$lang['lockexpire']   = 'Afaka ny hidy amin\'ny:';
+$lang['js']['willexpire']   = 'Efa ho lany fotoana afaka iray minitra ny hidy ahafahanao manova ny pejy.\nMba hialana amin\'ny conflit dia ampiasao ny bokotra topi-maso hamerenana ny timer-n\'ny hidy.';
+
+$lang['js']['notsavedyet'] = 'Misy fiovana tsy voarakitra, ho very izany ireo.\nAzo antoka fa hotohizana?';
+$lang['rssfailed']   = 'An error occured while fetching this feed: ';
+$lang['nothingfound']= 'Tsy nahitana n\'inon\'inona.';
+
+$lang['mediaselect'] = 'Safidy rakitra Media';
+$lang['uploadsucc']  = 'Voalefa soa aman-tsara';
+$lang['uploadfail']  = 'Tsy lasa ilay izy. Mety tsy fananana alalana?';
+$lang['uploadwrong'] = 'Nolavina ny lefa. Voarara io extension-na rakitra io!';
+$lang['uploadexist'] = 'Efa misy ilay rakitra. Tsy nisy inona natao.';
+$lang['deletesucc']  = 'Voafafa ny rakitra "%s" .';
+$lang['deletefail']  = 'Tsy afaka nofafana ny "%s" - Hamarino ny alalana.';
+$lang['mediainuse']  = 'Tsy voafafa ny rakitra "%s" - mbola misy mampiasa io.';
+$lang['namespaces']  = 'Namespaces';
+$lang['mediafiles']  = 'Rakitra misy amin\'ny';
+
+$lang['reference']   = 'References for';
+$lang['ref_inuse']   = 'Tsy afaka fafana io rakitra io, satria mbola ampiasain\'ireto pejy ireto:';
+$lang['ref_hidden']  = 'Misy references  vitsivitsy amina pejy tsy anananao alalana hamaky';
+
+$lang['hits']       = 'Hits';
+$lang['quickhits']  = 'Anaram-pejy mifanaraka';
+$lang['toc']        = 'Fizahan-takila';
+$lang['current']    = 'current';
+$lang['yours']      = 'Kinova-nao';
+$lang['diff']       = 'Asehoy ny tsy fitoviana amin\'ny kinova amin\'izao';
+$lang['line']       = 'Andalana';
+$lang['breadcrumb'] = 'Taiza ianao:';
+$lang['lastmod']    = 'Novaina farany:';
+$lang['by']         = '/';
+$lang['deleted']    = 'voafafa';
+$lang['created']    = 'Voamboatra';
+$lang['restored']   = 'Naverina tamin\'ny kinova taloha (%s)';
+$lang['summary']    = 'Fanovana teo';
+
+$lang['mail_newpage'] = 'pejy niampy:';
+$lang['mail_changed'] = 'pejy niova:';
+
+$lang['js']['nosmblinks'] = "rohy mankamin\'ny fizarana Windows dia amin\'ny Microsoft Internet Explorer ihany no miasa.\nAzo atao ihany anefa ny manao dika-petaka ny rohy.";
+
+$lang['qb_bold']    = 'Matavy';
+$lang['qb_italic']  = 'Mandry';
+$lang['qb_underl']  = 'Voatsipika';
+$lang['qb_code']    = 'Code programa';
+$lang['qb_strike']  = 'Disoina';
+$lang['qb_h1']      = 'Lohateny laharana 1';
+$lang['qb_h2']      = 'Lohateny laharana 2';
+$lang['qb_h3']      = 'Lohateny laharana 3';
+$lang['qb_h4']      = 'Lohateny laharana 4';
+$lang['qb_h5']      = 'Lohateny laharana 5';
+$lang['qb_link']    = 'Rohy ato anatiny';
+$lang['qb_extlink'] = 'Rohy mivoaka';
+$lang['qb_hr']      = 'Tsipika marindrano';
+$lang['qb_ol']      = 'Tanisa milahatra';
+$lang['qb_ul']      = 'Tanisa tsy milahatra';
+$lang['qb_media']   = 'Hanampy sary na rakitra hafa';
+$lang['qb_sig']     = 'Manisy sonia';
+
+$lang['js']['del_confirm']= 'Hofafana ilay andalana?';
+
+//Setup VIM: ex: et ts=2 :
+$lang['email_signature_text'] = 'Ity imailaka ity dia navoakan\'ny wiki tao amin\'ny
+@DOKUWIKIURL@';
diff --git a/wiki/inc/lang/mg/locked.txt b/wiki/inc/lang/mg/locked.txt
new file mode 100644
index 0000000..5705659
--- /dev/null
+++ b/wiki/inc/lang/mg/locked.txt
@@ -0,0 +1,4 @@
+====== Pejy voahidy ======
+
+Mbola ovain'olona hafa ity pejy ity ka voahidy aloha. Andraso kely ho vitany ny azy, na ho lany fotoana ilay hidy.
+
diff --git a/wiki/inc/lang/mg/login.txt b/wiki/inc/lang/mg/login.txt
new file mode 100644
index 0000000..1ea3fac
--- /dev/null
+++ b/wiki/inc/lang/mg/login.txt
@@ -0,0 +1,4 @@
+====== Login ======
+
+Mbola tsy niditra ianao izao! Ampidiro eto ambany ny anarana sy ny alahidy. Ilaina manaiky cookies ny navigateur-nao raha hiditra.
+
diff --git a/wiki/inc/lang/mg/mailtext.txt b/wiki/inc/lang/mg/mailtext.txt
new file mode 100644
index 0000000..c772686
--- /dev/null
+++ b/wiki/inc/lang/mg/mailtext.txt
@@ -0,0 +1,12 @@
+Nisy pejy niova tao amin'ny wiky. Ireto ny antsipiriany:
+
+Date        : @DATE@
+Browser     : @BROWSER@
+Adiresy IP  : @IPADDRESS@
+Hostname    : @HOSTNAME@
+Taloha      : @OLDPAGE@
+Vaovao      : @NEWPAGE@
+Fiovana     : @SUMMARY@
+Novain'i    : @USER@
+
+@DIFF@
diff --git a/wiki/inc/lang/mg/newpage.txt b/wiki/inc/lang/mg/newpage.txt
new file mode 100644
index 0000000..a998caf
--- /dev/null
+++ b/wiki/inc/lang/mg/newpage.txt
@@ -0,0 +1,3 @@
+====== Mbola tsy misy an'io pejy io ======
+
+Nanindry rohy manondro pejy mbola tsy misy ianao. Afaka amboarinao io pejy io, tsindrio ny bokotra ''Amboary ity pejy''
diff --git a/wiki/inc/lang/mg/norev.txt b/wiki/inc/lang/mg/norev.txt
new file mode 100644
index 0000000..71ecb9b
--- /dev/null
+++ b/wiki/inc/lang/mg/norev.txt
@@ -0,0 +1,4 @@
+====== Tsy misy io kinova io ======
+
+Tsy misy ny kinova voalaza. Ampiasao ny bokotra ''Kinova taloha'' hampisehoana ireo karazana fanovana natao tamin'ity pejy ity.
+
diff --git a/wiki/inc/lang/mg/password.txt b/wiki/inc/lang/mg/password.txt
new file mode 100644
index 0000000..4ed2858
--- /dev/null
+++ b/wiki/inc/lang/mg/password.txt
@@ -0,0 +1,6 @@
+Miarahaba an'i @FULLNAME@!
+
+Ireto ny momba anao ho an'ny @TITLE@ ao amin'ny @DOKUWIKIURL@
+
+Anarana    : @LOGIN@
+Alahidy    : @PASSWORD@
diff --git a/wiki/inc/lang/mg/preview.txt b/wiki/inc/lang/mg/preview.txt
new file mode 100644
index 0000000..52019cd
--- /dev/null
+++ b/wiki/inc/lang/mg/preview.txt
@@ -0,0 +1,5 @@
+====== Topi-maso ======
+
+Topi-maso ahafahanao mijery ny fivoakan'ny soratra nataonao ity. Tandremo: Mbola **tsy voarakitra** io!
+
+
diff --git a/wiki/inc/lang/mg/read.txt b/wiki/inc/lang/mg/read.txt
new file mode 100644
index 0000000..0fe51f4
--- /dev/null
+++ b/wiki/inc/lang/mg/read.txt
@@ -0,0 +1,3 @@
+Vakiana fotsiny ity pejy ity. Afaka jerenao ny source, saingy tsy afaka ovainao. Anontanio ny admin raha heverinao fa tsy mety izany.
+
+
diff --git a/wiki/inc/lang/mg/recent.txt b/wiki/inc/lang/mg/recent.txt
new file mode 100644
index 0000000..4bc8245
--- /dev/null
+++ b/wiki/inc/lang/mg/recent.txt
@@ -0,0 +1,5 @@
+====== Fiovana farany ======
+
+Ireto pejy ireto no niova vao haingana.
+
+
diff --git a/wiki/inc/lang/mg/register.txt b/wiki/inc/lang/mg/register.txt
new file mode 100644
index 0000000..618c1f9
--- /dev/null
+++ b/wiki/inc/lang/mg/register.txt
@@ -0,0 +1,5 @@
+====== Hanokatra kaonty vaovao ======
+
+Fenoy ny saha rehetra eto ambany raha hanokatra kaonty amin'ity wiki ity. Hamarino fa adiresy imailaka mandeha no omenao - halefa any mantsy ny alahidy. Ny anarana dia tsy maintsy manaraka ny fepetran'ny [[doku>pagename|pagename]].
+
+
diff --git a/wiki/inc/lang/mg/revisions.txt b/wiki/inc/lang/mg/revisions.txt
new file mode 100644
index 0000000..7270458
--- /dev/null
+++ b/wiki/inc/lang/mg/revisions.txt
@@ -0,0 +1,5 @@
+====== Kinova taloha ======
+
+Ireto ny kinovan'ny pejy taloha. Raha te hamerina kinova taloha ianao, tsongay eo ambany izy hisokatra, avy eo tsindrio ny bokotra ''Hanova ny pejy'' ary ''Soraty''.
+
+
diff --git a/wiki/inc/lang/mg/searchpage.txt b/wiki/inc/lang/mg/searchpage.txt
new file mode 100644
index 0000000..43fc402
--- /dev/null
+++ b/wiki/inc/lang/mg/searchpage.txt
@@ -0,0 +1,4 @@
+====== Karoka ======
+
+Ireto ambany ireto ny valin'ny fikarohanao.  @CREATEPAGEINFO@
+
diff --git a/wiki/inc/lang/mg/showrev.txt b/wiki/inc/lang/mg/showrev.txt
new file mode 100644
index 0000000..92690f4
--- /dev/null
+++ b/wiki/inc/lang/mg/showrev.txt
@@ -0,0 +1,2 @@
+**Ity dia kinovan'ny pejy taloha!**
+----
diff --git a/wiki/inc/lang/mk/adminplugins.txt b/wiki/inc/lang/mk/adminplugins.txt
new file mode 100644
index 0000000..28e2cc1
--- /dev/null
+++ b/wiki/inc/lang/mk/adminplugins.txt
@@ -0,0 +1 @@
+===== Додатни приклучоци =====
\ No newline at end of file
diff --git a/wiki/inc/lang/mk/jquery.ui.datepicker.js b/wiki/inc/lang/mk/jquery.ui.datepicker.js
new file mode 100644
index 0000000..97864ab
--- /dev/null
+++ b/wiki/inc/lang/mk/jquery.ui.datepicker.js
@@ -0,0 +1,37 @@
+/* Macedonian i18n for the jQuery UI date picker plugin. */
+/* Written by Stojce Slavkovski. */
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "../widgets/datepicker" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery.datepicker );
+	}
+}( function( datepicker ) {
+
+datepicker.regional.mk = {
+	closeText: "Затвори",
+	prevText: "&#x3C;",
+	nextText: "&#x3E;",
+	currentText: "Денес",
+	monthNames: [ "Јануари","Февруари","Март","Април","Мај","Јуни",
+	"Јули","Август","Септември","Октомври","Ноември","Декември" ],
+	monthNamesShort: [ "Јан","Фев","Мар","Апр","Мај","Јун",
+	"Јул","Авг","Сеп","Окт","Ное","Дек" ],
+	dayNames: [ "Недела","Понеделник","Вторник","Среда","Четврток","Петок","Сабота" ],
+	dayNamesShort: [ "Нед","Пон","Вто","Сре","Чет","Пет","Саб" ],
+	dayNamesMin: [ "Не","По","Вт","Ср","Че","Пе","Са" ],
+	weekHeader: "Сед",
+	dateFormat: "dd.mm.yy",
+	firstDay: 1,
+	isRTL: false,
+	showMonthAfterYear: false,
+	yearSuffix: "" };
+datepicker.setDefaults( datepicker.regional.mk );
+
+return datepicker.regional.mk;
+
+} ) );
diff --git a/wiki/inc/lang/mk/lang.php b/wiki/inc/lang/mk/lang.php
new file mode 100644
index 0000000..034d98b
--- /dev/null
+++ b/wiki/inc/lang/mk/lang.php
@@ -0,0 +1,226 @@
+<?php
+/**
+ * mk language file
+ *
+ * This file was initially built by fetching translations from other
+ * Wiki projects. See the @url lines below. Additional translations
+ * and fixes where done for DokuWiki by the people mentioned in the
+ * lines starting with @author
+ *
+ * @url http://svn.wikimedia.org/viewvc/mediawiki/trunk/phase3/languages/messages/MessagesMk.php?view=co
+ * @author Dimitar Talevski <dimi3.14@gmail.com>
+ */
+$lang['encoding']              = 'utf-8';
+$lang['direction']             = 'ltr';
+$lang['doublequoteopening']    = '„';
+$lang['doublequoteclosing']    = '“';
+$lang['singlequoteopening']    = '’';
+$lang['singlequoteclosing']    = '‘';
+$lang['apostrophe']            = '’';
+$lang['btn_edit']              = 'Уреди ја страницата';
+$lang['btn_source']            = 'Прикажи ја изворната страница';
+$lang['btn_show']              = 'Прикажи страница';
+$lang['btn_create']            = 'Креирај ја оваа страница';
+$lang['btn_search']            = 'Барај';
+$lang['btn_save']              = 'Зачувај';
+$lang['btn_preview']           = 'Преглед';
+$lang['btn_top']               = 'Назад до врв';
+$lang['btn_newer']             = '<< понови';
+$lang['btn_older']             = 'постари >>';
+$lang['btn_revs']              = 'Стари ревизии';
+$lang['btn_recent']            = 'Скорешни промени';
+$lang['btn_upload']            = 'Крени';
+$lang['btn_cancel']            = 'Откажи';
+$lang['btn_index']             = 'Индекс';
+$lang['btn_secedit']           = 'Уреди';
+$lang['btn_login']             = 'Најава';
+$lang['btn_logout']            = 'Одјава';
+$lang['btn_admin']             = 'Админ';
+$lang['btn_update']            = 'Ажурирај';
+$lang['btn_delete']            = 'Избриши';
+$lang['btn_back']              = 'Назад';
+$lang['btn_backlink']          = 'Повратни врски';
+$lang['btn_subscribe']         = 'Менаџирај претплати';
+$lang['btn_profile']           = 'Ажурирај профил';
+$lang['btn_reset']             = 'Ресет';
+$lang['btn_draft']             = 'Уреди скица';
+$lang['btn_recover']           = 'Поврати скица';
+$lang['btn_draftdel']          = 'Избриши скица';
+$lang['btn_revert']            = 'Обнови';
+$lang['btn_register']          = 'Регистрирај се';
+$lang['loggedinas']            = 'Најавен/а како:';
+$lang['user']                  = 'Корисничко име';
+$lang['pass']                  = 'Лозинка';
+$lang['newpass']               = 'Нова лозинка';
+$lang['oldpass']               = 'Потврдете ја сегашната лозинка';
+$lang['passchk']               = 'уште еднаш';
+$lang['remember']              = 'Запомни ме';
+$lang['fullname']              = 'Вистинско име';
+$lang['email']                 = 'Е-пошта';
+$lang['profile']               = 'Кориснички профил';
+$lang['badlogin']              = 'Жалам, корисничкото име или лозинката се погрешни.';
+$lang['minoredit']             = 'Мали измени';
+$lang['draftdate']             = 'Скицата е само-снимена на';
+$lang['nosecedit']             = 'Во меѓувреме страницата беше променета, информацискиот дел е со истечен период затоа се вчита целата страница.';
+$lang['regmissing']            = 'Жалам, мора да ги пополнеш сите полиња.';
+$lang['reguexists']            = 'Жалам, корисник со ова корисничко име веќе постои.';
+$lang['regsuccess']            = 'Корисникот е креиран и лозинката е испратена по е-пошта.';
+$lang['regsuccess2']           = 'Корисникот е креиран.';
+$lang['regmailfail']           = 'Изгледа дека се појави грешка при испраќањето на е-пошта со лозинката. Ве молам контактирајте го администраторот!';
+$lang['regbadmail']            = 'Дадената адреса за е-пошта изгледа невалидна - ако мислите дека ова е грешка, контактирајте го администраторот';
+$lang['regbadpass']            = 'Двете наведени лозинки не се исти, ве молам пробајте повторно.';
+$lang['regpwmail']             = 'Вашата DokuWiki лозинка';
+$lang['reghere']               = 'Се уште немаш сметка? Направи веќе една';
+$lang['profna']                = 'Ова вики не поддржува измена на профилот';
+$lang['profnochange']          = 'Нема промени, ништо за правење.';
+$lang['profnoempty']           = 'Празно име или адреса за е-пошта не е дозволено.';
+$lang['profchanged']           = 'Корисничкиот профил е успешно ажуриран.';
+$lang['pwdforget']             = 'Ја заборавивте лозинката? Добијте нова';
+$lang['resendna']              = 'Ова вики не поддржува повторно испраќање на лозинка.';
+$lang['resendpwdmissing']      = 'Жалам, морате да ги пополните сите полиња.';
+$lang['resendpwdnouser']       = 'Жалам, таков корисник не постои во нашата база со податоци.';
+$lang['resendpwdbadauth']      = 'Жалам, овај код за валидација не е валиден. Проверете повторно дали ја искористивте целосната врска за потврда.';
+$lang['resendpwdconfirm']      = 'Врска за потврда е испратена по е-пошта.';
+$lang['resendpwdsuccess']      = 'Вашата нова лозинка е испратена по е-пошта.';
+$lang['license']               = 'Освен каде што е наведено поинаку, содржината на ова вики е лиценцирано по следнава лиценца:';
+$lang['licenseok']             = 'Забелешка: со уредување на оваа страница се согласувате да ја лиценцирате вашата содржина под следнава лиценца:';
+$lang['searchmedia']           = 'Барај име на датотека:';
+$lang['searchmedia_in']        = 'Барај во %s';
+$lang['txt_upload']            = 'Избери датотека за качување:';
+$lang['txt_filename']          = 'Качи како (неморално):';
+$lang['txt_overwrt']           = 'Пребриши ја веќе постоечката датотека';
+$lang['lockedby']              = 'Моментално заклучена од:';
+$lang['lockexpire']            = 'Клучот истекува на:';
+$lang['js']['willexpire']            = 'Вашиот клуч за уредување на оваа страница ќе истече за една минута.\nЗа да избегнете конфликти и да го ресетирате бројачот за време, искористете го копчето за преглед.';
+$lang['js']['notsavedyet']     = 'Незачуваните промени ќе бидат изгубени.\nСакате да продолжите?';
+$lang['rssfailed']             = 'Се појави грешка при повлекувањето на овој канал:';
+$lang['nothingfound']          = 'Ништо не е пронајдено.';
+$lang['mediaselect']           = 'Медиа датотеки';
+$lang['uploadsucc']            = 'Качувањето е успешно';
+$lang['uploadfail']            = 'Качувањето не е успешно. Можеби има погрешни пермисии?';
+$lang['uploadwrong']           = 'Качувањето е одбиено. Наставката на датотеката е забранета!';
+$lang['uploadexist']           = 'Датотеката веќе постои. Ништо не е направено.';
+$lang['uploadbadcontent']      = 'Качената содржина не се совпаѓа со наставката %s на датотеката.';
+$lang['uploadspam']            = 'Качувањето беше блокирано од црната листа за спам.';
+$lang['uploadxss']             = 'Качувањето беше блокирано за можна злонамерна содржина.';
+$lang['uploadsize']            = 'Датотеката за качување е премногу голема. (макс. %s)';
+$lang['deletesucc']            = 'Датотеката „%s“ е избришана.';
+$lang['deletefail']            = '„%s“ не може да се избрише - проверете пермисии.';
+$lang['mediainuse']            = 'Датотеката „%s“ не е избришана - се уште е во употреба.';
+$lang['mediafiles']            = 'Достапни датотеки во';
+$lang['js']['searchmedia']     = 'Барај датотеки';
+$lang['js']['keepopen']        = 'Задржи го прозорецот отворен на означеното место';
+$lang['js']['hidedetails']     = 'Скриј детали';
+$lang['js']['nosmblinks']      = 'Поврзувањето со Windows Shares работи само со Microsoft Internet Explorer. Сепак можете да ја копирате и вметнете врската.';
+$lang['js']['linkwiz']         = 'Волшебник за врски';
+$lang['js']['linkto']          = 'Врска до:';
+$lang['js']['del_confirm']     = 'Дали навистина да ги избришам избраните датотеки?';
+$lang['mediausage']            = 'Користете ја следнава синтакса за референцирање кон оваа датотека:';
+$lang['mediaview']             = 'Види ја оригиналната датотека';
+$lang['mediaroot']             = 'root';
+$lang['mediaextchange']        = 'Наставката на датотеката е сменета од .%s во .%s!';
+$lang['reference']             = 'Референци за';
+$lang['ref_inuse']             = 'Датотеката не може да биде избришана бидејќи се уште се користи од следниве страници:';
+$lang['ref_hidden']            = 'Некои референци се на страници на кои немате пермисии за читање';
+$lang['hits']                  = 'Прегледи';
+$lang['quickhits']             = 'Совпаѓачки имиња на страници';
+$lang['toc']                   = 'Содржина';
+$lang['current']               = 'сегашно';
+$lang['yours']                 = 'Вашата верзија';
+$lang['diff']                  = 'Прикажи разлики со сегашната верзија';
+$lang['diff2']                 = 'Прикажи разлики помеѓу избраните ревизии';
+$lang['line']                  = 'Линија';
+$lang['breadcrumb']            = 'Следи:';
+$lang['youarehere']            = 'Вие сте тука:';
+$lang['lastmod']               = 'Последно изменета:';
+$lang['by']                    = 'од';
+$lang['deleted']               = 'отстранета';
+$lang['created']               = 'креирана';
+$lang['restored']              = 'обновена е стара ревизија (%s)';
+$lang['external_edit']         = 'надворешно уредување';
+$lang['summary']               = 'Уреди го изводот';
+$lang['noflash']               = '<a href="http://www.adobe.com/products/flashplayer/">Adobe Flash приклучокот</a> е потребен за да се прикаже оваа содржина.';
+$lang['download']              = 'Симни Snippe';
+$lang['mail_newpage']          = 'додадена е страницата:';
+$lang['mail_changed']          = 'променета е страницата:';
+$lang['mail_new_user']         = 'нов корисник:';
+$lang['mail_upload']           = 'качена е датотеката:';
+$lang['qb_bold']               = 'Задебелен текст';
+$lang['qb_italic']             = 'Накосен текст';
+$lang['qb_underl']             = 'Подвлечен текст';
+$lang['qb_code']               = 'Текст за код';
+$lang['qb_strike']             = 'Прецртан текст';
+$lang['qb_h1']                 = 'Заглавие од 1-во ниво';
+$lang['qb_h2']                 = 'Заглавие од 2-ро ниво';
+$lang['qb_h3']                 = 'Заглавие од 3-то ниво';
+$lang['qb_h4']                 = 'Заглавие од 4-то ниво';
+$lang['qb_h5']                 = 'Заглавие од 5-то ниво';
+$lang['qb_h']                  = 'Заглавие';
+$lang['qb_hs']                 = 'Избери заглавие';
+$lang['qb_hplus']              = 'Зголеми заглавие';
+$lang['qb_hminus']             = 'Намали заглавие';
+$lang['qb_hequal']             = 'Заглавие од исто ниво';
+$lang['qb_link']               = 'Внатрешна врска';
+$lang['qb_extlink']            = 'Надворешна врска';
+$lang['qb_hr']                 = 'Хоризонтален линијар';
+$lang['qb_media']              = 'Додај слики и други датотеки';
+$lang['qb_sig']                = 'Внеси потпис';
+$lang['qb_smileys']            = 'Смајлиња';
+$lang['qb_chars']              = 'Специјални знаци';
+$lang['metaedit']              = 'Уреди мета-податоци';
+$lang['metasaveerr']           = 'Запишување на мета-податоците не успеа';
+$lang['metasaveok']            = 'Мета-податоците се зачувани';
+$lang['btn_img_backto']            = 'Назад до %s';
+$lang['img_title']             = 'Насловна линија:';
+$lang['img_caption']           = 'Наслов:';
+$lang['img_date']              = 'Датум:';
+$lang['img_fname']             = 'Име на датотека:';
+$lang['img_fsize']             = 'Големина:';
+$lang['img_artist']            = 'Фотограф:';
+$lang['img_copyr']             = 'Авторско право:';
+$lang['img_format']            = 'Формат:';
+$lang['img_camera']            = 'Камера:';
+$lang['img_keywords']          = 'Клучни зборови:';
+$lang['subscr_subscribe_success'] = 'Додаден/а е %s во претплатничката листа за %s';
+$lang['subscr_subscribe_error'] = 'Грешка при додавањето на %s во претплатничката листа за %s';
+$lang['subscr_subscribe_noaddress'] = 'Нема адреса за е-пошта поврзана со Вашата најава, не може да бидете додадени на претплатничката листа';
+$lang['subscr_unsubscribe_success'] = 'Отстранет/а е %s од претплатничката листа за %s';
+$lang['subscr_unsubscribe_error'] = 'Грешка при отстранувањето на %s од претплатничката листа за %s';
+$lang['subscr_already_subscribed'] = '%s е веќе претплатен/а на %s';
+$lang['subscr_not_subscribed'] = '%s е не претплатен/а на %s';
+$lang['subscr_m_not_subscribed'] = 'Моментално не сте пријавени на сегашната страница или ';
+$lang['subscr_m_new_header']   = 'Додај претплата';
+$lang['subscr_m_current_header'] = 'Моментални претплати';
+$lang['subscr_m_unsubscribe']  = 'Отплатување';
+$lang['subscr_m_subscribe']    = 'Претплата';
+$lang['subscr_m_receive']      = 'Прими';
+$lang['subscr_style_every']    = 'е-пошта за секоја промена';
+$lang['authtempfail']          = 'Автентикација на корисник е привремено недостапна. Ако оваа ситуација истрајува, ве молам известете го вики администратор.';
+$lang['i_chooselang']          = 'Избере јазик';
+$lang['i_installer']           = 'Инсталер за DokuWiki';
+$lang['i_wikiname']            = 'вики име';
+$lang['i_enableacl']           = 'Овозможи ACL (препорачано)';
+$lang['i_superuser']           = 'Супер корисник';
+$lang['i_problems']            = 'Инсталерот пронајде неколку проблеми кои се прикажани подолу. Не можете да продолжите понатаму се додека не ги поправите.';
+$lang['i_modified']            = 'За безбедносни причини оваа скрипта ќе работи само со нова и неизменета инсталација од DokuWiki. Или извадете ги повторно датотеките од симнатиот пакет или консултирајте се со комплетните <a href="http://dokuwiki.org/install">Dokuwiki инструкции за инсталација</a>';
+$lang['i_funcna']              = 'PHP функцијата <code>%s</code> не е достапна. Можеби вашиот хостинг провајдер ја оневозможил со причина?';
+$lang['i_phpver']              = 'Вашата верзија на PHP <code>%s</code> е пониска од потребната <code>%s</code>. Треба да ја надградите вашата PHP инсталација.';
+$lang['i_permfail']            = '<code>%s</code> не е запишлива од DokuWiki. Треба да ги поправите подесувањата за пермисии на овој директориум!';
+$lang['i_confexists']          = '<code>%s</code> веќе постои';
+$lang['i_writeerr']            = 'Не може да се креира <code>%s</code>. Треба да ги проверите пермисиите на директориумот/датотеката и рачно да ја креирате датотеката.';
+$lang['i_badhash']             = 'непозната или изменете dokuwiki.php (hash=<code>%s</code>)';
+$lang['i_badval']              = '<code>%s</code> - нелегална или празна вредност';
+$lang['i_success']             = 'Конфигурацијата успешно заврши. Сега можете да ја избришете датотеката install.php. Продолжете до <a href="doku.php?id=wiki:welcome">вашето ново DokuWiki</a>.';
+$lang['i_failure']             = 'Се појавија некои грешки при запишувањето на конфигурациските датотеки. Можеби треба да ги поравите рачно пред да можете да го користите <a href="doku.php?id=wiki:welcome">вашето ново DokuWiki</a>.';
+$lang['i_policy']              = 'Почетна ACL политика';
+$lang['i_pol0']                = 'Отвори вики (читај, запиши, качи за сите)';
+$lang['i_pol1']                = 'Јавно вики (читај за сите, запиши и качи за регистрирани корисници)';
+$lang['i_pol2']                = 'Затворено вики (читај, запиши, качи само за регистрирани корисници)';
+$lang['i_retry']               = 'Пробај повторно';
+$lang['years']                 = 'пред %d години';
+$lang['months']                = 'пред %d месеци';
+$lang['weeks']                 = 'пред %d недели';
+$lang['days']                  = 'пред %d денови';
+$lang['hours']                 = 'пред %d часа';
+$lang['minutes']               = 'пред %d минути';
+$lang['seconds']               = 'пред %d секунди';
diff --git a/wiki/inc/lang/mk/read.txt b/wiki/inc/lang/mk/read.txt
new file mode 100644
index 0000000..8c8726e
--- /dev/null
+++ b/wiki/inc/lang/mk/read.txt
@@ -0,0 +1 @@
+Оваа страница е само за читање. Можете да го гледате изворот, но не можете да ја менувате. Ако мислите дека ова е погрешно, контактирајте го администраторот.
\ No newline at end of file
diff --git a/wiki/inc/lang/mk/recent.txt b/wiki/inc/lang/mk/recent.txt
new file mode 100644
index 0000000..cfbba4a
--- /dev/null
+++ b/wiki/inc/lang/mk/recent.txt
@@ -0,0 +1,3 @@
+====== Скорешни промени ======
+
+Следниве страници беа скорешно променети.
\ No newline at end of file
diff --git a/wiki/inc/lang/mk/showrev.txt b/wiki/inc/lang/mk/showrev.txt
new file mode 100644
index 0000000..a0ca735
--- /dev/null
+++ b/wiki/inc/lang/mk/showrev.txt
@@ -0,0 +1,2 @@
+**Ова е стара ревизија од документото!**
+----
\ No newline at end of file
diff --git a/wiki/inc/lang/ml/admin.txt b/wiki/inc/lang/ml/admin.txt
new file mode 100644
index 0000000..0f9c814
--- /dev/null
+++ b/wiki/inc/lang/ml/admin.txt
@@ -0,0 +1,3 @@
+====== പൊതു സെറ്റിംഗ്സ്  ======
+
+താഴെ കാണുന്ന പട്ടിക ഡോക്കുവിക്കിയിൽ  ഉള്ള പൊതു സെറ്റിംഗ്സ് ആണ് . 
\ No newline at end of file
diff --git a/wiki/inc/lang/ml/jquery.ui.datepicker.js b/wiki/inc/lang/ml/jquery.ui.datepicker.js
new file mode 100644
index 0000000..440e09e
--- /dev/null
+++ b/wiki/inc/lang/ml/jquery.ui.datepicker.js
@@ -0,0 +1,37 @@
+/* Malayalam (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Saji Nediyanchath (saji89@gmail.com). */
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "../widgets/datepicker" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery.datepicker );
+	}
+}( function( datepicker ) {
+
+datepicker.regional.ml = {
+	closeText: "ശരി",
+	prevText: "മുന്നത്തെ",
+	nextText: "അടുത്തത് ",
+	currentText: "ഇന്ന്",
+	monthNames: [ "ജനുവരി","ഫെബ്രുവരി","മാര്‍ച്ച്","ഏപ്രില്‍","മേയ്","ജൂണ്‍",
+	"ജൂലൈ","ആഗസ്റ്റ്","സെപ്റ്റംബര്‍","ഒക്ടോബര്‍","നവംബര്‍","ഡിസംബര്‍" ],
+	monthNamesShort: [ "ജനു", "ഫെബ്", "മാര്‍", "ഏപ്രി", "മേയ്", "ജൂണ്‍",
+	"ജൂലാ", "ആഗ", "സെപ്", "ഒക്ടോ", "നവം", "ഡിസ" ],
+	dayNames: [ "ഞായര്‍", "തിങ്കള്‍", "ചൊവ്വ", "ബുധന്‍", "വ്യാഴം", "വെള്ളി", "ശനി" ],
+	dayNamesShort: [ "ഞായ", "തിങ്ക", "ചൊവ്വ", "ബുധ", "വ്യാഴം", "വെള്ളി", "ശനി" ],
+	dayNamesMin: [ "ഞാ","തി","ചൊ","ബു","വ്യാ","വെ","ശ" ],
+	weekHeader: "ആ",
+	dateFormat: "dd/mm/yy",
+	firstDay: 1,
+	isRTL: false,
+	showMonthAfterYear: false,
+	yearSuffix: "" };
+datepicker.setDefaults( datepicker.regional.ml );
+
+return datepicker.regional.ml;
+
+} ) );
diff --git a/wiki/inc/lang/mr/admin.txt b/wiki/inc/lang/mr/admin.txt
new file mode 100644
index 0000000..6f54384
--- /dev/null
+++ b/wiki/inc/lang/mr/admin.txt
@@ -0,0 +1,3 @@
+====== व्यवस्थापन ======
+
+खाली तुम्हाला डॉक्युविकि मधे उपलब्ध असलेल्या व्यवस्थापनाच्या क्रियांची सूची दिली आहे.
\ No newline at end of file
diff --git a/wiki/inc/lang/mr/backlinks.txt b/wiki/inc/lang/mr/backlinks.txt
new file mode 100644
index 0000000..997fa68
--- /dev/null
+++ b/wiki/inc/lang/mr/backlinks.txt
@@ -0,0 +1,3 @@
+====== प्रतिलिंक ======
+
+ही त्या सर्व प्रृष्ठांची सूची आहे जी या पृष्ठाला परत लिंक करतात.
\ No newline at end of file
diff --git a/wiki/inc/lang/mr/conflict.txt b/wiki/inc/lang/mr/conflict.txt
new file mode 100644
index 0000000..2b1bb64
--- /dev/null
+++ b/wiki/inc/lang/mr/conflict.txt
@@ -0,0 +1,5 @@
+====== नवीन आवृत्ती उपलब्ध आहे ======
+
+तुम्ही संपादित केलेल्या दस्तावेजाची नवीन आवृत्ती उपलब्ध आहे. तुम्ही संपादित करत असलेल्या दस्तावेजामधे त्याच वेळी इतर यूजरने बदल केल्यास असे घडते.
+
+खाली दर्शाविलेले फरक नीट तपासा आणि त्यापैकी कुठले ठेवायचे ते ठरवा. जर तुम्ही 'सुरक्षित' केलं तर तुमचे बदल सुरक्षित होतील. सध्याची आवृत्ति ठेवण्यासाठी 'कॅन्सल' वर क्लिक करा.
\ No newline at end of file
diff --git a/wiki/inc/lang/mr/denied.txt b/wiki/inc/lang/mr/denied.txt
new file mode 100644
index 0000000..5415fde
--- /dev/null
+++ b/wiki/inc/lang/mr/denied.txt
@@ -0,0 +1,4 @@
+====== परवानगी नाकारली ======
+
+क्षमा करा, पण तुम्हाला यापुढे जाण्याचे हक्क नाहीत.
+
diff --git a/wiki/inc/lang/mr/diff.txt b/wiki/inc/lang/mr/diff.txt
new file mode 100644
index 0000000..f0a8450
--- /dev/null
+++ b/wiki/inc/lang/mr/diff.txt
@@ -0,0 +1,3 @@
+====== फरक ======
+
+या पानावर तुम्हाला निवडलेली आवृत्ती व सध्याच्या आवृत्ती मधले फरक दाखवले आहेत.
\ No newline at end of file
diff --git a/wiki/inc/lang/mr/draft.txt b/wiki/inc/lang/mr/draft.txt
new file mode 100644
index 0000000..aa74475
--- /dev/null
+++ b/wiki/inc/lang/mr/draft.txt
@@ -0,0 +1,5 @@
+====== मसुद्याची फाइल मिळाली ======
+
+तुमचा मागचा संपादानाचा सेशन नीट पूर्ण झाला नव्हता. डॉक्युविकिने तुमच्या कामाचा मसुदा आपोआप सुरक्षित केला होता , जो वापरून तुमची संपादन परत चालू करू शकता. खाली तुमच्या मागच्या सेशन मधला सुरक्षित केलेला डेटा दाखवला आहे.
+
+कृपया आता हे ठरवा की तुमच्या संपादन सेशनचे //पुनर्स्थापन// करायचे, सुरक्षित केलेला मसुदा //रद्द// करायचा  का संपादनच //कॅन्सल// करायचं.
\ No newline at end of file
diff --git a/wiki/inc/lang/mr/edit.txt b/wiki/inc/lang/mr/edit.txt
new file mode 100644
index 0000000..6c6347e
--- /dev/null
+++ b/wiki/inc/lang/mr/edit.txt
@@ -0,0 +1 @@
+पान संपादित करा आणि 'सुरक्षित' वर क्लिक करा. विकी सिन्टॅक्स साठी [[wiki:syntax]] पहा.कृपया तुम्ही जर एखादे पान **सुधारित** करू शकत असाल तरच ते संपादित करा. अन्यथा जर तुम्हाला फ़क्त काही गोष्टी ट्राय करून बघायच्या असतील तर [[playground:playground|प्लेग्राऊण्ड]] मधे आपले धडे गिरवा!
\ No newline at end of file
diff --git a/wiki/inc/lang/mr/editrev.txt b/wiki/inc/lang/mr/editrev.txt
new file mode 100644
index 0000000..d58c8ab
--- /dev/null
+++ b/wiki/inc/lang/mr/editrev.txt
@@ -0,0 +1,2 @@
+**तुमची या पानाची जुनी आवृत्ती लोड केलि आहे!** जर तुमची ती सुरक्षित केली तर तुमची त्याची एक नवीन आवृत्ती तयार कराल.
+----
\ No newline at end of file
diff --git a/wiki/inc/lang/mr/index.txt b/wiki/inc/lang/mr/index.txt
new file mode 100644
index 0000000..489b204
--- /dev/null
+++ b/wiki/inc/lang/mr/index.txt
@@ -0,0 +1,3 @@
+====== सूची ======
+
+ही सर्व उपलब्ध पानांची [[doku>namespaces|नेमस्पेस]] अनुसार तयार केलेली सूची आहे. 
\ No newline at end of file
diff --git a/wiki/inc/lang/mr/install.html b/wiki/inc/lang/mr/install.html
new file mode 100644
index 0000000..9696c78
--- /dev/null
+++ b/wiki/inc/lang/mr/install.html
@@ -0,0 +1,10 @@
+<p>हे पान <a href="http://dokuwiki.org">डॉक्युविकि</a> च्या पहिल्या इन्स्टॉलेशन आणि कॉन्फिगरेशन साठी मदत करतं. या इंस्टॉलर  विषयी जास्ती माहिती त्याच्या
+<a href="http://dokuwiki.org/installer">माहितीसंग्रह पानावर</a> उपलब्ध आहे.</p>
+
+<p> डॉक्युविकि विकी पाने व सम्बंधित माहिती ( उदा. फोटो , शोध सूची, जुन्या आवृत्ती ई.) साठवण्यासाठी सामान्य फाइलचा उपयोग करतं. डॉक्युविकिने नीट काम करण्यासाठी डॉक्युविकिला या फाइल जिथे साठवल्या आहेत त्या डिरेक्टरीमधे लेखनाचे हक्क ( write access ) असणे <strong>अत्यावश्यक</strong> आहे. या इंस्टॉलरला डिरेक्टरीचे हक्क सेट करता येत नाहीत. ते थेट तुमच्या शेल मधून सेट करावे लागतात, किंवा तुम्ही व्यावसायिक होस्टिंग वापरत असाल तर FTP वापरून अथवा तुमच्या होस्टिंग कंट्रोल पॅनल ( उदा. cPanel  वगैरे ) मधून सेट करावे लागतात.</p>
+
+<p>हा इंस्टॉलर तुमच्या डॉक्युविकिचे <abbr title="access control list">ACL</abbr> कॉन्फिगरेशन ठरवेल, ज्याद्वारे तुम्हाला व्यवस्थापकीय लॉगिन, डॉक्युविकिच्या व्यवस्थापन मेनू मधे प्लगिनचे इन्स्टॉलेशन, सदस्यांची व्यवस्था, विकी पानांवरील हक्क, कॉन्फिगरेशन बदलणे ई. साठी प्रवेशाचे हक्क वगैरे बदल करता येतील. ही व्यवस्था डॉक्युविकि वापरण्यासाठी आवश्यक नाही पण वापरल्यास डॉक्युविकिचे व्यवस्थापन अधिक सुरळित होइल.</p>
+
+<p>अनुभवी सदस्य किंवा ज्याना काही ख़ास गरजा असतील त्यानी खालील लिंक्स वापराव्यात :
+<a href="http://dokuwiki.org/install">इन्स्टॉलेशनविषयी सूचना</a>
+and <a href="http://dokuwiki.org/config">कॉन्फिगरेशनची सेटिंग</a></p>
\ No newline at end of file
diff --git a/wiki/inc/lang/mr/lang.php b/wiki/inc/lang/mr/lang.php
new file mode 100644
index 0000000..5aa22f3
--- /dev/null
+++ b/wiki/inc/lang/mr/lang.php
@@ -0,0 +1,265 @@
+<?php
+/**
+ * mr language file
+ *
+ * This file was initially built by fetching translations from other
+ * Wiki projects. See the @url lines below. Additional translations
+ * and fixes where done for DokuWiki by the people mentioned in the
+ * lines starting with @author
+ *
+ * @url http://svn.wikimedia.org/viewvc/mediawiki/trunk/phase3/languages/messages/MessagesMr.php?view=co
+ * @author ghatothkach@hotmail.com
+ * @author Padmanabh Kulkarni <kulkarnipadmanabh@gmail.com>
+ * @author shantanoo@gmail.com
+ */
+$lang['encoding']              = 'utf-8';
+$lang['direction']             = 'ltr';
+$lang['doublequoteopening']    = '“';
+$lang['doublequoteclosing']    = '”';
+$lang['singlequoteopening']    = '`';
+$lang['singlequoteclosing']    = '\'';
+$lang['apostrophe']            = '\'';
+$lang['btn_edit']              = 'हे पृष्ठ संपादित करा';
+$lang['btn_source']            = 'पानाचा स्त्रोत दाखवा ';
+$lang['btn_show']              = 'पान दाखवा';
+$lang['btn_create']            = 'हे पृष्ठ लीहा';
+$lang['btn_search']            = 'शोधा';
+$lang['btn_save']              = 'सुरक्षित';
+$lang['btn_preview']           = 'झलक';
+$lang['btn_top']               = 'परत वर';
+$lang['btn_newer']             = 'जास्त अलीकडचे';
+$lang['btn_older']             = 'कमी अलीकडचे';
+$lang['btn_revs']              = 'जून्या आव्रुत्ती';
+$lang['btn_recent']            = 'अलीकडील बदल';
+$lang['btn_upload']            = 'अपलोड';
+$lang['btn_cancel']            = 'रद्द करा';
+$lang['btn_index']             = 'सूचि';
+$lang['btn_secedit']           = 'संपादन';
+$lang['btn_login']             = 'प्रवेश करा';
+$lang['btn_logout']            = 'बाहेर पडा';
+$lang['btn_admin']             = 'अधिकारी';
+$lang['btn_update']            = 'अद्ययावत';
+$lang['btn_delete']            = 'नष्ट';
+$lang['btn_back']              = 'मागॆ';
+$lang['btn_backlink']          = 'येथे काय जोडले आहे';
+$lang['btn_subscribe']         = 'पृष्ठाच्या बदलांची पुरवणी (फीड) लावा ';
+$lang['btn_profile']           = 'प्रोफाइल अद्ययावत करा';
+$lang['btn_reset']             = 'रिसेट';
+$lang['btn_resendpwd']         = 'नवीन पासवर्ड';
+$lang['btn_draft']             = 'प्रत संपादन';
+$lang['btn_recover']           = 'प्रत परत मिळवा';
+$lang['btn_draftdel']          = 'प्रत रद्द';
+$lang['btn_revert']            = 'पुनर्स्थापन';
+$lang['btn_register']          = 'नोंदणी';
+$lang['btn_apply']             = 'लागू';
+$lang['btn_media']             = 'मिडिया व्यवस्थापक';
+$lang['loggedinas']            = 'लॉगिन नाव:';
+$lang['user']                  = 'वापरकर्ता';
+$lang['pass']                  = 'परवलीचा शब्द';
+$lang['newpass']               = 'नवीन परवलीचा शब्द';
+$lang['oldpass']               = 'सध्याचा परवलीचा शब्द नक्की करा';
+$lang['passchk']               = 'परत एकदा';
+$lang['remember']              = 'लक्षात ठेवा';
+$lang['fullname']              = 'पूर्ण नावं';
+$lang['email']                 = 'इमेल';
+$lang['profile']               = 'वापरकर्त्याची माहिती';
+$lang['badlogin']              = 'माफ़ करा, वापरकर्ता नावात किंवा परवलीच्या शब्दात चूक झाली आहे.';
+$lang['minoredit']             = 'छोटे बदल';
+$lang['draftdate']             = 'प्रत आपोआप सुरक्षित केल्याची तारीख';
+$lang['nosecedit']             = 'मध्यंतरीच्या काळात हे पृष्ठ बदलले आहे.विभागाची माहिती जुनी झाली होती. त्याऐवजी सबंध पृष्ठ परत लोड केले आहे.';
+$lang['regmissing']            = 'कृपया सर्व रकाने भरा.';
+$lang['reguexists']            = 'या नावाने सदस्याची नोंदणी झालेली आहे, कृपया दुसरे सदस्य नाव निवडा.';
+$lang['regsuccess']            = 'सदस्याची नोंदणी झाली आहे आणि परवलीचा शब्द इमेल केला आहे.';
+$lang['regsuccess2']           = 'सदस्याची नोंदणी झाली.';
+$lang['regmailfail']           = 'परवलीचा शब्दाची इमेल पाठवण्यात चूक झाली आहे, क्रुपया संचालकांशी संपर्क साधा.';
+$lang['regbadmail']            = 'तुम्ही दिलेला ईमेल बरोबर नाही असे दिसते - तुमच्या मते ही चूक असल्यास साईटच्या व्यवस्थापकाशी संपर्क साधा.';
+$lang['regbadpass']            = 'आपला परवलीचा शब्द चुकीचा आहे.';
+$lang['regpwmail']             = 'तुमचा डोक्युविकि परवली.';
+$lang['reghere']               = 'अजुन तुमचे खाते नाही ? एक उघडून टाका.';
+$lang['profna']                = 'ह्या विकी मधे प्रोफाइल बदलण्याची सुविधा नाही.';
+$lang['profnochange']          = 'काही बदल नाहित. करण्यासारखे काही नाही.';
+$lang['profnoempty']           = 'रिकामे नाव किंवा ईमेल चालत नाही.';
+$lang['profchanged']           = 'सदस्याची प्रोफाइल अद्ययावत झाली आहे.';
+$lang['pwdforget']             = 'परवलीचा शब्द विसरला आहे का? नविन मागवा.';
+$lang['resendna']              = 'ह्या विकी मधे परवलीचा शब्द परत पाथाव्न्याची सुविधा नाही.';
+$lang['resendpwd']             = 'नविन परवली इच्छुक';
+$lang['resendpwdmissing']      = 'माफ करा, पण सर्व जागा भरल्या पाहिजेत.';
+$lang['resendpwdnouser']       = 'माफ़ करा, हा सदस्य आमच्या माहितिसंग्रहात सापडला नाही.';
+$lang['resendpwdbadauth']      = 'माफ़ करा, हा अधिकार कोड बरोबर नाही. कृपया आपण पूर्ण शिकामोर्तबाची लिंक वापरल्याची खात्री करा.';
+$lang['resendpwdconfirm']      = 'शिक्कामोर्तबाची लिंक ईमेल द्वारा पाठवली आहे.';
+$lang['resendpwdsuccess']      = 'शिक्कामोर्तबाची लिंक ईमेल द्वारा पाठवली आहे.';
+$lang['license']               = 'विशिष्ठ नोंद केलि नसल्यास ह्या विकी वरील सर्व मजकूर खालील लायसन्स मधे मोडतो : ';
+$lang['licenseok']             = 'नोंद : हे पृष्ठ संपादित केल्यास तुम्ही तुमचे योगदान खालील लायसन्स अंतर्गत येइल : ';
+$lang['searchmedia']           = 'फाईल शोधा:';
+$lang['searchmedia_in']        = '%s मधे शोधा';
+$lang['txt_upload']            = 'अपलोड करण्याची फाइल निवडा:';
+$lang['txt_filename']          = 'अपलोड उर्फ़ ( वैकल्पिक ):';
+$lang['txt_overwrt']           = 'अस्तित्वात असलेल्या फाइलवरच सुरक्षित करा.';
+$lang['lockedby']              = 'सध्या लॉक करणारा :';
+$lang['lockexpire']            = 'सध्या लॉक करणारा :';
+$lang['js']['willexpire']      = 'हे पृष्ठ संपादित करण्यासाठी मिळालेले लॉक एखाद्या मिनिटात संपणार आहे.\n चुका होऊ नयेत म्हणुन कृपया प्रीव्यू बटन दाबुन लॉक ची वेळ पुन्हा चालू करा.';
+$lang['js']['notsavedyet']     = 'सुरक्षित न केलेले बदल नष्ट होतील. नक्की करू का ?';
+$lang['js']['searchmedia']     = 'फाईल्ससाठी शोधा';
+$lang['js']['keepopen']        = 'निवड केल्यावर विण्डो उघडी ठेवा';
+$lang['js']['hidedetails']     = 'सविस्तर मजकूर लपवा';
+$lang['js']['mediatitle']      = 'लिंक सेटिंग';
+$lang['js']['mediadisplay']    = 'लिंकचा प्रकार';
+$lang['js']['mediaalign']      = 'जुळवणी';
+$lang['js']['mediasize']       = 'प्रतिमेचा आकार';
+$lang['js']['mediatarget']     = 'लिंकचे लक्ष्य';
+$lang['js']['mediaclose']      = 'बंद';
+$lang['js']['mediadisplayimg'] = 'प्रतिमा दाखवा.';
+$lang['js']['mediadisplaylnk'] = 'फक्त लिंक दाखवा.';
+$lang['js']['mediasmall']      = 'लहान आवृत्ती';
+$lang['js']['mediamedium']     = 'माध्यम आवृत्ती';
+$lang['js']['medialarge']      = 'मोठी आवृत्ती';
+$lang['js']['mediaoriginal']   = 'मूळ आवृत्ती';
+$lang['js']['medialnk']        = 'सविस्तर माहितीकडेची लिंक';
+$lang['js']['mediadirect']     = 'मूळ मजकुराकडे थेट लिंक';
+$lang['js']['medianolnk']      = 'लिंक नको';
+$lang['js']['medianolink']     = 'प्रतिमा लिंक करू नका';
+$lang['js']['medialeft']       = 'प्रतिमा डाव्या बाजूला जुळवून घ्या.';
+$lang['js']['mediaright']      = 'प्रतिमा उजव्या बाजूला जुळवून घ्या.';
+$lang['js']['mediacenter']     = 'प्रतिमा मध्यभागी जुळवून घ्या.';
+$lang['js']['medianoalign']    = 'जुळवाजुळव वापरू नका.';
+$lang['js']['nosmblinks']      = 'विन्डोज़ शेअर ला लिंक केल्यास ते फक्त मायक्रोसॉफ़्ट इन्टरनेट एक्स्प्लोरर वरच चालते. तरी तुम्ही लिंक कॉपी करू शकता.';
+$lang['js']['linkwiz']         = 'लिंक जादूगार';
+$lang['js']['linkto']          = 'याला लिंक करा:';
+$lang['js']['del_confirm']     = 'निवडलेल्या गोष्टी नक्की नष्ट करू का ?';
+$lang['js']['restore_confirm'] = 'हि आवृत्ती खरोखर पुनर्स्थापित करू का?';
+$lang['js']['media_diff']      = 'फरक बघू:';
+$lang['js']['media_diff_both'] = 'बाजूबाजूला';
+$lang['js']['media_diff_portions'] = 'स्वाईप';
+$lang['js']['media_select']    = 'फाईल निवड...';
+$lang['js']['media_upload_btn'] = 'अपलोड';
+$lang['js']['media_done_btn']  = 'झालं';
+$lang['js']['media_drop']      = 'अपलोड करण्यासाठी इथे फाईल टाका';
+$lang['js']['media_cancel']    = 'काढा';
+$lang['rssfailed']             = 'ही पुरवणी आणण्यात काही चूक झाली:';
+$lang['nothingfound']          = 'काही सापडला नाही.';
+$lang['mediaselect']           = 'दृकश्राव्य फाइल';
+$lang['uploadsucc']            = 'अपलोड यशस्वी';
+$lang['uploadfail']            = 'अपलोड अयशस्वी.कदाचित चुकीच्या परवानग्या असतील ?';
+$lang['uploadwrong']           = 'अपलोड नाकारण्यात आला. हे फाइल एक्सटेंशन अवैध आहे!';
+$lang['uploadexist']           = 'फाइल आधीच अस्तित्वात आहे. काही केले नाही.';
+$lang['uploadbadcontent']      = 'अपलोड केलेली माहिती %s फाइल एक्सटेंशनशी मिळतिजुळति नाही.';
+$lang['uploadspam']            = 'अपलोड स्पॅम ब्लॅकलिस्टमुळे थोपवला आहे.';
+$lang['uploadxss']             = 'अपलोड संशयित हानिकारक मजकूर असल्याने थोपवला आहे.';
+$lang['uploadsize']            = 'अपलोड केलेली फाइल जास्तीच मोठी होती. (जास्तीत जास्त %s)';
+$lang['deletesucc']            = '%s ही फाइल नष्ट करण्यात आलेली आहे.';
+$lang['deletefail']            = '%s ही फाइल नष्ट करू शकलो नाही - कृपया परवानग्या तपासा.';
+$lang['mediainuse']            = '%s ही फाइल नष्ट केली नाही - ती अजुन वापरात आहे.';
+$lang['namespaces']            = 'नेमस्पेस';
+$lang['mediafiles']            = 'मध्ये उपलब्ध असलेल्या फाइल';
+$lang['accessdenied']          = 'तुम्हाला हे पान बघायची परवानगी नाही.';
+$lang['mediausage']            = 'ह्या फाइलचा संदर्भ देण्यासाठी खालील सिन्टॅक्स वापरा :';
+$lang['mediaview']             = 'मूळ फाइल बघू ';
+$lang['mediaroot']             = 'रूट';
+$lang['mediaupload']           = 'सध्याच्या नेमस्पेसमधे इथेच फाइल अपलोड करा. उप-नेमस्पेस बनवण्यासाठि त्याचे नाव तुमच्या "अपलोड उर्फ़" मधे दिलेल्या फाइल नावाच्या आधी विसर्गचिन्हाने वेगळे करून ते वापरा.';
+$lang['mediaextchange']        = 'फाइलचे एक्सटेंशन .%s चे बदलून  .%s केले आहे.';
+$lang['reference']             = 'च्या साठी संदर्भ';
+$lang['ref_inuse']             = 'फाइल नष्ट केली जाऊ शकत नाही. ती अजुन खालील पृष्ठे वापरत आहेत :';
+$lang['ref_hidden']            = 'काही संदर्भ तुम्हाला वाचण्याची परवानगी नसलेल्या पृष्ठावर आहेत';
+$lang['hits']                  = 'हिट्स';
+$lang['quickhits']             = 'जुळणारि पाने';
+$lang['toc']                   = 'अनुक्रमणिका';
+$lang['current']               = 'चालू';
+$lang['yours']                 = 'तुमची आवृत्ति';
+$lang['diff']                  = 'सध्याच्या आवृत्तिंशी फरक दाखवा';
+$lang['diff2']                 = 'निवडलेल्या आवृत्तिंमधील फरक दाखवा';
+$lang['difflink']              = 'ह्या तुलना दृष्टीकोनाला लिंक करा';
+$lang['diff_type']             = 'फरक बघू:';
+$lang['diff_inline']           = 'एका ओळीत';
+$lang['diff_side']             = 'बाजूबाजूला';
+$lang['line']                  = 'ओळ';
+$lang['breadcrumb']            = 'मागमूस:';
+$lang['youarehere']            = 'तुम्ही इथे आहात:';
+$lang['lastmod']               = 'सर्वात शेवटचा बदल:';
+$lang['by']                    = 'द्वारा';
+$lang['deleted']               = 'काढून टाकले';
+$lang['created']               = 'निर्माण केले';
+$lang['external_edit']         = 'बाहेरून संपादित';
+$lang['summary']               = 'सारांश बदला';
+$lang['noflash']               = 'ही माहिती दाखवण्यासाठी <a href="http://www.adobe.com/products/flashplayer/">अडोब फ्लॅश प्लेअर</a> ची गरज आहे.';
+$lang['download']              = 'तुकडा डाउनलोड करा';
+$lang['tools']                 = 'साधने';
+$lang['user_tools']            = 'युजरची साधने';
+$lang['site_tools']            = 'साईटची साधने';
+$lang['page_tools']            = 'पानाची साधने';
+$lang['skip_to_content']       = 'सरळ मजकुराकडे ';
+$lang['mail_newpage']          = 'पृष्ठ जोडले : ';
+$lang['mail_changed']          = 'पृष्ठ बदलले : ';
+$lang['mail_subscribe_list']   = 'ह्या नेमस्पेस नाढे बदललेली पाने:';
+$lang['mail_new_user']         = 'नवीन सदस्य : ';
+$lang['mail_upload']           = 'फाइल अपलोड केली : ';
+$lang['changes_type']          = 'ह्याचे बदल बघू';
+$lang['pages_changes']         = 'पाने';
+$lang['media_changes']         = 'मिडिया फाईल';
+$lang['both_changes']          = 'पाने आणि मिडिया फाईल दोन्ही';
+$lang['qb_bold']               = 'ठळक मजकूर';
+$lang['qb_italic']             = 'तिरका मजकूर';
+$lang['qb_underl']             = 'अधोरेखित मजकूर';
+$lang['qb_code']               = 'कोड मजकूर';
+$lang['qb_strike']             = 'रद्द मजकूर';
+$lang['qb_h1']                 = 'पहिल्या पातळीचे शीर्षक';
+$lang['qb_h2']                 = 'दुसर्या पातळीचे शीर्षक';
+$lang['qb_h3']                 = 'तिसर्या पातळीचे शीर्षक';
+$lang['qb_h4']                 = 'चवथ्या पातळीचे शीर्षक';
+$lang['qb_h5']                 = 'पाचव्या पातळीचे शीर्षक';
+$lang['qb_h']                  = 'शीर्षक';
+$lang['qb_hs']                 = 'शीर्षक निवड';
+$lang['qb_hplus']              = 'उंच शीर्षक';
+$lang['qb_hminus']             = 'खालचं शीर्षक';
+$lang['qb_hequal']             = 'समान लेवलचे शीर्षक';
+$lang['qb_link']               = 'अंतर्गत लिंक';
+$lang['qb_extlink']            = 'बाह्य लिंक';
+$lang['qb_hr']                 = 'आडवी पट्टी';
+$lang['qb_ol']                 = 'अनुक्रमित यादीतील वस्तु';
+$lang['qb_ul']                 = 'साध्या यादीतील वस्तु';
+$lang['qb_media']              = 'प्रतिमा आणि इतर फाइल टाका';
+$lang['qb_sig']                = 'स्वाक्षरी टाका';
+$lang['qb_smileys']            = 'स्माइली';
+$lang['qb_chars']              = 'ख़ास चिन्ह';
+$lang['upperns']               = 'ह्यावरच्या नेमस्पेसकडे उडी मारा';
+$lang['metaedit']              = 'मेटाडेटा बदला';
+$lang['metasaveerr']           = 'मेटाडेटा सुरक्षित झाला नाही';
+$lang['metasaveok']            = 'मेटाडेटा सुरक्षित झाला';
+$lang['btn_img_backto']            = 'परत जा %s';
+$lang['img_title']             = 'नाव:';
+$lang['img_caption']           = 'टीप:';
+$lang['img_date']              = 'तारीख:';
+$lang['img_fname']             = 'फाइल नाव:';
+$lang['img_fsize']             = 'साइझ:';
+$lang['img_artist']            = 'फोटोग्राफर:';
+$lang['img_copyr']             = 'कॉपीराइट:';
+$lang['img_format']            = 'प्रकार:';
+$lang['img_camera']            = 'कॅमेरा:';
+$lang['img_keywords']          = 'मुख्य शब्द:';
+$lang['img_width']             = 'रुंदी:';
+$lang['img_height']            = 'उंची:';
+$lang['btn_mediaManager']           = 'मिडिया व्यवस्थापकात बघू';
+$lang['authtempfail']          = 'सदस्य अधिकृत करण्याची सुविधा सध्या चालू नाही. सतत हा मजकूर दिसल्यास कृपया तुमच्या विकीच्या व्यवस्थापकाशी सम्पर्क साधा.';
+$lang['i_chooselang']          = 'तुमची भाषा निवडा';
+$lang['i_installer']           = 'डॉक्युविकि इनस्टॉलर';
+$lang['i_wikiname']            = 'विकी नाम';
+$lang['i_enableacl']           = 'ACL चालू करा ( अधिक चांगले )';
+$lang['i_superuser']           = 'सुपर-सदस्य';
+$lang['i_problems']            = 'इनस्टॉलरला काही अडचणि आल्या आहेत. त्या ठीक केल्याशिवाय तुम्ही पुढे जाऊ शकत नाही.';
+$lang['i_modified']            = 'सुरक्षिततेच्या कारणासठि ही स्क्रिप्ट फ़क्त नवीन आणि बदललेल्या डॉक्युविकि इन्स्टॉलेशन मधेच चालेल. तुम्ही एकतर डाउनलोड केलेले पॅकेज मधील फाइल परत प्रसारित करा किंवा <a href="http://dokuwiki.org/install">डॉक्युविकि इन्स्टॉलेशन विषयी सूचना</a> वाचा.';
+$lang['i_funcna']              = 'PHP  मधलं <code>%s</code> हे फंक्शन उपलब्ध नाही. बहुधा तुमच्या होस्टिंग पुरवणाराने ते काही कारणाने अनुपलब्ध केलं असावं.';
+$lang['i_phpver']              = 'तुमची PHP आवृत्ति <code>%s</code> ही आवश्यक असलेल्या <code>%s</code> ह्या आवृत्तिपेक्षा कमी आहे. कृपया तुमचे PHP इन्स्टॉलेशन अद्ययावत करा.';
+$lang['i_permfail']            = '<code>%s</code> या डिरेक्टरी मध्ये डॉक्युविकि बदल करू शकत नाही. कृपया या डिरेक्टरीच्या परवानग्या ठीक करा.';
+$lang['i_confexists']          = '<code>%s</code> आधीच अस्तित्वात आहे.';
+$lang['i_writeerr']            = '<code>%s</code> निर्माण करू शकलो नाही. तुम्हाला डिरेक्टरी / फाइल च्या परवानग्या तपासून स्वतःच ही फाइल बनवावी लागेल.';
+$lang['i_badhash']             = 'अनाकलनीय किंवा बदललेले dokuwiki.php (hash=<code>%s</code>)';
+$lang['i_badval']              = 'code>%s</code> - अवैध किंवा रिकामा मजकूर.';
+$lang['i_success']             = 'व्यवस्था लावण्याचे काम यशस्वीरीत्या पार पडले. आता तुम्ही install.php डिलीट करू शकता. <a href="doku.php?id=wiki:welcome">तुमच्या नविन डॉक्युविकि </a> वर जा.';
+$lang['i_failure']             = 'कॉन्फिगुरेशनच्या फाइल सुरक्षित करताना काही अडचणी आल्या आहेत. <a href="doku.php?id=wiki:welcome">तुमची नवीन डॉक्युविकि </a> वापरण्याआधी तुम्हाला ह्या फाइल स्वतः ठीक कराव्या लागतील.';
+$lang['i_policy']              = 'आरंभीची ACL पॉलिसी';
+$lang['i_pol0']                = 'मुक्त विकी ( सर्वांना वाचन, लेखन व अपलोड करण्याची परवानगी )';
+$lang['i_pol1']                = 'सार्वजनिक विकी ( सर्वांना वाचण्याची मुभा , लेखन व अपलोडची परवानगी फक्त नोंदणीकृत सदस्यांना )';
+$lang['i_pol2']                = 'बंदिस्त विकी ( वाचन , लेखन व अपलोडची परवानगी फक्त नोंदणीकृत सदस्यांना ) ';
+$lang['i_retry']               = 'पुन्हा प्रयत्न';
+$lang['recent_global']         = 'तुम्ही सध्या <b>%s</b> या नेमस्पेस मधील बदल पाहात आहात.तुम्ही <a href="%s">पूर्ण विकी मधले बदल </a> सुद्धा पाहू शकता.';
+$lang['email_signature_text'] = 'हा ईमेल, येथील डॉक्युविकिद्वारा आपोआप तयार केला गेला आहे
+@DOKUWIKIURL@';
diff --git a/wiki/inc/lang/mr/locked.txt b/wiki/inc/lang/mr/locked.txt
new file mode 100644
index 0000000..dae909c
--- /dev/null
+++ b/wiki/inc/lang/mr/locked.txt
@@ -0,0 +1,3 @@
+====== पान लॉक आहे ======
+
+हे पान सध्या दुसर्या सदस्याने संपादनासाठी लॉक केले आहे. तुम्हाला त्याचे संपादन करून होईपर्यंत किंवा लॉक संपेपर्यंत थांबावे लागेल.
\ No newline at end of file
diff --git a/wiki/inc/lang/mr/login.txt b/wiki/inc/lang/mr/login.txt
new file mode 100644
index 0000000..f2fef4c
--- /dev/null
+++ b/wiki/inc/lang/mr/login.txt
@@ -0,0 +1,3 @@
+====== लॉगिन ======
+
+तुम्ही सध्या लॉगिन केलेले नाही! तुमचे नाव-पासवर्ड देऊन खाली लॉगिन करा. लॉगिन करण्यासाठी तुमच्या ब्राउजरमधे कुकीज चालू असल्या पाहिजेत.
\ No newline at end of file
diff --git a/wiki/inc/lang/mr/mailtext.txt b/wiki/inc/lang/mr/mailtext.txt
new file mode 100644
index 0000000..826ab0c
--- /dev/null
+++ b/wiki/inc/lang/mr/mailtext.txt
@@ -0,0 +1,12 @@
+तुमच्या डॉक्युविकिमधील एक पान बदलले किंवा नवीन टाकले गेले आहे. त्याची माहिती पुढील प्रमाणे :
+
+दिनांक : @DATE@
+ब्राउजर : @BROWSER@
+IP-पत्ता : @IPADDRESS@
+मशिनचे नाव ( Host name ) : @HOSTNAME@
+जुनी आवृत्ती : @OLDPAGE@
+नवी आवृत्ती : @NEWPAGE@
+संपादन सारांश : @SUMMARY@
+सदस्य : @USER@
+
+@DIFF@
diff --git a/wiki/inc/lang/mr/newpage.txt b/wiki/inc/lang/mr/newpage.txt
new file mode 100644
index 0000000..00a1c6b
--- /dev/null
+++ b/wiki/inc/lang/mr/newpage.txt
@@ -0,0 +1,3 @@
+====== हा मुद्दा अजून अस्तित्त्वात नाही ======
+
+तुमची अशा एखाद्या मुद्द्याच्या लिंक वरून इथे आला आहात जो अजून अस्तित्त्वात नाही. जर तुम्हाला परवानगी असेल तर तुमची त्या मुद्द्यावर "हे पान नवीन तयार करा" हे बटण क्लिक करून स्वतः एक पान तयार करू शकता.
\ No newline at end of file
diff --git a/wiki/inc/lang/mr/norev.txt b/wiki/inc/lang/mr/norev.txt
new file mode 100644
index 0000000..180b031
--- /dev/null
+++ b/wiki/inc/lang/mr/norev.txt
@@ -0,0 +1,3 @@
+====== अशी कुठली आवृत्ती नाही ======
+
+ही आवृत्ती अस्तित्त्वात नाही. "जुन्या आवृत्त्या" बटण वापरून या दस्तावेजाच्या सर्व जुन्या आवृत्त्या तुमची पाहू शकता.
\ No newline at end of file
diff --git a/wiki/inc/lang/mr/password.txt b/wiki/inc/lang/mr/password.txt
new file mode 100644
index 0000000..a83f97e
--- /dev/null
+++ b/wiki/inc/lang/mr/password.txt
@@ -0,0 +1,6 @@
+नमस्कार @FULLNAME@!
+
+खाली तुमच्या @DOKUWIKIURL@ येथील @TITLE@ साठी सदस्य माहिती दिली आहे.
+
+लॉगिन :  @LOGIN@
+पासवर्ड : @PASSWORD@
diff --git a/wiki/inc/lang/mr/preview.txt b/wiki/inc/lang/mr/preview.txt
new file mode 100644
index 0000000..8277398
--- /dev/null
+++ b/wiki/inc/lang/mr/preview.txt
@@ -0,0 +1,3 @@
+====== झलक ======
+
+ही तुमचा मजकूर कसा दिसेल त्याची एक झलक आहे. लक्षात ठेवा : हा मजकूर अजुन **सुरक्षित केलेला नाही** !
\ No newline at end of file
diff --git a/wiki/inc/lang/mr/pwconfirm.txt b/wiki/inc/lang/mr/pwconfirm.txt
new file mode 100644
index 0000000..8c03f17
--- /dev/null
+++ b/wiki/inc/lang/mr/pwconfirm.txt
@@ -0,0 +1,8 @@
+नमस्कार @FULLNAME@!
+
+कोणीतरी तुमच्या @TITLE@ या @DOKUWIKIURL@ येथील लॉगिनसाठी नवीन पासवर्ड मागवला आहे.
+जर तुम्ही हा पासवर्ड मागवला नसेल तर कृपया ह्या ईमेलकड़े दुर्लक्ष करा.
+
+जर नक्की तुम्हीच हा पासवर्ड मागवला असेल तर खालील लिंकवर क्लिक करून ते नक्की करा.
+
+@CONFIRM@
diff --git a/wiki/inc/lang/mr/read.txt b/wiki/inc/lang/mr/read.txt
new file mode 100644
index 0000000..b834dd7
--- /dev/null
+++ b/wiki/inc/lang/mr/read.txt
@@ -0,0 +1 @@
+हे पान फक्त वाचता येऊ शकतं. तुम्ही त्याचा मूळ विकी मजकूर पाहू शकता पण तो बदलू शकत नाही. जर हे चुकीचं असेल तर तुमच्या विकी व्यवस्थापकाशी संपर्क साधा.
\ No newline at end of file
diff --git a/wiki/inc/lang/mr/recent.txt b/wiki/inc/lang/mr/recent.txt
new file mode 100644
index 0000000..9a6d6f1
--- /dev/null
+++ b/wiki/inc/lang/mr/recent.txt
@@ -0,0 +1,3 @@
+====== अलीकडील बदल ======
+
+खालील पाने हल्लीच बदलली आहेत
\ No newline at end of file
diff --git a/wiki/inc/lang/mr/register.txt b/wiki/inc/lang/mr/register.txt
new file mode 100644
index 0000000..3aca312
--- /dev/null
+++ b/wiki/inc/lang/mr/register.txt
@@ -0,0 +1,3 @@
+====== नवीन सदस्य म्हणुन नोंदणी करा ======
+
+खाली तुमची माहिती भरून या विकी वर नवीन खातं उघडा. कृपया आपण देत असलेला ईमेल चालू असल्याची खात्री करा - जर तुम्हाला इथे पासवर्ड टाकायला सांगितला नाही तयार एक नवीन पासवर्ड तुम्हाला त्या ईमेल वर पाठवला जाइल. तुमचं लॉगिन नाम एक वैध [[doku>pagename|पेजनेम]] असले पाहिजे.
\ No newline at end of file
diff --git a/wiki/inc/lang/mr/registermail.txt b/wiki/inc/lang/mr/registermail.txt
new file mode 100644
index 0000000..ed3b92b
--- /dev/null
+++ b/wiki/inc/lang/mr/registermail.txt
@@ -0,0 +1,10 @@
+एक नवीन सदस्याची नोंदणी झाली आहे. त्याची माहीत पुढीलप्रमाणे :
+
+सदस्य नाम :  @NEWUSER@
+पूर्ण नाव : @NEWNAME@
+ईमेल : @NEWEMAIL@
+
+दिनांक : @DATE@
+ब्राउजर : @BROWSER@
+IP-पत्ता : @IPADDRESS@
+होस्ट नाम : @HOSTNAME@
diff --git a/wiki/inc/lang/mr/resendpwd.txt b/wiki/inc/lang/mr/resendpwd.txt
new file mode 100644
index 0000000..64b95a4
--- /dev/null
+++ b/wiki/inc/lang/mr/resendpwd.txt
@@ -0,0 +1,3 @@
+====== नवीन पासवर्ड पाठव ======
+
+या विकिवरील तुमच्या अकाउंटसाठी नवीन पासवर्ड मिळवण्यासाठी कृपया तुमचे सदस्य नाम खालच्या फॉर्म मधे टाका. ही पासवर्डची मागणी नक्की करण्यासाठी तुम्ही नोंदणी करताना दिलेल्या ईमेल पत्त्यावर एक लिंक पाठवली जाइल.
\ No newline at end of file
diff --git a/wiki/inc/lang/mr/revisions.txt b/wiki/inc/lang/mr/revisions.txt
new file mode 100644
index 0000000..fb842c7
--- /dev/null
+++ b/wiki/inc/lang/mr/revisions.txt
@@ -0,0 +1,3 @@
+====== जुन्या आवृत्त्या ======
+
+ह्या सद्य दस्तावेजच्या जुन्या आवृत्त्या आहेत. एखाद्या जुन्या आवृत्तीवर परत जाण्यासाठी टी खालून निवडा, "हे पान संपादित करा" वर क्लिक करा आणि ते सुरक्षित करा.
\ No newline at end of file
diff --git a/wiki/inc/lang/mr/searchpage.txt b/wiki/inc/lang/mr/searchpage.txt
new file mode 100644
index 0000000..707e699
--- /dev/null
+++ b/wiki/inc/lang/mr/searchpage.txt
@@ -0,0 +1,4 @@
+====== शोध ======
+
+तुम्हाला खाली तुमच्या शोधाचे फलित दिसतील. @CREATEPAGEINFO@
+
diff --git a/wiki/inc/lang/mr/showrev.txt b/wiki/inc/lang/mr/showrev.txt
new file mode 100644
index 0000000..dc05830
--- /dev/null
+++ b/wiki/inc/lang/mr/showrev.txt
@@ -0,0 +1,2 @@
+** ही ह्या दस्तावेजची जुनी आवृत्ती आहे. **
+----
\ No newline at end of file
diff --git a/wiki/inc/lang/mr/stopwords.txt b/wiki/inc/lang/mr/stopwords.txt
new file mode 100644
index 0000000..2b413a9
--- /dev/null
+++ b/wiki/inc/lang/mr/stopwords.txt
@@ -0,0 +1,39 @@
+# ही अशा शब्दांची यादी आहे जी अनुक्रमक (इंडेक्सर) दुर्लक्षित करतो, जर एक ओळित एक शब्द आला तरच.
+# ही यादी बदलल्यास केवळ यूनिक्स पद्धतीची लाइन एंडिंग वापरा. तीन अक्षरापेक्षा लहान शब्द टाकण्याची
+# गरज नाही - ते आपोआपच दुर्लक्षित केले जातात. ही यादी http://www.ranks.nl/stopwords/ येथील यादीवर
+# आधारित आहे.
+about
+are
+as
+an
+and
+you
+your
+them
+their
+com
+for
+from
+into
+if
+in
+is
+it
+how
+of
+on
+or
+that
+the
+this
+to
+was
+what
+when
+where
+who
+will
+with
+und
+the
+www
\ No newline at end of file
diff --git a/wiki/inc/lang/mr/updateprofile.txt b/wiki/inc/lang/mr/updateprofile.txt
new file mode 100644
index 0000000..c08810f
--- /dev/null
+++ b/wiki/inc/lang/mr/updateprofile.txt
@@ -0,0 +1,3 @@
+====== तुमची सदस्य माहिती अद्ययावत करा ======
+
+फ़क्त तुम्हाला बदल करायचा असेल तेच रकाने परत भरा. तुमची तुमचे सदस्य नाम बदलू शकत नाही.
\ No newline at end of file
diff --git a/wiki/inc/lang/mr/uploadmail.txt b/wiki/inc/lang/mr/uploadmail.txt
new file mode 100644
index 0000000..1aea97c
--- /dev/null
+++ b/wiki/inc/lang/mr/uploadmail.txt
@@ -0,0 +1,10 @@
+एक फाइल तुमच्या डॉक्युविकिवर अपलोड केली गेली आहे. त्याची माहिती याप्रमाणे :
+
+फाइल : @MEDIA@
+दिनांक : @DATE@
+ब्राउजर : @BROWSER@
+IP-पत्ता : @IPADDRESS@
+होस्टनाम : @HOSTNAME@
+साइज़ : @SIZE@
+MIME टाइप : @MIME@
+सदस्य : @USER@
diff --git a/wiki/inc/lang/ms/jquery.ui.datepicker.js b/wiki/inc/lang/ms/jquery.ui.datepicker.js
new file mode 100644
index 0000000..58bc4f5
--- /dev/null
+++ b/wiki/inc/lang/ms/jquery.ui.datepicker.js
@@ -0,0 +1,37 @@
+/* Malaysian initialisation for the jQuery UI date picker plugin. */
+/* Written by Mohd Nawawi Mohamad Jamili (nawawi@ronggeng.net). */
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "../widgets/datepicker" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery.datepicker );
+	}
+}( function( datepicker ) {
+
+datepicker.regional.ms = {
+	closeText: "Tutup",
+	prevText: "&#x3C;Sebelum",
+	nextText: "Selepas&#x3E;",
+	currentText: "hari ini",
+	monthNames: [ "Januari","Februari","Mac","April","Mei","Jun",
+	"Julai","Ogos","September","Oktober","November","Disember" ],
+	monthNamesShort: [ "Jan","Feb","Mac","Apr","Mei","Jun",
+	"Jul","Ogo","Sep","Okt","Nov","Dis" ],
+	dayNames: [ "Ahad","Isnin","Selasa","Rabu","Khamis","Jumaat","Sabtu" ],
+	dayNamesShort: [ "Aha","Isn","Sel","Rab","kha","Jum","Sab" ],
+	dayNamesMin: [ "Ah","Is","Se","Ra","Kh","Ju","Sa" ],
+	weekHeader: "Mg",
+	dateFormat: "dd/mm/yy",
+	firstDay: 0,
+	isRTL: false,
+	showMonthAfterYear: false,
+	yearSuffix: "" };
+datepicker.setDefaults( datepicker.regional.ms );
+
+return datepicker.regional.ms;
+
+} ) );
diff --git a/wiki/inc/lang/ms/lang.php b/wiki/inc/lang/ms/lang.php
new file mode 100644
index 0000000..14cb94e
--- /dev/null
+++ b/wiki/inc/lang/ms/lang.php
@@ -0,0 +1,95 @@
+<?php
+/**
+ * ms language file
+ *
+ * This file was initially built by fetching translations from other
+ * Wiki projects. See the @url lines below. Additional translations
+ * and fixes where done for DokuWiki by the people mentioned in the
+ * lines starting with @author
+ *
+ * @url http://svn.wikimedia.org/viewvc/mediawiki/trunk/phase3/languages/messages/MessagesMs.php?view=co
+ * @author Markos
+ */
+$lang['encoding']              = 'utf-8';
+$lang['direction']             = 'ltr';
+$lang['apostrophe']            = '\'';
+$lang['btn_edit']              = 'Sunting halaman ini';
+$lang['btn_source']            = 'Lihat sumber';
+$lang['btn_show']              = 'Baca';
+$lang['btn_create']            = 'Cipta halaman';
+$lang['btn_search']            = 'Cari';
+$lang['btn_save']              = 'Simpan';
+$lang['btn_preview']           = 'Pratonton';
+$lang['btn_top']               = 'Balik ke mula';
+$lang['btn_newer']             = '<< lebih kini';
+$lang['btn_older']             = 'lebih awal >>';
+$lang['btn_revs']              = 'Sejarah';
+$lang['btn_recent']            = 'Perubahan Terkini';
+$lang['btn_upload']            = 'Unggah (upload)';
+$lang['btn_cancel']            = 'Batal';
+$lang['btn_secedit']           = 'Sunting';
+$lang['btn_login']             = 'Masuk';
+$lang['btn_logout']            = 'Keluar';
+$lang['btn_admin']             = 'Admin';
+$lang['btn_update']            = 'Kemaskini';
+$lang['btn_delete']            = 'Hapus';
+$lang['btn_back']              = 'Balik';
+$lang['btn_backlink']          = 'Pautan ke halaman ini';
+$lang['btn_subscribe']         = 'Pantau';
+$lang['btn_profile']           = 'Kemaskinikan profil';
+$lang['btn_reset']             = 'Batalkan suntingan';
+$lang['btn_resendpwd']         = 'Emel kata laluan baru';
+$lang['btn_draft']             = 'Sunting draf';
+$lang['btn_recover']           = 'Pulihkan draf';
+$lang['btn_draftdel']          = 'Hapuskan draf';
+$lang['btn_revert']            = 'Pulihkan';
+$lang['btn_register']          = 'Daftaran';
+$lang['btn_apply']             = 'Simpan';
+$lang['btn_media']             = 'Manager media';
+$lang['loggedinas']            = 'Log masuk sebagai:';
+$lang['user']                  = 'Nama pengguna';
+$lang['pass']                  = 'Kata laluan';
+$lang['newpass']               = 'Kata laluan baru';
+$lang['oldpass']               = 'Kata laluan lama';
+$lang['passchk']               = 'sekali lagi';
+$lang['remember']              = 'Sentiasa ingati kata laluan saya.';
+$lang['fullname']              = 'Nama sebenar';
+$lang['email']                 = 'E-mel';
+$lang['profile']               = 'Profil pengguna';
+$lang['badlogin']              = 'Maaf, ralat log masuk. Nama pengguna atau kata laluan salah.';
+$lang['minoredit']             = 'Suntingan Kecil';
+$lang['draftdate']             = 'Draf automatik disimpan pada';
+$lang['nosecedit']             = 'Halaman ini telah bertukar pada waktu sementara dan info bahagian ini telah luput. Seluruh halaman telah disarat.';
+$lang['regmissing']            = 'Maaf, semua medan mesti diisi';
+$lang['reguexists']            = 'Maaf, nama pengguna yang dimasukkan telah diguna. Sila pilih nama yang lain.';
+$lang['regsuccess']            = 'Akaun pengguna telah dicipta dan kata laluan telah dikirim kepada e-mel anda.';
+$lang['regsuccess2']           = 'Akaun pegguna telah dicipta.';
+$lang['regbadmail']            = 'Format alamat e-mel tidak sah. Sila masukkan semula ataupun kosongkan sahaja medan tersebut.';
+$lang['regbadpass']            = 'Kedua-dua kata laluan tidak sama. Sila masukkan semula.';
+$lang['regpwmail']             = 'Kata laluan Dokuwiki anda';
+$lang['reghere']               = 'Belum mendaftar akaun? Dapat akaun baru';
+$lang['profna']                = 'Wiki ini tidak menyokong modifikasi profil';
+$lang['profnoempty']           = 'Medan nama pengguna atau e-mel yang kosong tidak dibenarkan.';
+$lang['profchanged']           = 'Profil pengguna telah dikemaskini.';
+$lang['pwdforget']             = 'Terlupa kata laluan? Dapatkan yang baru';
+$lang['resendpwd']             = 'Kirimkan kata laluan baru untuk';
+$lang['resendpwdmissing']      = 'Maaf, semua medan perlu diisi.';
+$lang['resendpwdnouser']       = 'Maaf, nama pengguna ini tidak dapat dicari dalam database kami.';
+$lang['resendpwdbadauth']      = 'Maaf, kod authorasi ini tidak sah. Semak bahawa anda telah menggunakan seluruh pautan pengesahan yang dikirim.';
+$lang['resendpwdconfirm']      = 'Pautan pengesahan telah dikirimkan ke e-mel anda.';
+$lang['resendpwdsuccess']      = 'Kata laluan baru telah dikirimkan ke e-mel anda.';
+$lang['license']               = 'Selain daripada yang dinyata, isi wiki ini disediakan dengan lesen berikut:';
+$lang['licenseok']             = 'Perhatian: Dengan menyunting halaman ini, anda setuju untuk isi-isi anda dilesen menggunakan lesen berikut:';
+$lang['searchmedia']           = 'Cari nama fail:';
+$lang['searchmedia_in']        = 'Cari di %s';
+$lang['txt_upload']            = 'Pilih fail untuk diunggah:';
+$lang['txt_filename']          = 'Unggah fail dengan nama (tidak wajib):';
+$lang['txt_overwrt']           = 'Timpa fail sekarang';
+$lang['lockedby']              = 'Halaman ini telah di:';
+$lang['uploadsucc']            = 'Pemuatan naik berjaya';
+$lang['uploadfail']            = 'Ralat muat naik';
+$lang['uploadxss']             = 'Fail ini mengandungi kod HTML atau kod skrip yang mungkin boleh disalah tafsir oleh pelayar web.';
+$lang['toc']                   = 'Jadual Kandungan';
+$lang['current']               = 'kini';
+$lang['restored']              = 'Telah dikembalikan ke semakan sebelumnya (%s)';
+$lang['summary']               = 'Paparan';
diff --git a/wiki/inc/lang/ne/admin.txt b/wiki/inc/lang/ne/admin.txt
new file mode 100644
index 0000000..7a829db
--- /dev/null
+++ b/wiki/inc/lang/ne/admin.txt
@@ -0,0 +1,2 @@
+====== व्यवस्थापन ======
+तल तपाईले  DokuWikiमा  उपलव्ध व्यवस्थापकिय कार्यहरुको सुची पाउन सक्नुहुन्छ ।
\ No newline at end of file
diff --git a/wiki/inc/lang/ne/adminplugins.txt b/wiki/inc/lang/ne/adminplugins.txt
new file mode 100644
index 0000000..93eff63
--- /dev/null
+++ b/wiki/inc/lang/ne/adminplugins.txt
@@ -0,0 +1 @@
+===== थप प्लगिनहरू =====
\ No newline at end of file
diff --git a/wiki/inc/lang/ne/backlinks.txt b/wiki/inc/lang/ne/backlinks.txt
new file mode 100644
index 0000000..51b9573
--- /dev/null
+++ b/wiki/inc/lang/ne/backlinks.txt
@@ -0,0 +1,2 @@
+====== पछाडि लिङ्क ======
+यो पृष्ठहरुको सुचीहरुले पछाडि लिङ्क स्वयंलाई नै गरेको छ।
\ No newline at end of file
diff --git a/wiki/inc/lang/ne/conflict.txt b/wiki/inc/lang/ne/conflict.txt
new file mode 100644
index 0000000..457e108
--- /dev/null
+++ b/wiki/inc/lang/ne/conflict.txt
@@ -0,0 +1,5 @@
+====== नयाँ संस्करण उपलब्ध छ ======
+
+तपाईले सम्पादन गर्नुभएको पाठको नयाँ सस्करण उपलब्ध छ। तपाईले सम्पादन गरिरहनु भएको समयमा अर्को प्रयोगकर्ताले यो पाठ परिवर्तन गरेकोले यस्तो भएको हो ।
+
+दुबैका फरक दाज्नुहोस् र दुईमा कुन राख्नेहो  निश्चित गर्नुहोस् ।तपाईले "वचत गर्नुहोस् " छान्नु भयो भने तपाईको संस्करण वचत हुनेछ। "रद्द गर्नुहोस्" छान्नु भयो भने अहिलेको संस्करण वचत हुनेछ । 
\ No newline at end of file
diff --git a/wiki/inc/lang/ne/denied.txt b/wiki/inc/lang/ne/denied.txt
new file mode 100644
index 0000000..5c58cde
--- /dev/null
+++ b/wiki/inc/lang/ne/denied.txt
@@ -0,0 +1,4 @@
+====== अनुमति अमान्य ======
+
+माफ गर्नुहोला तपाईलाई अगाडि बढ्न अनुमति छैन।
+
diff --git a/wiki/inc/lang/ne/diff.txt b/wiki/inc/lang/ne/diff.txt
new file mode 100644
index 0000000..76d75fb
--- /dev/null
+++ b/wiki/inc/lang/ne/diff.txt
@@ -0,0 +1,3 @@
+====== भिन्नताहरु ======
+
+यसले यो पृष्ठको  छानिएको संस्करण र हालको संकरण बीच भिन्नताहरु देखाउँछ ।
\ No newline at end of file
diff --git a/wiki/inc/lang/ne/draft.txt b/wiki/inc/lang/ne/draft.txt
new file mode 100644
index 0000000..88630c9
--- /dev/null
+++ b/wiki/inc/lang/ne/draft.txt
@@ -0,0 +1,5 @@
+====== ड्राफ्ट फाइल भेटियो ======
+
+तपाईको यो पृष्ठको गत सम्पादन सफलतापूर्वक सम्पन्न भएको थिएन ।DokuWiki ले स्वचालितरुपमा ड्राफ्ट वचतगरेको छ त्यस देखि तपाईले आफ्नो सम्पादन कार्यमा निरन्तरता दिन सक्नुहुन्छ। तल तपाईले गत सत्रमा बचत गरिएको सामग्री देख्न सक्नुहुन्छ ।
+
+कृपया निर्णय दिनुहोस्  कि तपाई गत सत्रमा बचत गरिएको सत्रको सम्पादनकार्य  //recover// , //delete// वा  //cancel//  के गर्न चाहनुहुन्छ भनेर।
diff --git a/wiki/inc/lang/ne/edit.txt b/wiki/inc/lang/ne/edit.txt
new file mode 100644
index 0000000..be498a6
--- /dev/null
+++ b/wiki/inc/lang/ne/edit.txt
@@ -0,0 +1 @@
+पृष्ठ सम्पादन गर्नुहोस र "बचत" मा थिच्नुहोस् । सिन्टेक्सको लागि  [[wiki:syntax]] हेर्नुहोस् । यो पृष्ठलाई **सुधार्न** सक्नुहुन्छ भने मात्र सम्पादन गर्नुहोस् ।यदि कुनै प्रयोग गर्न या , जान्न चाहनुहुन्छ भने [[playground:playground|playground]] को प्रयोग गर्नुहोस् ।
\ No newline at end of file
diff --git a/wiki/inc/lang/ne/editrev.txt b/wiki/inc/lang/ne/editrev.txt
new file mode 100644
index 0000000..0db67c2
--- /dev/null
+++ b/wiki/inc/lang/ne/editrev.txt
@@ -0,0 +1,2 @@
+** तपाईले यस कागजातको पुरानो संस्करण खोल्नु भएको छ ।** यदि यसलाई वचत गर्नुभयो भने यसैसामग्रीबाट नयाँ संस्करणको निर्माण हुनेछ ।
+----
\ No newline at end of file
diff --git a/wiki/inc/lang/ne/index.txt b/wiki/inc/lang/ne/index.txt
new file mode 100644
index 0000000..cb06f03
--- /dev/null
+++ b/wiki/inc/lang/ne/index.txt
@@ -0,0 +1,3 @@
+====== सुची ======
+
+यो सबै उपलाब्ध पृष्ठहरुको [[doku>namespaces|namespaces]] का आधारमा मिलाइएको सुची हो ।
\ No newline at end of file
diff --git a/wiki/inc/lang/ne/lang.php b/wiki/inc/lang/ne/lang.php
new file mode 100644
index 0000000..c0daf29
--- /dev/null
+++ b/wiki/inc/lang/ne/lang.php
@@ -0,0 +1,204 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Saroj Kumar Dhakal <lotusnagarkot@gmail.com>
+ * @author Saroj Kumar Dhakal <lotusnagarkot@yahoo.com>
+ * @author सरोज ढकाल <lotusnagarkot@gmail.com>
+ */
+$lang['encoding']              = 'utf-8';
+$lang['direction']             = 'ltr';
+$lang['doublequoteopening']    = '“';
+$lang['doublequoteclosing']    = '”';
+$lang['singlequoteopening']    = '‘';
+$lang['singlequoteclosing']    = '’';
+$lang['apostrophe']            = '’';
+$lang['btn_edit']              = 'यो पृष्ठ सम्पादन गर्नुहोस् ';
+$lang['btn_source']            = 'यो पृष्ठको स्रोत देखाउनुहोस् ';
+$lang['btn_show']              = 'पृष्ठ देखाउनुहोस् ';
+$lang['btn_create']            = 'यो पृष्ठ निर्माण गर्नुहोस्';
+$lang['btn_search']            = 'खोज्नुहोस् ';
+$lang['btn_save']              = 'वचत गर्नुहोस्';
+$lang['btn_preview']           = 'पूर्वरुप ';
+$lang['btn_top']               = 'माथि फर्कनुहोस्';
+$lang['btn_newer']             = '<< यो भन्दा पछिको';
+$lang['btn_older']             = 'यो भन्दा पहिलेको >>';
+$lang['btn_revs']              = 'पुरानो संकरण';
+$lang['btn_recent']            = 'हालैका परिवर्तनहरु ';
+$lang['btn_upload']            = 'अपलोड ';
+$lang['btn_cancel']            = 'रद्द गर्नुहोस् ';
+$lang['btn_index']             = 'सुची';
+$lang['btn_secedit']           = 'सम्पादन गर्नुहोस्';
+$lang['btn_login']             = 'प्रवेश गर्नुहोस् ';
+$lang['btn_logout']            = 'बाहिर जानुहोस् ';
+$lang['btn_admin']             = 'एड्मिन(व्यवस्थापक)';
+$lang['btn_update']            = 'अध्यावधिक गर्नुहोस्';
+$lang['btn_delete']            = 'मेटाउनुहोस् ';
+$lang['btn_back']              = 'पछाडि';
+$lang['btn_backlink']          = 'पछाडिका लिङ्कहरु ';
+$lang['btn_subscribe']         = 'पृष्ठ परिवर्तन ग्राह्य गर्नुहोस्';
+$lang['btn_profile']           = 'प्रोफाइल अध्यावधिक गर्नुहोस् ';
+$lang['btn_reset']             = 'पूर्वरुपमा फर्काउनुहोस';
+$lang['btn_resendpwd']         = 'नयाँ पासवर्ड राख्नुहोस';
+$lang['btn_draft']             = ' ड्राफ्ट सम्पादन गर्नुहोस् ';
+$lang['btn_recover']           = 'पहिलेको ड्राफ्ट हासिल गर्नुहोस ';
+$lang['btn_draftdel']          = ' ड्राफ्ट मेटाउनुहोस् ';
+$lang['btn_revert']            = 'पूर्वरूपमा फर्काउने';
+$lang['btn_register']          = 'दर्ता  गर्नुहोस्';
+$lang['btn_apply']             = 'लागु गर्ने';
+$lang['btn_media']             = 'मेडिया व्यवस्थापक';
+$lang['btn_deleteuser']        = 'खाता हटाउने';
+$lang['btn_img_backto']        = 'फिर्ता%s';
+$lang['btn_mediaManager']      = 'मेडिया व्यवस्थापकमा हेर्ने';
+$lang['loggedinas']            = 'प्रवेश गर्नुहोस् :';
+$lang['user']                  = 'प्रयोगकर्ता ';
+$lang['pass']                  = 'प्रवेशशव्द';
+$lang['newpass']               = 'नयाँ प्रवेशशव्द';
+$lang['oldpass']               = 'नयाँ प्रवेशशव्द निश्चित गर्नुहोस ';
+$lang['passchk']               = 'एकपटक पुन:';
+$lang['remember']              = 'मलाई सम्झनु';
+$lang['fullname']              = 'पूरा नाम';
+$lang['email']                 = 'इमेल';
+$lang['profile']               = 'प्रयोगकर्ताको प्रोफाइल';
+$lang['badlogin']              = 'माफ गर्नुहोस् , प्रयोगकर्तानाम वा प्रवेशशव्द गलत भयो  ';
+$lang['badpassconfirm']        = 'माफ गर्नुहोस् , पासवर्ड गलत छ ';
+$lang['minoredit']             = 'सामान्य परिवर्तन';
+$lang['draftdate']             = 'ड्राफ्ट स्वचालित रुपमा वचत भएको';
+$lang['nosecedit']             = 'यो पृष्ठ यसै बखतमा परिवर्तन भयो, खण्ड जानकारी अध्यावधिक हुन सकेन र पूरै पृष्ठ लोड भयो । ';
+$lang['regmissing']            = 'माफ गर्नुहोला , सबै ठाउमा भर्नुपर्नेछ ।';
+$lang['reguexists']            = 'यो नामको प्रयोगकर्ता पहिले देखि रहेको छ।';
+$lang['regsuccess']            = 'यो प्रयोगकर्ता बनाइएको छ र प्रवेशशव्द इमेलमा पठइएको छ।';
+$lang['regsuccess2']           = 'यो प्रयोगकर्ता बनाइएको छ ।';
+$lang['regmailfail']           = 'इमेलबाट प्रवेशशब्द पठउन गल्ति भयो । कृपया एड्मिन(व्यवस्थापक)लाई सम्पर्क गर्नुहोस्  !';
+$lang['regbadmail']            = 'दिएको इमेल ठेगाना गलत भए जस्तो देखिन्छ - यदि यो सहि हो भने एड्मिन(व्यवस्थापक)लाई सम्पर्क गर्नुहोस्  !';
+$lang['regbadpass']            = 'दिइएका  प्रवेशशव्दहरु मिल्दैनन् , पुन: प्रयास गर्नुहोस् ।';
+$lang['regpwmail']             = 'तपाईको DokuWiki प्रवेशशब्द ';
+$lang['reghere']               = 'तपाईको आफ्नै खाता छैन ? अहिल्यै एउटा बनाउनुहोस् ';
+$lang['profna']                = 'यो विकिले यो प्रोफाइल परिवर्तन समर्थन गर्दैन ।';
+$lang['profnochange']          = 'केहि  परिवर्तन छैन , केहि गर्नु छैन ।';
+$lang['profnoempty']           = 'खाली नाम वा इमेल ठेगानालाई अनुमति छैन ।';
+$lang['profchanged']           = 'प्रयोगकर्ताको प्रफाइल सफलरुपमा परिवर्तन भयो ।';
+$lang['profnodelete']          = 'यो विकिले प्रयोगकर्ताहरू हटाउन समर्थन गर्दैन';
+$lang['profdeleteuser']        = 'खाता मेट्नुहोस';
+$lang['pwdforget']             = 'आफ्नो पासवर्ड भुल्नु भयो ? नयाँ हासिल गर्नुहोस् ';
+$lang['resendna']              = 'यो विकिबाट प्रवेशशव्द पठाउन समर्थित छैन ।';
+$lang['resendpwd']             = 'नयाँ  प्रवेशशव्द पठाउनुहोस् ';
+$lang['resendpwdnouser']       = 'माफ गर्नुहोस्,  हाम्रो डेटावेसमा यो प्रयोगकर्ता भेटिएन ।';
+$lang['resendpwdbadauth']      = 'माफ गर्नुहोस् , यो अनुमति चिन्ह गलत छ। तपाईले पूरै जानकारी लिङ्क प्रयोग गर्नु पर्नेछ। ';
+$lang['resendpwdconfirm']      = 'तपाईको इमेलमा कन्फरमेशन लिङ्क पठाइएको छ। ';
+$lang['resendpwdsuccess']      = 'तपाईको प्रवेशशव्द इमेलबाट पठाइएको छ। ';
+$lang['license']               = 'खुलाइएको बाहेक, यस विकिका विषयवस्तुहरु निम्त प्रमाण द्वारा प्रमाणिक गरिएको छ।';
+$lang['licenseok']             = 'नोट: यस पृष्ठ सम्पादन गरी तपाईले आफ्नो विषयवस्तु तलको प्रमाण पत्र अन्तर्गत प्रमाणिक गर्न राजी हुनु हुनेछ ।';
+$lang['txt_upload']            = 'अपलोड गर्नलाई फाइल छा्न्नुहो्स्:';
+$lang['txt_filename']          = 'अर्को रुपमा अपलोड गर्नुहोस् (ऐच्छिक):';
+$lang['txt_overwrt']           = 'रहेको उहि नामको फाइललाई मेटाउने';
+$lang['lockedby']              = 'अहिले ताल्चा लगाइएको:';
+$lang['lockexpire']            = 'ताल्चा अवधि सकिने :';
+$lang['js']['willexpire']      = 'तपाईलले यो पृष्ठ सम्पादन गर्न लगाउनु भएको ताल्चाको अवधि एक मिनेट भित्र सकिदै छ। \n द्वन्द हुन नदिन  पूर्वरुप वा ताल्चा समय परिवर्तन गर्नुहोस् ।';
+$lang['js']['notsavedyet']     = 'तपाईले वचन गर्नु नभएको परिवर्रन हराउने छ। \n साच्चै जारी गर्नुहुन्छ ।';
+$lang['js']['keepopen']        = 'छनौटमा विन्डो खुला राख्नुहोस् ';
+$lang['js']['hidedetails']     = 'जानकारी लुकाउनु होस् ';
+$lang['js']['mediaclose']      = 'बन्द गर्ने';
+$lang['js']['nosmblinks']      = 'विन्डोहरु लिङ्क गर्दा माइक्रो सफ्ट एक्सप्लोररमामात्र  काम साझा हुन्छ । तर कपि गर्न र टास्न मिल्छ।   ';
+$lang['js']['del_confirm']     = 'साच्चै छानिएका वस्तुहरु मेट्ने हो ?';
+$lang['rssfailed']             = 'यो फिड लिइ आउदा गल्ति भयो ।';
+$lang['nothingfound']          = 'केहि पनि भेटिएन ।';
+$lang['mediaselect']           = 'मिडिया फाइलहरू ';
+$lang['uploadsucc']            = 'अपलोड सफल ';
+$lang['uploadfail']            = 'अपलोड असफल । सायद गलत अनुमति । ';
+$lang['uploadwrong']           = 'अपलोड असमर्थित । फाइल एक्सटेन्सन अमान्य।  ';
+$lang['uploadexist']           = 'फाइल पहिलेदेखि छ। केहि गरिएन ।';
+$lang['uploadbadcontent']      = 'अपलोड गरिएको वस्तु %s फाइल एक्टेन्सन अनुसार मिलेन ।';
+$lang['uploadspam']            = 'अपलोड स्प्याम कालो सुचीले रोकिएको छ। ';
+$lang['uploadxss']             = 'अपलोड सम्भवत: हानिकारक वस्तुको कारणले रोकिएको। ';
+$lang['deletesucc']            = 'फाइल  "%s"  मेटिएको छ। ';
+$lang['deletefail']            = '"%s"  मेट्न सकिएन - अनुमति हेर्नुहोस् ।';
+$lang['mediainuse']            = 'फाइल "%s" मेटिएको छैन - प्रयोगमा छ।';
+$lang['namespaces']            = 'नेमस्पेसहरु ';
+$lang['mediafiles']            = ' उपलब्ध फाइलहरु ';
+$lang['mediausage']            = 'फाइललाई रेफरेन्स गर्न निम्न सुत्र प्रयोग गर्नुहोस् :';
+$lang['mediaview']             = 'सक्कली फाइल हेर्नुहोस् ';
+$lang['mediaroot']             = 'रुट(मूख्य प्रयोगकर्ता)';
+$lang['mediaupload']           = 'अहिलेको नेमस्पेसमा यहा अपलोड गर्नुहोस् । सबनेमस्पेसहरु बनाउन "रुपमा आपलोड" छानी फाइलहरुलाई कोलोन(:) ले छुट्टयाउनुहोस् ।';
+$lang['mediaextchange']        = 'फाइल एकस्टेन्सन .%s देखि  .%s मा परिवरतित भयो ';
+$lang['reference']             = 'रेफररेन्स ';
+$lang['ref_inuse']             = 'फाइल मेट्न मिलेन , किनभने यो निम्न पृष्ठहरुद्वारा प्रयोगमा छ। ';
+$lang['ref_hidden']            = 'केहि रेफरेन्स यस्ता पृष्ठहरुमा छन् जुन हेर्न तपाईलाई अनुमति छैन ।';
+$lang['hits']                  = 'मिलेको';
+$lang['quickhits']             = 'मिलेका पृष्ठनामहरु ';
+$lang['toc']                   = 'वस्तुहरुको सुची';
+$lang['current']               = 'हालको';
+$lang['yours']                 = 'तपाईको संस्करण';
+$lang['diff']                  = 'हालको संस्करण सँगको भिन्नता';
+$lang['diff2']                 = 'रोजिएका संस्करण वीचका भिन्नताहरु ';
+$lang['line']                  = 'हरफ';
+$lang['breadcrumb']            = 'छुट्ट्याउनुहोस् :';
+$lang['youarehere']            = 'तपाई यहा हुनुहुन्छ:';
+$lang['lastmod']               = 'अन्तिम पटक सच्याइएको:';
+$lang['by']                    = 'द्वारा ';
+$lang['deleted']               = 'हटाइएको';
+$lang['created']               = 'निर्माण गरिएको';
+$lang['external_edit']         = 'बाह्य सम्पादन';
+$lang['summary']               = 'सम्पादनको बारेमा';
+$lang['mail_newpage']          = 'थपिएको पृष्ठ';
+$lang['mail_changed']          = 'परिवर्तित पृष्ठ';
+$lang['mail_new_user']         = 'नयाँ प्रयोगकर्ता ';
+$lang['mail_upload']           = 'अपलोड गरिएको फाइल';
+$lang['qb_bold']               = 'मोटो पाठ(बोल्ड)';
+$lang['qb_italic']             = 'इटालिक पाठ';
+$lang['qb_underl']             = 'निम्न रेखांकित(अन्डरलाइन) पाठ';
+$lang['qb_code']               = 'चिन्ह(कोड) पाठ';
+$lang['qb_strike']             = 'स्ट्राइकथ्रु पाठ';
+$lang['qb_h1']                 = 'पहिलो स्तरको शिर्षक(लेभल १ हेडलाइन)';
+$lang['qb_h2']                 = 'दोस्रो स्तरको  शिर्षक(लेभल २ हेडलाइन)';
+$lang['qb_h3']                 = 'तेस्रो स्तरको  शिर्षक(लेभल ३ हेडलाइन)';
+$lang['qb_h4']                 = 'चौथो स्तरको  शिर्षक(लेभल ४ हेडलाइन)';
+$lang['qb_h5']                 = 'पाचौँ स्तरको  शिर्षक(लेभल ५ हेडलाइन)';
+$lang['qb_link']               = 'आन्तरिक लिङ्क ';
+$lang['qb_extlink']            = 'वाह्य लिङ्क';
+$lang['qb_hr']                 = 'क्षितिज (होरिजोन्टल) रुल';
+$lang['qb_ol']                 = 'मिलाइएको सुची';
+$lang['qb_ul']                 = 'नमिलाइएको सुची';
+$lang['qb_media']              = 'तस्विर र अरु फाइलहरु थप्नुहोस्';
+$lang['qb_sig']                = 'हस्ताक्षर थप्नुहोस् ';
+$lang['qb_smileys']            = 'स्माइलीहरु ';
+$lang['qb_chars']              = 'विशेष वर्णहरु ';
+$lang['metaedit']              = 'मेटाडेटा सम्पादन गर्नुहोस्';
+$lang['metasaveerr']           = 'मेटाडाटा लेखन असफल';
+$lang['metasaveok']            = 'मेटाडाटा वचत भयो ';
+$lang['img_title']             = 'शिर्षक:';
+$lang['img_caption']           = 'निम्न लेख:';
+$lang['img_date']              = 'मिति:';
+$lang['img_fname']             = 'फाइलनाम:';
+$lang['img_fsize']             = 'आकार:';
+$lang['img_artist']            = 'चित्रकार:';
+$lang['img_copyr']             = 'सर्वाधिकार:';
+$lang['img_format']            = 'ढाचा:';
+$lang['img_camera']            = 'क्यामेरा:';
+$lang['img_keywords']          = 'खोज शब्द:';
+$lang['authtempfail']          = 'प्रयोगकर्ता प्रामाणिकरण अस्थाइरुपमा अनुपलब्ध छ। यदि यो समस्या रहि रहेमा तपाईको  विकि एड्मिनलाई खवर गर्नुहोला ।';
+$lang['i_chooselang']          = 'भाषा छान्नुहोस् ';
+$lang['i_installer']           = 'DokuWiki  स्थापक';
+$lang['i_wikiname']            = 'विकी नाम';
+$lang['i_enableacl']           = 'ACL लागु गर्नुहोस्( सिफारिस गरिएको)';
+$lang['i_superuser']           = 'मूख्य प्रयोगकर्ता';
+$lang['i_problems']            = 'स्थापकले तल देखाइएको त्रुटि फेला पार्‌यो ।तपाईले  यो त्रुटि नसच्याए सम्म अगि बढ्न सक्नुहुने छैन।';
+$lang['i_modified']            = 'सुरक्षाको कारणले यो स्क्रिप्ट नया तथा नसच्याइएको Dokuwiki स्थापनामा  मात्र काम गर्छ।  तपाईले कि डाउनलोड गर्नुभएको प्याकेज पुन: खोल्नुहोस्  कि <a href="http://dokuwiki.org/install">Dokuwiki स्थापना विधि</a>';
+$lang['i_funcna']              = 'PHP function <code>%s</code> उपलव्ध छैन । हुनसक्छ तपाईको होस्टिङ्ग प्रदायकले कुनै कारण वश यसलाई वन्द गरिदिएका हुनसक्छन् । ';
+$lang['i_phpver']              = 'तपाईको PHP संस्करण <code>%s</code> चाहिएको <code>%s</code> भन्दा कम छ। तपाईले आफ्नो PHP स्थापना अध्यावधिक गर्नुपर्छ ।';
+$lang['i_permfail']            = '<code>%s</code> DokuWiki द्वारा लेख्य छैन । तपाईले डाइरेक्टरीको अनुमति परिवर्तन गर्नुपर्छ !';
+$lang['i_confexists']          = '<code>%s</code> पहिले देखि नै रहेको छ।';
+$lang['i_writeerr']            = '<code>%s</code> बनाउन असमर्थ । तपाईले डाइरेक्टरी / फाइल अनुमति जाच्नु पर्छ र फाइल आफैले बनाउनु पर्छ ।';
+$lang['i_badhash']             = 'पहिचान हुन नसकेको वा परिवर्तित  okuwiki.php (hash=code>%s</code>)';
+$lang['i_badval']              = '<code>%s</code> - अवैध वा रित्तो मान ';
+$lang['i_success']             = 'स्थापना सफलरुपमा समाप्त भयो ।तपाई install.php मेट्न सक्नुहु्न्छ । <a href="doku.php?id=wiki:welcome">तपाईको नयाँ DokuWiki</a> निरन्तर गर्न सक्नुहुन्छ ।';
+$lang['i_failure']             = 'स्थापना समयमा केहि त्रुटि फेला पर्यो ।तपाईले आफैले यसलाई <a href="doku.php?id=wiki:welcome">तपाईको नयाँ DokuWiki</a> प्रयोग गर्नु अगि	सच्याउनुपर्ने  हुन्छ ।';
+$lang['i_policy']              = 'सुरुको ACL निति';
+$lang['i_pol0']                = 'खुल्ला विकि (पठन, लेखन , अपलोड ) सबैका लागि';
+$lang['i_pol1']                = 'Public विकि (पठन सवैका लागि,लेखन र अपलोड दर्ता गरिएका प्रयपगकर्ताका लागि ) ';
+$lang['i_pol2']                = 'बन्द विकि (पठन , लेखन, अपलोड ) दर्ता भएका प्रयोगकर्ताका लागि मात्र ।';
+$lang['i_retry']               = 'पुन: प्रयास गर्नुहोस् ';
+$lang['recent_global']         = 'तपाई अहिले <b>%s</b> नेमस्पेस भित्र भएका परिवर्तन हेर्दैहुनुहुन्छ। तपाई <a href="%s">पुरै विकिमा भएको परिवर्तन हेर्न सक्नुहुन्छ</a>.';
+$lang['email_signature_text'] = 'यो पत्र DokuWiki ले, मा तयार पारेको हो ।
+@DOKUWIKIURL@';
diff --git a/wiki/inc/lang/ne/locked.txt b/wiki/inc/lang/ne/locked.txt
new file mode 100644
index 0000000..85f5390
--- /dev/null
+++ b/wiki/inc/lang/ne/locked.txt
@@ -0,0 +1,3 @@
+====== पृष्ठमा ताला लगाएको छ ======
+
+यो पृष्ठ अर्को प्रयोगकर्ताद्वारा सम्पादनका लागि ताला लगाइएको छ । तपाईले सम्पादन समाप्त नहुन्जेल या तालाको समय समाप्त नहुन्जेल सम्म प्रतिक्षागर्नु पर्छ ।
\ No newline at end of file
diff --git a/wiki/inc/lang/ne/norev.txt b/wiki/inc/lang/ne/norev.txt
new file mode 100644
index 0000000..28c4efb
--- /dev/null
+++ b/wiki/inc/lang/ne/norev.txt
@@ -0,0 +1,2 @@
+====== कुनै त्यस्तो पुन:संस्करण भेटिएन ======
+खुलाइएको पुन:संस्करण अस्तित्वमा छैन ।यस कागजातको सम्पूर्ण संस्करणको  सुचीको लागि  "पुरानो पुन:संस्करण" बटन प्रयोग  गर्नुहोस् ।
\ No newline at end of file
diff --git a/wiki/inc/lang/ne/pwconfirm.txt b/wiki/inc/lang/ne/pwconfirm.txt
new file mode 100644
index 0000000..0552cc5
--- /dev/null
+++ b/wiki/inc/lang/ne/pwconfirm.txt
@@ -0,0 +1,9 @@
+नमस्कार @FULLNAME@!
+
+कसैद्वारा तपाईको @TITLE@ को लागि नयाँ प्रवेशशब्द माग भएको छ ।@DOKUWIKIURL@मा प्रवेश  ।
+
+यदि तपाईले नयाँ प्रवेशशब्दको माग गर्नुभएको हैन भने यस इमेललाई वेवास्ता गर्न सक्नुहुन्छ ।
+
+कृपया तपाईको माग साच्चै पठाइएको थियो भन्ने   यकिन गराउनाको लागि तलाको लिङ्कमा प्रयोग गर्नुहोस्  ।
+
+@CONFIRM@
diff --git a/wiki/inc/lang/ne/read.txt b/wiki/inc/lang/ne/read.txt
new file mode 100644
index 0000000..e004cd3
--- /dev/null
+++ b/wiki/inc/lang/ne/read.txt
@@ -0,0 +1 @@
+यो पृष्ठ पढ्नको लागि मात्र हो । तपाई स्रोतहेर्न सक्नुहुन्छ ,तर सम्पादन भने गर्न सक्नुहुन्न । तपाईको व्यवस्थापक(administrator) सँग के समस्या छ भनेर सोध्नु होला ।
\ No newline at end of file
diff --git a/wiki/inc/lang/ne/recent.txt b/wiki/inc/lang/ne/recent.txt
new file mode 100644
index 0000000..239903f
--- /dev/null
+++ b/wiki/inc/lang/ne/recent.txt
@@ -0,0 +1,2 @@
+====== हालैको परिवर्तन ======
+निम्न पृष्ठहरु हालै परिवर्तन गरिएका छन् ।
\ No newline at end of file
diff --git a/wiki/inc/lang/ne/resendpwd.txt b/wiki/inc/lang/ne/resendpwd.txt
new file mode 100644
index 0000000..aec9dfb
--- /dev/null
+++ b/wiki/inc/lang/ne/resendpwd.txt
@@ -0,0 +1,3 @@
+====== नयाँ प्रवेशशब्द पठाउनुहोस् ======
+
+कृपया तपाईको यस विकीमा रहेको खाताको लाहि नयाँ प्रवेशशव्द अनुरोध गर्न तपाईँको नाम निम्न फर्ममा प्रविष्ट गर्नुहोस । एउटा किटानी लिङ्क तपाईले दर्ता गर्नु भएको इमेल ठेगानामा पठाइने छ ।  
\ No newline at end of file
diff --git a/wiki/inc/lang/ne/searchpage.txt b/wiki/inc/lang/ne/searchpage.txt
new file mode 100644
index 0000000..02219e7
--- /dev/null
+++ b/wiki/inc/lang/ne/searchpage.txt
@@ -0,0 +1,4 @@
+====== खोज ======
+
+तपाईले आफ्नो खोजको निम्न नतिजा  पाउन सक्नुहुन्छ। @CREATEPAGEINFO@
+
diff --git a/wiki/inc/lang/ne/showrev.txt b/wiki/inc/lang/ne/showrev.txt
new file mode 100644
index 0000000..5b22e97
--- /dev/null
+++ b/wiki/inc/lang/ne/showrev.txt
@@ -0,0 +1,2 @@
+** यो कागजातको पुरानो पुन:संस्करण हो !**
+---
\ No newline at end of file
diff --git a/wiki/inc/lang/ne/updateprofile.txt b/wiki/inc/lang/ne/updateprofile.txt
new file mode 100644
index 0000000..e3027e4
--- /dev/null
+++ b/wiki/inc/lang/ne/updateprofile.txt
@@ -0,0 +1,3 @@
+‌‌‍‍‍======तपाईँको खाताको जानकारी अद्यावधिक गर्नुहोस्======
+
+तपाईँले आफूले परिवर्तन गर्न चाहेको फिल्ड मात्र परिवर्तन गरे पुग्छ । तपाईँले आफ्नो प्रयोगकर्ता नाम परिवर्तन गर्न पाउनुहुने छैन ।
diff --git a/wiki/inc/lang/ne/uploadmail.txt b/wiki/inc/lang/ne/uploadmail.txt
new file mode 100644
index 0000000..a023797
--- /dev/null
+++ b/wiki/inc/lang/ne/uploadmail.txt
@@ -0,0 +1,9 @@
+एउटा फाइल तपाईको DokuWiki मा भरण गरिएको छ। थप जानकारी निम्न रहेका छन् :
+फाइल : @MEDIA@
+मिति : @DATE@
+ब्राउजर : @BROWSER@
+आइपि ठगाना  : @IPADDRESS@
+होस्टनाम : @HOSTNAME@
+आकार : @SIZE@
+MIME प्रकार : @MIME@
+प्रयोगकर्ता : @USER@
diff --git a/wiki/inc/lang/nl/admin.txt b/wiki/inc/lang/nl/admin.txt
new file mode 100644
index 0000000..7138456
--- /dev/null
+++ b/wiki/inc/lang/nl/admin.txt
@@ -0,0 +1,3 @@
+====== Beheer ======
+
+Hieronder zie je een lijst van beheertaken beschikbaar in DokuWiki.
diff --git a/wiki/inc/lang/nl/adminplugins.txt b/wiki/inc/lang/nl/adminplugins.txt
new file mode 100644
index 0000000..f006f92
--- /dev/null
+++ b/wiki/inc/lang/nl/adminplugins.txt
@@ -0,0 +1 @@
+===== Toegevoegde plugins =====
\ No newline at end of file
diff --git a/wiki/inc/lang/nl/backlinks.txt b/wiki/inc/lang/nl/backlinks.txt
new file mode 100644
index 0000000..6edbf40
--- /dev/null
+++ b/wiki/inc/lang/nl/backlinks.txt
@@ -0,0 +1,4 @@
+====== Backlinks ======
+
+Dit is een lijst van pagina's die terug lijken te wijzen naar de huidige pagina.
+
diff --git a/wiki/inc/lang/nl/conflict.txt b/wiki/inc/lang/nl/conflict.txt
new file mode 100644
index 0000000..49a06b0
--- /dev/null
+++ b/wiki/inc/lang/nl/conflict.txt
@@ -0,0 +1,5 @@
+====== Er bestaat een nieuwere versie ======
+
+Er bestaat een nieuwere versie van het document dat aangepast wordt. Dit komt voor als een andere gebruiker dit document tegelijk met jou wijzigt.
+
+Bekijk de verschillen die beneden weergegeven worden uitvoerig, en beslis dan welke versie de beste is en dus bewaard moet worden. Kies ''opslaan'' om de eigen versie te bewaren. Kies ''annuleren'' om de huidige versie te bewaren.
diff --git a/wiki/inc/lang/nl/denied.txt b/wiki/inc/lang/nl/denied.txt
new file mode 100644
index 0000000..a172dda
--- /dev/null
+++ b/wiki/inc/lang/nl/denied.txt
@@ -0,0 +1,4 @@
+====== Toegang geweigerd ======
+
+Sorry: je hebt niet voldoende rechten om verder te gaan.
+
diff --git a/wiki/inc/lang/nl/diff.txt b/wiki/inc/lang/nl/diff.txt
new file mode 100644
index 0000000..ef5a1b1
--- /dev/null
+++ b/wiki/inc/lang/nl/diff.txt
@@ -0,0 +1,3 @@
+====== Verschillen ======
+
+Dit geeft de verschillen weer tussen de geselecteerde revisie en de huidige revisie van de pagina.
diff --git a/wiki/inc/lang/nl/draft.txt b/wiki/inc/lang/nl/draft.txt
new file mode 100644
index 0000000..a6bf527
--- /dev/null
+++ b/wiki/inc/lang/nl/draft.txt
@@ -0,0 +1,5 @@
+===== Conceptbestand gevonden =====
+
+Je laatste bewerking op deze pagina is niet volledig afgerond. DokuWiki heeft automatisch een concept van je werk opgeslagen waarmee je nu verder kunt gaan. Hieronder tref je het concept aan.
+
+Beslis of je het concept wilt //herstellen//, //verwijderen// of het bewerken wilt //annuleren//.
diff --git a/wiki/inc/lang/nl/edit.txt b/wiki/inc/lang/nl/edit.txt
new file mode 100644
index 0000000..4a441bf
--- /dev/null
+++ b/wiki/inc/lang/nl/edit.txt
@@ -0,0 +1 @@
+Pas de pagina aan en klik op ''Opslaan''. Zie [[wiki:syntax]] voor de Wiki-syntax. Pas  de pagina alleen aan als hij **verbeterd** kan worden. Als je iets wilt uitproberen kun je spelen in de  [[playground:playground|speeltuin]].
diff --git a/wiki/inc/lang/nl/editrev.txt b/wiki/inc/lang/nl/editrev.txt
new file mode 100644
index 0000000..1b2d130
--- /dev/null
+++ b/wiki/inc/lang/nl/editrev.txt
@@ -0,0 +1,2 @@
+**Er is een oude revisie van het document geladen!** Als je nu opslaat bewaar je een nieuwe versie met deze inhoud.
+----
diff --git a/wiki/inc/lang/nl/index.txt b/wiki/inc/lang/nl/index.txt
new file mode 100644
index 0000000..ad7122b
--- /dev/null
+++ b/wiki/inc/lang/nl/index.txt
@@ -0,0 +1,4 @@
+====== Index ======
+
+Dit is een index van alle beschikbare pagina's gesorteerd op [[doku>namespaces|namespaces]].
+
diff --git a/wiki/inc/lang/nl/install.html b/wiki/inc/lang/nl/install.html
new file mode 100644
index 0000000..a653258
--- /dev/null
+++ b/wiki/inc/lang/nl/install.html
@@ -0,0 +1,14 @@
+<p>Deze pagina helpt u bij de eerste installatie en configuratie van <a href="http://dokuwiki.org">Dokuwiki</a>.
+Meer informatie over deze installer is beschikbaar op zijn eigen <a href="http://dokuwiki.org/installer">documentatiepagina</a>.</p>
+
+<p>DokuWiki gebruikt platte tekstbestanden voor het opslaan van wikipagina's en andere informatie die bij deze pagina's horen (bijvoorbeeld plaatjes, zoek-indexen, oude revisies enz.). Om goed te kunnen functioneren, <strong>moet</strong>
+DokuWiki schrijftoegang hebben tot de directories die deze bestanden bevatten.
+De installer kan zelf deze toegangspermissies niet regelen. Dit moet normaal gesproken direct in de command shell worden ingevoerd, of in het geval van hosting via FTP of via uw hosting control panel (bijvoorbeeld cPanel).</p>
+
+<p>Deze installer zal uw DokuWiki configureren voor <abbr title="access control list">ACL</abbr>,
+wat de beheerder in staat stelt in te loggen en toegang te verkrijgen tot het beheersdeel van de DokuWiki voor het installeren van plugins, beheren van gebruikers, toegangsrechten tot wiki pagina's en veranderen van configuratie-instellingen.
+Het is niet noodzakelijk voor DokuWiki om te functioneren maar het maakt het een stuk makkelijker om Dokuwiki te beheren.</p>
+
+<p>Ervaren gebruikers of gebruikers die een aangepaste configuratie nodig hebben kunnen voor details terecht op de volgende pagina's:
+<a href="http://dokuwiki.org/install">installatie-instructies</a>
+en <a href="http://dokuwiki.org/config">configuratie-instellingen</a>.</p>
diff --git a/wiki/inc/lang/nl/jquery.ui.datepicker.js b/wiki/inc/lang/nl/jquery.ui.datepicker.js
new file mode 100644
index 0000000..7fcbff1
--- /dev/null
+++ b/wiki/inc/lang/nl/jquery.ui.datepicker.js
@@ -0,0 +1,37 @@
+/* Dutch (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Mathias Bynens <http://mathiasbynens.be/> */
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "../widgets/datepicker" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery.datepicker );
+	}
+}( function( datepicker ) {
+
+datepicker.regional.nl = {
+	closeText: "Sluiten",
+	prevText: "←",
+	nextText: "→",
+	currentText: "Vandaag",
+	monthNames: [ "januari", "februari", "maart", "april", "mei", "juni",
+	"juli", "augustus", "september", "oktober", "november", "december" ],
+	monthNamesShort: [ "jan", "feb", "mrt", "apr", "mei", "jun",
+	"jul", "aug", "sep", "okt", "nov", "dec" ],
+	dayNames: [ "zondag", "maandag", "dinsdag", "woensdag", "donderdag", "vrijdag", "zaterdag" ],
+	dayNamesShort: [ "zon", "maa", "din", "woe", "don", "vri", "zat" ],
+	dayNamesMin: [ "zo", "ma", "di", "wo", "do", "vr", "za" ],
+	weekHeader: "Wk",
+	dateFormat: "dd-mm-yy",
+	firstDay: 1,
+	isRTL: false,
+	showMonthAfterYear: false,
+	yearSuffix: "" };
+datepicker.setDefaults( datepicker.regional.nl );
+
+return datepicker.regional.nl;
+
+} ) );
diff --git a/wiki/inc/lang/nl/lang.php b/wiki/inc/lang/nl/lang.php
new file mode 100644
index 0000000..fe3c879
--- /dev/null
+++ b/wiki/inc/lang/nl/lang.php
@@ -0,0 +1,381 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Harriet Neitz <harrietneitz@gmail.com>
+ * @author mark prins <mprins@users.sf.net>
+ * @author François Kooman <fkooman.tuxed.net>
+ * @author Jack van Klaren <dokuwiki@afentoe.xs4all.nl>
+ * @author Riny Heijdendael <riny@heijdendael.nl>
+ * @author Koen Huybrechts <huybkoen@gmail.com>
+ * @author Wouter Schoot <wouter@schoot.org>
+ * @author John de Graaff <john@de-graaff.net>
+ * @author Dion Nicolaas <dion@nicolaas.net>
+ * @author Danny Rotsaert <danny.rotsaert@edpnet.be>
+ * @author Matthias Carchon <webmaster@c-mattic.be>
+ * @author Marijn Hofstra <hofstra.m@gmail.com>
+ * @author Timon Van Overveldt <timonvo@gmail.com>
+ * @author Jeroen
+ * @author Ricardo Guijt <ricardoguijt@gmail.com>
+ * @author Gerrit <klapinklapin@gmail.com>
+ * @author Remon <no@email.local>
+ * @author gicalle <gicalle@hotmail.com>
+ * @author Rene <wllywlnt@yahoo.com>
+ * @author Johan Vervloet <johan.vervloet@gmail.com>
+ * @author Mijndert <mijndert@mijndertstuij.nl>
+ * @author Johan Wijnker <johan@wijnker.eu>
+ * @author Hugo Smet <hugo.smet@scarlet.be>
+ * @author Wesley de Weerd <wesleytiel@gmail.com>
+ * @author Sjoerd <sjoerd@sjomar.eu>
+ * @author Joachim David <joa_david@hotmail.com>
+ * @author stafmans <dokuwiki@stafmans.net>
+ */
+$lang['encoding']              = 'utf-8';
+$lang['direction']             = 'ltr';
+$lang['doublequoteopening']    = '“';
+$lang['doublequoteclosing']    = '”';
+$lang['singlequoteopening']    = '‘';
+$lang['singlequoteclosing']    = '’';
+$lang['apostrophe']            = '’';
+$lang['btn_edit']              = 'Pagina aanpassen';
+$lang['btn_source']            = 'Toon bronpagina';
+$lang['btn_show']              = 'Toon pagina';
+$lang['btn_create']            = 'Maak deze pagina aan';
+$lang['btn_search']            = 'Zoeken';
+$lang['btn_save']              = 'Opslaan';
+$lang['btn_preview']           = 'Voorbeeld';
+$lang['btn_top']               = 'Terug naar boven';
+$lang['btn_newer']             = '<< nieuwer';
+$lang['btn_older']             = 'ouder >>';
+$lang['btn_revs']              = 'Oude revisies';
+$lang['btn_recent']            = 'Recente aanpassingen';
+$lang['btn_upload']            = 'Uploaden';
+$lang['btn_cancel']            = 'Annuleren';
+$lang['btn_index']             = 'Index';
+$lang['btn_secedit']           = 'Aanpassen';
+$lang['btn_login']             = 'Inloggen';
+$lang['btn_logout']            = 'Uitloggen';
+$lang['btn_admin']             = 'Beheer';
+$lang['btn_update']            = 'Bijwerken';
+$lang['btn_delete']            = 'Verwijder';
+$lang['btn_back']              = 'Terug';
+$lang['btn_backlink']          = 'Referenties';
+$lang['btn_subscribe']         = 'Inschrijven wijzigingen';
+$lang['btn_profile']           = 'Profiel aanpassen';
+$lang['btn_reset']             = 'Wissen';
+$lang['btn_resendpwd']         = 'Nieuw wachtwoord bepalen';
+$lang['btn_draft']             = 'Bewerk concept';
+$lang['btn_recover']           = 'Herstel concept';
+$lang['btn_draftdel']          = 'Verwijder concept';
+$lang['btn_revert']            = 'Herstellen';
+$lang['btn_register']          = 'Registreren';
+$lang['btn_apply']             = 'Toepassen';
+$lang['btn_media']             = 'Mediabeheerder';
+$lang['btn_deleteuser']        = 'Verwijder mijn account';
+$lang['btn_img_backto']        = 'Terug naar %s';
+$lang['btn_mediaManager']      = 'In mediabeheerder bekijken';
+$lang['loggedinas']            = 'Ingelogd als:';
+$lang['user']                  = 'Gebruikersnaam';
+$lang['pass']                  = 'Wachtwoord';
+$lang['newpass']               = 'Nieuw wachtwoord';
+$lang['oldpass']               = 'Bevestig huidig wachtwoord';
+$lang['passchk']               = 'nogmaals';
+$lang['remember']              = 'Bewaar';
+$lang['fullname']              = 'Volledige naam';
+$lang['email']                 = 'E-mail';
+$lang['profile']               = 'Gebruikersprofiel';
+$lang['badlogin']              = 'Sorry, gebruikersnaam of wachtwoord onjuist';
+$lang['badpassconfirm']        = 'Sorry, het wachtwoord was onjuist';
+$lang['minoredit']             = 'Kleine wijziging';
+$lang['draftdate']             = 'Concept automatisch opgeslagen op';
+$lang['nosecedit']             = 'De pagina is tussentijds veranderd, sectie-informatie was verouderd, volledige pagina geladen.';
+$lang['searchcreatepage']      = 'Als je niet hebt gevonden wat je zocht, kun je de pagina %s, vernoemd naar je query, aanmaken of bewerken.';
+$lang['search_fullresults']    = 'Fulltext resultaten';
+$lang['js']['search_toggle_tools'] = 'Schakel zoek gereedschappen aan/uit';
+$lang['js']['willexpire']      = 'Je exclusieve gebruiksrecht voor het aanpassen van deze pagina verloopt over een minuut.\nKlik op de Voorbeeld-knop om het exclusieve gebruiksrecht te verlengen.';
+$lang['js']['notsavedyet']     = 'Nog niet bewaarde wijzigingen zullen verloren gaan.
+Weet je zeker dat je wilt doorgaan?';
+$lang['js']['searchmedia']     = 'Zoek naar bestanden';
+$lang['js']['keepopen']        = 'Houd scherm open bij selectie';
+$lang['js']['hidedetails']     = 'Verberg details';
+$lang['js']['mediatitle']      = 'Linkinstellingen';
+$lang['js']['mediadisplay']    = 'Linktype';
+$lang['js']['mediaalign']      = 'Uitlijning';
+$lang['js']['mediasize']       = 'Afbeeldingsomvang';
+$lang['js']['mediatarget']     = 'Linkdoel';
+$lang['js']['mediaclose']      = 'Sluiten';
+$lang['js']['mediainsert']     = 'Invoegen';
+$lang['js']['mediadisplayimg'] = 'De afbeelding weergeven';
+$lang['js']['mediadisplaylnk'] = 'Alleen de link weergeven';
+$lang['js']['mediasmall']      = 'Kleine versie';
+$lang['js']['mediamedium']     = 'Middelgrote versie';
+$lang['js']['medialarge']      = 'Grote versie';
+$lang['js']['mediaoriginal']   = 'Originele versie';
+$lang['js']['medialnk']        = 'Link naar detailpagina';
+$lang['js']['mediadirect']     = 'Directe link naar origineel';
+$lang['js']['medianolnk']      = 'Geen link';
+$lang['js']['medianolink']     = 'Link niet naar de afbeelding';
+$lang['js']['medialeft']       = 'Afbeelding links uitlijnen';
+$lang['js']['mediaright']      = 'Afbeelding rechts uitlijnen';
+$lang['js']['mediacenter']     = 'Afbeelding centreren';
+$lang['js']['medianoalign']    = 'Geen uitlijning gebruiken';
+$lang['js']['nosmblinks']      = 'Linken naar Windows shares werkt alleen in Microsoft Internet Explorer.
+Je kan de link wel kopiëren en plakken.';
+$lang['js']['linkwiz']         = 'Linkwizard';
+$lang['js']['linkto']          = 'Link naar:';
+$lang['js']['del_confirm']     = 'Item(s) verwijderen?';
+$lang['js']['restore_confirm'] = 'Werkelijk deze versie terugzetten?';
+$lang['js']['media_diff']      = 'Verschillen bekijken:';
+$lang['js']['media_diff_both'] = 'Naast elkaar';
+$lang['js']['media_diff_opacity'] = 'Doorschijnend';
+$lang['js']['media_diff_portions'] = 'Swipe';
+$lang['js']['media_select']    = 'Selecteer bestanden';
+$lang['js']['media_upload_btn'] = 'Uploaden';
+$lang['js']['media_done_btn']  = 'Klaar';
+$lang['js']['media_drop']      = 'Sleep bestanden hierheen om ze te uploaden';
+$lang['js']['media_cancel']    = 'Verwijderen';
+$lang['js']['media_overwrt']   = 'Bestaande bestanden overschrijven';
+$lang['search_exact_match']    = 'Exacte overeenkomst';
+$lang['search_starts_with']    = 'Begint met';
+$lang['search_ends_with']      = 'Eindigt op';
+$lang['search_contains']       = 'Bevat';
+$lang['search_custom_match']   = 'Maatwerk';
+$lang['search_any_ns']         = '(Iedere) Willekeurige namespace';
+$lang['search_any_time']       = 'Wanneer dan ook';
+$lang['search_past_7_days']    = 'Vorige week';
+$lang['search_past_month']     = 'Vorige maand';
+$lang['search_past_year']      = 'Vorig jaar';
+$lang['search_sort_by_hits']   = 'Sorteer op hits';
+$lang['search_sort_by_mtime']  = 'Sorteer op laatst gewijzigd';
+$lang['regmissing']            = 'Vul alle velden in';
+$lang['reguexists']            = 'Er bestaat al een gebruiker met deze loginnaam.';
+$lang['regsuccess']            = 'De gebruiker is aangemaakt. Het wachtwoord is per e-mail verzonden.';
+$lang['regsuccess2']           = 'De gebruiker is aangemaakt.';
+$lang['regfail']               = 'Gebruiker kon niet aangemaakt worden.';
+$lang['regmailfail']           = 'Het lijkt erop dat het sturen van de wachtwoordmail mislukt is. Neem contact op met de beheerder!';
+$lang['regbadmail']            = 'Het opgegeven e-mailadres lijkt ongeldig - als je denkt dat dit niet klopt neem dan contact op met de beheerder.';
+$lang['regbadpass']            = 'De twee ingevoerde wachtwoorden zijn niet identiek. Probeer het nog eens.';
+$lang['regpwmail']             = 'Je DokuWiki wachtwoord';
+$lang['reghere']               = 'Je hebt nog geen account? Vraag er eentje aan';
+$lang['profna']                = 'Deze wiki ondersteunt geen profielwijzigingen';
+$lang['profnochange']          = 'Geen wijzigingen, niets gedaan';
+$lang['profnoempty']           = 'Een lege gebruikersnaam of e-mailadres is niet toegestaan';
+$lang['profchanged']           = 'Gebruikersprofiel succesvol aangepast';
+$lang['profnodelete']          = 'Deze wiki heeft biedt geen ondersteuning voor verwijdering van gebruikers';
+$lang['profdeleteuser']        = 'Verwijder gebruiker';
+$lang['profdeleted']           = 'Uw gebruikersaccount is verwijderd van deze wiki';
+$lang['profconfdelete']        = 'Ik wil mijn gebruikersaccount verwijderen van deze wiki. <br/> Deze actie kan niet ongedaan gemaakt worden.';
+$lang['profconfdeletemissing'] = 'Bevestigingsvinkje niet gezet';
+$lang['proffail']              = 'Gebruikersprofiel werd niet bijgewerkt.';
+$lang['pwdforget']             = 'Je wachtwoord vergeten? Vraag een nieuw wachtwoord aan';
+$lang['resendna']              = 'Deze wiki ondersteunt het verzenden van wachtwoorden niet';
+$lang['resendpwd']             = 'Nieuw wachtwoord bepalen voor';
+$lang['resendpwdmissing']      = 'Sorry, je moet alle velden invullen.';
+$lang['resendpwdnouser']       = 'Sorry, we kunnen deze gebruikersnaam niet vinden in onze database.';
+$lang['resendpwdbadauth']      = 'Sorry, deze authentiecatiecode is niet geldig. Controleer of je de volledige bevestigings-link hebt gebruikt.';
+$lang['resendpwdconfirm']      = 'Een bevestigingslink is per e-mail verzonden.';
+$lang['resendpwdsuccess']      = 'Je nieuwe wachtwoord is per e-mail verzonden.';
+$lang['license']               = 'Tenzij anders vermeld valt de inhoud van deze wiki onder de volgende licentie:';
+$lang['licenseok']             = 'Let op: Door deze pagina aan te passen geef je de inhoud vrij onder de volgende licentie:';
+$lang['searchmedia']           = 'Bestandsnaam zoeken:';
+$lang['searchmedia_in']        = 'Zoek in %s';
+$lang['txt_upload']            = 'Selecteer een bestand om te uploaden:';
+$lang['txt_filename']          = 'Vul nieuwe naam in (optioneel):';
+$lang['txt_overwrt']           = 'Overschrijf bestaand bestand';
+$lang['maxuploadsize']         = 'Max %s per bestand';
+$lang['lockedby']              = 'Momenteel in gebruik door:';
+$lang['lockexpire']            = 'Exclusief gebruiksrecht vervalt op:';
+$lang['rssfailed']             = 'Er is een fout opgetreden bij het ophalen van de feed: ';
+$lang['nothingfound']          = 'Er werd niets gevonden.';
+$lang['mediaselect']           = 'Bestandsselectie';
+$lang['uploadsucc']            = 'Upload geslaagd';
+$lang['uploadfail']            = 'Upload mislukt. Misschien verkeerde permissies?';
+$lang['uploadwrong']           = 'Upload mislukt. Deze bestandsextensie is verboden!';
+$lang['uploadexist']           = 'Bestand bestaat reeds. Er is niets gewijzigd.';
+$lang['uploadbadcontent']      = 'Het geüploade bestand heeft niet de bestandsextensie %s.';
+$lang['uploadspam']            = 'De upload is geblokkeerd door de spam blacklist.';
+$lang['uploadxss']             = 'De upload is geblokkeerd wegens mogelijk onveilige inhoud.';
+$lang['uploadsize']            = 'Het geüploade bestand is te groot. (max. %s)';
+$lang['deletesucc']            = 'Het bestand "%s" is verwijderd.';
+$lang['deletefail']            = '"%s" kan niet worden verwijderd - controleer permissies.';
+$lang['mediainuse']            = 'Het bestand "%s" is niet verwijderd - het is nog in gebruik.';
+$lang['namespaces']            = 'Namespaces';
+$lang['mediafiles']            = 'Beschikbare bestanden in';
+$lang['accessdenied']          = 'U heeft geen toegang tot deze pagina.';
+$lang['mediausage']            = 'Gebruik de volgende syntax om aan het bestand te refereren:';
+$lang['mediaview']             = 'Bekijk het orginele bestand';
+$lang['mediaroot']             = 'root';
+$lang['mediaupload']           = 'Upload een bestand naar de huidige namespace. Om een subnamespace aan te maken, laat je die voorafgaan aan de bestandsnaam bij "Upload als", gescheiden door een dubbele punt.';
+$lang['mediaextchange']        = 'Bestandsextensie veranderd van .%s naar .%s!';
+$lang['reference']             = 'Referenties voor';
+$lang['ref_inuse']             = 'Het bestand kan niet worden verwijderd omdat het nog in gebruik is op de volgende pagina\'s:';
+$lang['ref_hidden']            = 'Enkele referenties staan op pagina\'s waarvoor je geen leesrechten hebt';
+$lang['hits']                  = 'Hits';
+$lang['quickhits']             = 'Overeenkomende paginanamen';
+$lang['toc']                   = 'Inhoud';
+$lang['current']               = 'huidige';
+$lang['yours']                 = 'Jouw versie';
+$lang['diff']                  = 'Toon verschillen met huidige revisie';
+$lang['diff2']                 = 'Toon verschillen tussen geselecteerde revisies';
+$lang['difflink']              = 'Link naar deze vergelijking';
+$lang['diff_type']             = 'Bekijk verschillen:';
+$lang['diff_inline']           = 'Inline';
+$lang['diff_side']             = 'Zij aan zij';
+$lang['diffprevrev']           = 'Vorige revisie';
+$lang['diffnextrev']           = 'Volgende revisie';
+$lang['difflastrev']           = 'Laatste revisie';
+$lang['diffbothprevrev']       = 'Beide kanten vorige revisie';
+$lang['diffbothnextrev']       = 'Beide kanten volgende revisie';
+$lang['line']                  = 'Regel';
+$lang['breadcrumb']            = 'Spoor:';
+$lang['youarehere']            = 'Je bent hier:';
+$lang['lastmod']               = 'Laatst gewijzigd:';
+$lang['by']                    = 'door';
+$lang['deleted']               = 'verwijderd';
+$lang['created']               = 'aangemaakt';
+$lang['restored']              = 'oude revisie hersteld (%s)';
+$lang['external_edit']         = 'Externe bewerking';
+$lang['summary']               = 'Samenvatting wijziging';
+$lang['noflash']               = 'De <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> is vereist om de pagina te kunnen weergeven.';
+$lang['download']              = 'Download fragment';
+$lang['tools']                 = 'Hulpmiddelen';
+$lang['user_tools']            = 'Gebruikershulpmiddelen';
+$lang['site_tools']            = 'Site-hulpmiddelen';
+$lang['page_tools']            = 'Paginahulpmiddelen';
+$lang['skip_to_content']       = 'spring naar tekst';
+$lang['sidebar']               = 'Zijbalk';
+$lang['mail_newpage']          = 'pagina toegevoegd:';
+$lang['mail_changed']          = 'pagina aangepast:';
+$lang['mail_subscribe_list']   = 'Pagina\'s veranderd in namespace:';
+$lang['mail_new_user']         = 'nieuwe gebruiker:';
+$lang['mail_upload']           = 'bestand geüpload:';
+$lang['changes_type']          = 'Bekijk wijzigingen van';
+$lang['pages_changes']         = 'Pagina\'s';
+$lang['media_changes']         = 'Mediabestanden';
+$lang['both_changes']          = 'Zowel pagina\'s als mediabestanden';
+$lang['qb_bold']               = 'Vetgedrukte tekst';
+$lang['qb_italic']             = 'Cursieve tekst';
+$lang['qb_underl']             = 'Onderstreepte tekst';
+$lang['qb_code']               = 'Code tekst';
+$lang['qb_strike']             = 'Doorgestreepte tekst';
+$lang['qb_h1']                 = 'Niveau 1 kop';
+$lang['qb_h2']                 = 'Niveau 2 kop';
+$lang['qb_h3']                 = 'Niveau 3 kop';
+$lang['qb_h4']                 = 'Niveau 4 kop';
+$lang['qb_h5']                 = 'Niveau 5 kop';
+$lang['qb_h']                  = 'Koptekst';
+$lang['qb_hs']                 = 'Kies koptekst';
+$lang['qb_hplus']              = 'Hogere koptekst';
+$lang['qb_hminus']             = 'Lagere koptekst';
+$lang['qb_hequal']             = 'Koptekst op zelfde niveau';
+$lang['qb_link']               = 'Interne link';
+$lang['qb_extlink']            = 'Externe link';
+$lang['qb_hr']                 = 'Horizontale lijn';
+$lang['qb_ol']                 = 'Geordende lijst';
+$lang['qb_ul']                 = 'Ongeordende lijst';
+$lang['qb_media']              = 'Voeg plaatjes en andere bestanden toe';
+$lang['qb_sig']                = 'Handtekening invoegen';
+$lang['qb_smileys']            = 'Smileys';
+$lang['qb_chars']              = 'Speciale tekens';
+$lang['upperns']               = 'Spring naar bovenliggende namespace';
+$lang['metaedit']              = 'Metadata wijzigen';
+$lang['metasaveerr']           = 'Schrijven van metadata mislukt';
+$lang['metasaveok']            = 'Metadata bewaard';
+$lang['img_title']             = 'Titel:';
+$lang['img_caption']           = 'Bijschrift:';
+$lang['img_date']              = 'Datum:';
+$lang['img_fname']             = 'Bestandsnaam:';
+$lang['img_fsize']             = 'Grootte:';
+$lang['img_artist']            = 'Fotograaf:';
+$lang['img_copyr']             = 'Copyright:';
+$lang['img_format']            = 'Formaat:';
+$lang['img_camera']            = 'Camera:';
+$lang['img_keywords']          = 'Trefwoorden:';
+$lang['img_width']             = 'Breedte:';
+$lang['img_height']            = 'Hoogte:';
+$lang['subscr_subscribe_success'] = '%s is ingeschreven voor %s';
+$lang['subscr_subscribe_error'] = 'Fout bij inschrijven van %s voor %s';
+$lang['subscr_subscribe_noaddress'] = 'Er is geen e-mailadres gekoppeld aan uw account, u kunt daardoor niet worden ingeschreven.';
+$lang['subscr_unsubscribe_success'] = '%s is nu uitgeschreven bij %s.';
+$lang['subscr_unsubscribe_error'] = 'Fout bij uitschrijven van %s bij %s.';
+$lang['subscr_already_subscribed'] = '%s is reeds ingeschreven bij %s.';
+$lang['subscr_not_subscribed'] = '%s is niet ingeschreven bij %s.';
+$lang['subscr_m_not_subscribed'] = 'Je bent momenteel niet ingeschreven bij de huidige pagina of namespace.';
+$lang['subscr_m_new_header']   = 'Inschrijving toevoegen';
+$lang['subscr_m_current_header'] = 'Huidige inschrijvingen';
+$lang['subscr_m_unsubscribe']  = 'Uitschrijven';
+$lang['subscr_m_subscribe']    = 'Inschrijven';
+$lang['subscr_m_receive']      = 'Ontvang';
+$lang['subscr_style_every']    = 'Email bij iedere wijziging';
+$lang['subscr_style_digest']   = 'Samenvattings-email met wijzigingen per pagina (elke %.2f dagen)';
+$lang['subscr_style_list']     = 'Lijst van veranderde pagina\'s sinds laatste email (elke %.2f dagen)';
+$lang['authtempfail']          = 'Gebruikersauthenticatie is tijdelijk niet beschikbaar. Als deze situatie zich blijft voordoen, informeer dan de wikibeheerder.';
+$lang['i_chooselang']          = 'Kies je taal';
+$lang['i_installer']           = 'DokuWiki Installer';
+$lang['i_wikiname']            = 'Wikinaam';
+$lang['i_enableacl']           = 'ACLs inschakelen (aanbevolen)';
+$lang['i_superuser']           = 'Superuser';
+$lang['i_problems']            = 'De installer vond problemen, hieronder aangegeven. Verhelp deze voor je doorgaat.';
+$lang['i_modified']            = 'Uit veiligheidsoverwegingen werkt dit script alleen met nieuwe en onveranderde DokuWiki-installaties. Pak de bestanden opnieuw uit of raadpleeg de <a href="http://dokuwiki.org/install">Dokuwiki installatie-instructies</a>';
+$lang['i_funcna']              = 'PHP functie <code>%s</code> is niet beschikbaar. Wellicht heeft je hosting provider deze uitgeschakeld?';
+$lang['i_phpver']              = 'PHP-versie <code>%s</code> is lager dan de vereiste <code>%s</code>. Upgrade PHP.';
+$lang['i_mbfuncoverload']      = 'Om DokuWiki te draaien moet mbstring.func_overload uitgeschakeld zijn in php.ini.';
+$lang['i_permfail']            = '<code>%s</code> is niet schrijfbaar voor DokuWiki. Pas de permissie-instellingen van deze directory aan.';
+$lang['i_confexists']          = '<code>%s</code> bestaat reeds';
+$lang['i_writeerr']            = 'Niet mogelijk om <code>%s</code> aan te maken. Controleer de directory/bestandspermissies en maak het bestand handmatig aan.';
+$lang['i_badhash']             = 'Onbekende of aangepaste dokuwiki.php (hash=<code>%s</code>)';
+$lang['i_badval']              = '<code>%s</code> - onjuiste of lege waarde';
+$lang['i_success']             = 'De configuratie is succesvol afgerond. Je kunt nu het bestand install.php verwijderen. Ga naar <a href="doku.php?id=wiki:welcome">je nieuwe DokuWiki</a>.';
+$lang['i_failure']             = 'Fouten deden zich voor tijdens het schrijven naar de configuratiebestanden. Pas deze aan voor je gebruik kunt maken van <a href="doku.php?id=wiki:welcome">je nieuwe DokuWiki</a>.';
+$lang['i_policy']              = 'Initieel ACL-beleid';
+$lang['i_pol0']                = 'Open wiki (lezen, schrijven, uploaden voor iedereen)';
+$lang['i_pol1']                = 'Publieke wiki (lezen voor iedereen, schrijven en uploaden voor geregistreerde gebruikers)';
+$lang['i_pol2']                = 'Besloten wiki (lezen, schrijven en uploaden alleen voor geregistreerde gebruikers)';
+$lang['i_allowreg']            = 'Toestaan dat gebruikers zichzelf registeren';
+$lang['i_retry']               = 'Opnieuw';
+$lang['i_license']             = 'Kies a.u.b. een licentie die u voor uw inhoud wilt gebruiken:';
+$lang['i_license_none']        = 'Toon geen licentie-informatie';
+$lang['i_pop_field']           = 'Help ons om je DokuWiki ervaring te verbeteren';
+$lang['i_pop_label']           = 'Stuur eens per maand geanonimiseerde gebruiksstatistieken naar de Dokuwiki ontwikkelaars';
+$lang['recent_global']         = 'Je bekijkt momenteel de wijzigingen binnen de <b>%s</b> namespace. Je kunt ook de <a href="%s">recente wijzigingen van de hele wiki</a> bekijken.';
+$lang['years']                 = '%d jaar geleden';
+$lang['months']                = '%d maand geleden';
+$lang['weeks']                 = '%d weken geleden';
+$lang['days']                  = '%d dagen geleden';
+$lang['hours']                 = '%d uren geleden';
+$lang['minutes']               = '%d minuten geleden';
+$lang['seconds']               = '%d seconden geleden';
+$lang['wordblock']             = 'Uw wijziging is niet opgeslagen omdat deze niet-toegestane tekst bevat (spam).';
+$lang['media_uploadtab']       = 'Uploaden';
+$lang['media_searchtab']       = 'Zoeken';
+$lang['media_file']            = 'Bestand';
+$lang['media_viewtab']         = 'Beeld';
+$lang['media_edittab']         = 'Bewerken';
+$lang['media_historytab']      = 'Geschiedenis';
+$lang['media_list_thumbs']     = 'Miniatuurweergaven';
+$lang['media_list_rows']       = 'Regels';
+$lang['media_sort_name']       = 'Naam';
+$lang['media_sort_date']       = 'Datum';
+$lang['media_namespaces']      = 'Kies namespace';
+$lang['media_files']           = 'Bestanden in %s';
+$lang['media_upload']          = 'Upload naar %s';
+$lang['media_search']          = 'Zoeken in %s';
+$lang['media_view']            = '%s';
+$lang['media_viewold']         = '%s bij %s';
+$lang['media_edit']            = '%s bewerken';
+$lang['media_history']         = 'Geschiedenis van %s';
+$lang['media_meta_edited']     = 'Metagegevens bewerkt';
+$lang['media_perm_read']       = 'Sorry, u heeft niet voldoende rechten om bestanden te lezen.';
+$lang['media_perm_upload']     = 'Sorry, u heeft niet voldoende rechten om bestanden te uploaden.';
+$lang['media_update']          = 'Upload nieuwe versie';
+$lang['media_restore']         = 'Deze versie terugzetten';
+$lang['media_acl_warning']     = 'De lijst is mogelijk niet compleet door ACL beperkingen en verborgen pagina\'s.';
+$lang['currentns']             = 'Huidige namespace';
+$lang['searchresult']          = 'Zoekresultaat';
+$lang['plainhtml']             = 'Alleen HTML';
+$lang['wikimarkup']            = 'Wiki Opmaak';
+$lang['page_nonexist_rev']     = 'Pagina bestaat niet bij %s. Het is vervolgens aangemaakt bij <a href="%s">%s</a>.';
+$lang['unable_to_parse_date']  = 'Begrijp het niet bij parameter "%s".';
+$lang['email_signature_text']  = 'Deze mail werd gegenereerd door DokuWiki op
+@DOKUWIKIURL@';
diff --git a/wiki/inc/lang/nl/locked.txt b/wiki/inc/lang/nl/locked.txt
new file mode 100644
index 0000000..878fb37
--- /dev/null
+++ b/wiki/inc/lang/nl/locked.txt
@@ -0,0 +1,3 @@
+====== Pagina in exclusief gebruik ======
+
+Deze pagina wordt momenteel aangepast door een andere gebruiker. Wacht tot deze gebruiker klaar is met aanpassen of totdat het gebruiksrecht vervalt.
diff --git a/wiki/inc/lang/nl/login.txt b/wiki/inc/lang/nl/login.txt
new file mode 100644
index 0000000..699cbf8
--- /dev/null
+++ b/wiki/inc/lang/nl/login.txt
@@ -0,0 +1,3 @@
+====== Login ======
+
+Je bent op dit moment niet ingelogd! Voer je login-gegevens hieronder in om in te loggen. Je browser moet cookies accepteren om in te kunnen loggen.
diff --git a/wiki/inc/lang/nl/mailtext.txt b/wiki/inc/lang/nl/mailtext.txt
new file mode 100644
index 0000000..32f6f63
--- /dev/null
+++ b/wiki/inc/lang/nl/mailtext.txt
@@ -0,0 +1,12 @@
+Er is een pagina in je DokuWiki toegevoegd of gewijzigd. Hier zijn de details:
+
+Datum         : @DATE@
+Browser       : @BROWSER@
+IP-Adres      : @IPADDRESS@
+Hostnaam      : @HOSTNAME@
+Oude revisie  : @OLDPAGE@
+Nieuwe revisie: @NEWPAGE@
+Samenvatting  : @SUMMARY@
+User          : @USER@
+
+@DIFF@
diff --git a/wiki/inc/lang/nl/mailwrap.html b/wiki/inc/lang/nl/mailwrap.html
new file mode 100644
index 0000000..f15ec06
--- /dev/null
+++ b/wiki/inc/lang/nl/mailwrap.html
@@ -0,0 +1,13 @@
+<html>
+ <head>
+ <title>@TITLE@</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+ </head>
+ <body>
+
+ @HTMLBODY@
+
+ <br /><hr />
+ <small>@EMAILSIGNATURE@</small>
+ </body>
+ </html>
\ No newline at end of file
diff --git a/wiki/inc/lang/nl/newpage.txt b/wiki/inc/lang/nl/newpage.txt
new file mode 100644
index 0000000..0e4b95e
--- /dev/null
+++ b/wiki/inc/lang/nl/newpage.txt
@@ -0,0 +1,3 @@
+====== Dit onderwerp bestaat nog niet ======
+
+De pagina over dit onderwerp bestaat nog niet. Aanmaken kan door op de ''Maak deze pagina aan'' te klikken.
diff --git a/wiki/inc/lang/nl/norev.txt b/wiki/inc/lang/nl/norev.txt
new file mode 100644
index 0000000..849fc51
--- /dev/null
+++ b/wiki/inc/lang/nl/norev.txt
@@ -0,0 +1,4 @@
+====== Revisie bestaat niet ======
+
+De opgegeven revisie bestaat niet. Klik op ''Oude revisies'' voor een lijst van oude revisies van dit document.
+
diff --git a/wiki/inc/lang/nl/password.txt b/wiki/inc/lang/nl/password.txt
new file mode 100644
index 0000000..94a180a
--- /dev/null
+++ b/wiki/inc/lang/nl/password.txt
@@ -0,0 +1,6 @@
+Beste @FULLNAME@!
+
+Hier is je gebruikersinformatie voor @TITLE@ op @DOKUWIKIURL@
+
+Gebruikersnaam: @LOGIN@
+Wachtwoord    : @PASSWORD@
diff --git a/wiki/inc/lang/nl/preview.txt b/wiki/inc/lang/nl/preview.txt
new file mode 100644
index 0000000..4d2927a
--- /dev/null
+++ b/wiki/inc/lang/nl/preview.txt
@@ -0,0 +1,4 @@
+====== Preview ======
+
+Dit is een preview van de tekst zoals hij er uit komt te zien. Let op: het is nog **niet opgeslagen!**
+
diff --git a/wiki/inc/lang/nl/pwconfirm.txt b/wiki/inc/lang/nl/pwconfirm.txt
new file mode 100644
index 0000000..8b900b1
--- /dev/null
+++ b/wiki/inc/lang/nl/pwconfirm.txt
@@ -0,0 +1,9 @@
+Beste @FULLNAME@!
+
+Iemand heeft een nieuw wachtwoord aangevraagd voor je @TITLE@ login op @DOKUWIKIURL@
+
+Als je geen nieuw wachtwoord hebt aangevraagd kun je deze e-mail negeren.
+
+Volg de volgende link om te bevestigen dat je inderdaad een nieuw wachtwoord wilt:
+
+@CONFIRM@
diff --git a/wiki/inc/lang/nl/read.txt b/wiki/inc/lang/nl/read.txt
new file mode 100644
index 0000000..2a9bb9a
--- /dev/null
+++ b/wiki/inc/lang/nl/read.txt
@@ -0,0 +1,2 @@
+Deze pagina is alleen-lezen. Je kan de broncode bekijken maar niet veranderen. Neem contact op met de beheerder als je denkt dat dit niet klopt.
+
diff --git a/wiki/inc/lang/nl/recent.txt b/wiki/inc/lang/nl/recent.txt
new file mode 100644
index 0000000..4b507f2
--- /dev/null
+++ b/wiki/inc/lang/nl/recent.txt
@@ -0,0 +1,3 @@
+====== Recente wijzigingen ======
+
+De volgende pagina's zijn recent aangepast.
diff --git a/wiki/inc/lang/nl/register.txt b/wiki/inc/lang/nl/register.txt
new file mode 100644
index 0000000..fc31860
--- /dev/null
+++ b/wiki/inc/lang/nl/register.txt
@@ -0,0 +1,4 @@
+====== Registreer als nieuwe gebruiker ======
+
+Vul alle informatie hieronder in om een nieuw account voor deze wiki aan te maken. Zorg dat je een **geldig e-mailadres** opgeeft - als je je wachtwoord hier niet in kunt vullen wordt het naar dit adres verzonden. De gebruikersnaam moet een geldige [[doku>pagename|paginanaam]] zijn.
+
diff --git a/wiki/inc/lang/nl/registermail.txt b/wiki/inc/lang/nl/registermail.txt
new file mode 100644
index 0000000..8d23efd
--- /dev/null
+++ b/wiki/inc/lang/nl/registermail.txt
@@ -0,0 +1,10 @@
+Een nieuwe gebruiker heeft zich geregistreerd. Dit zijn de details:
+
+Gebruikersnaam: @NEWUSER@
+Volledige naam: @NEWNAME@
+E-mail        : @NEWEMAIL@
+
+Datum         : @DATE@
+Browser       : @BROWSER@
+IP-adres      : @IPADDRESS@
+Hostname      : @HOSTNAME@
diff --git a/wiki/inc/lang/nl/resendpwd.txt b/wiki/inc/lang/nl/resendpwd.txt
new file mode 100644
index 0000000..3a67587
--- /dev/null
+++ b/wiki/inc/lang/nl/resendpwd.txt
@@ -0,0 +1,3 @@
+==== Verstuur een nieuw wachtwoord ====
+
+Voer je gebruikersnaam in het formulier hieronder in om een nieuw wachtwoord aan te vragen voor deze wiki. Een bevestigingslink zal worden verzonden naar het geregistreerde e-mailadres.
diff --git a/wiki/inc/lang/nl/resetpwd.txt b/wiki/inc/lang/nl/resetpwd.txt
new file mode 100644
index 0000000..345e307
--- /dev/null
+++ b/wiki/inc/lang/nl/resetpwd.txt
@@ -0,0 +1,3 @@
+====== Een nieuw wachtwoord instellen ======
+
+Vul alstublieft een nieuw wachtwoord in voor jouw account in deze wiki.
\ No newline at end of file
diff --git a/wiki/inc/lang/nl/revisions.txt b/wiki/inc/lang/nl/revisions.txt
new file mode 100644
index 0000000..7a78917
--- /dev/null
+++ b/wiki/inc/lang/nl/revisions.txt
@@ -0,0 +1,4 @@
+====== Oude revisies ======
+
+Dit zijn de oude revisies van het document. Om terug te keren naar een oude revisie selecteer je hem hieronder en klik je op de ''Pagina aanpassen'' en vervolgens op ''Opslaan''.
+
diff --git a/wiki/inc/lang/nl/searchpage.txt b/wiki/inc/lang/nl/searchpage.txt
new file mode 100644
index 0000000..b9d1236
--- /dev/null
+++ b/wiki/inc/lang/nl/searchpage.txt
@@ -0,0 +1,4 @@
+====== Zoeken ======
+
+Hieronder zijn de resultaten van de zoekopdracht. @CREATEPAGEINFO@
+
diff --git a/wiki/inc/lang/nl/showrev.txt b/wiki/inc/lang/nl/showrev.txt
new file mode 100644
index 0000000..c1bfa4e
--- /dev/null
+++ b/wiki/inc/lang/nl/showrev.txt
@@ -0,0 +1,2 @@
+**Dit is een oude revisie van het document!**
+----
diff --git a/wiki/inc/lang/nl/stopwords.txt b/wiki/inc/lang/nl/stopwords.txt
new file mode 100644
index 0000000..3056c4a
--- /dev/null
+++ b/wiki/inc/lang/nl/stopwords.txt
@@ -0,0 +1,37 @@
+# This is a list of words the indexer ignores, one word per line
+# When you edit this file be sure to use UNIX line endings (single newline)
+# No need to include words shorter than 3 chars - these are ignored anyway
+# This list is based upon the ones found at http://www.ranks.nl/stopwords/
+aan
+als
+bij
+dan
+dat
+die
+dit
+een
+had
+heb
+hem
+het
+hij
+hoe
+hun
+kan
+men
+met
+mij
+nog
+ons
+ook
+tot
+uit
+van
+was
+wat
+wel
+wij
+zal
+zei
+zij
+zou
diff --git a/wiki/inc/lang/nl/subscr_digest.txt b/wiki/inc/lang/nl/subscr_digest.txt
new file mode 100644
index 0000000..6a904a7
--- /dev/null
+++ b/wiki/inc/lang/nl/subscr_digest.txt
@@ -0,0 +1,12 @@
+Halllo!
+
+De pagina @PAGE@ in de @TITLE@ wiki is veranderd. Hier zijn de wijzigingen:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Vorige revisie: @OLDPAGE@
+Nieuwe revisie: @NEWPAGE@
+
+Om het verzenden van deze wijzigingsberichten te stoppen, logt u in op de wiki op @DOKUWIKIURL@ en bezoekt u @SUBSCRIBE@. Vervolgens kunt u zich voor elke gewenste pagina of namespace uitschrijven.
diff --git a/wiki/inc/lang/nl/subscr_form.txt b/wiki/inc/lang/nl/subscr_form.txt
new file mode 100644
index 0000000..0f9f2d0
--- /dev/null
+++ b/wiki/inc/lang/nl/subscr_form.txt
@@ -0,0 +1,3 @@
+====== Beheer inschrijvingen ======
+
+Deze pagina stelt u in staat uw abonnementen voor de huidige pagina en namespace te configureren.
\ No newline at end of file
diff --git a/wiki/inc/lang/nl/subscr_list.txt b/wiki/inc/lang/nl/subscr_list.txt
new file mode 100644
index 0000000..b77b075
--- /dev/null
+++ b/wiki/inc/lang/nl/subscr_list.txt
@@ -0,0 +1,9 @@
+Halllo!
+
+Pagina's in de namespace @PAGE@ van de @TITLE@ wiki zijn veranderd. Hier zijn de veranderde pagina's:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Om het verzenden van deze wijzigingsberichten te stoppen, logt u in op het wiki op @DOKUWIKIURL@ en navigeert u naar @SUBSCRIBE@. Vervolgens kunt u zich voor elke gewenste pagina of namespace uitschrijven.
diff --git a/wiki/inc/lang/nl/subscr_single.txt b/wiki/inc/lang/nl/subscr_single.txt
new file mode 100644
index 0000000..fe761f0
--- /dev/null
+++ b/wiki/inc/lang/nl/subscr_single.txt
@@ -0,0 +1,16 @@
+Halllo!
+
+De pagina @PAGE@ in de @TITLE@ wiki is veranderd.
+Hier zijn de wijzigingen:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Datum: @DATE@
+Gebruiker: @USER@
+Wijzigingssamenvatting: @SUMMARY@
+Vorige revisie: @OLDPAGE@
+Nieuwe revisie: @NEWPAGE@
+
+Om het verzenden van deze wijzigingsberichten te stoppen, logt u in op het wiki op @DOKUWIKIURL@ en navigeert u naar @NEWPAGE@. Vervolgens kunt u "Inschrijvingen wijzigen" gebruiken om inschrijvingen te stoppen.
diff --git a/wiki/inc/lang/nl/updateprofile.txt b/wiki/inc/lang/nl/updateprofile.txt
new file mode 100644
index 0000000..2368a09
--- /dev/null
+++ b/wiki/inc/lang/nl/updateprofile.txt
@@ -0,0 +1,3 @@
+===== Wijzig uw gebruikersprofiel =====
+
+Je hoeft alleen de velden aan te passen die je wilt wijzigen. Je gebruikersnaam is niet aan te passen.
diff --git a/wiki/inc/lang/nl/uploadmail.txt b/wiki/inc/lang/nl/uploadmail.txt
new file mode 100644
index 0000000..85a4b95
--- /dev/null
+++ b/wiki/inc/lang/nl/uploadmail.txt
@@ -0,0 +1,11 @@
+Er is een bestand geüpload naar uw DokuWiki. Hier zijn de details;
+
+Bestand  : @MEDIA@
+Oude revisie: @OLD@
+Datum    : @DATE@
+Browser  : @BROWSER@
+IP-adres : @IPADDRESS@
+Hostname : @HOSTNAME@
+Grootte  : @SIZE@
+MIME type: @MIME@
+Gebruiker: @USER@
diff --git a/wiki/inc/lang/no/admin.txt b/wiki/inc/lang/no/admin.txt
new file mode 100644
index 0000000..765177f
--- /dev/null
+++ b/wiki/inc/lang/no/admin.txt
@@ -0,0 +1,3 @@
+====== Administrasjon ======
+
+Nedenfor finner du en liste over administrative oppgaver i DokuWiki.
diff --git a/wiki/inc/lang/no/adminplugins.txt b/wiki/inc/lang/no/adminplugins.txt
new file mode 100644
index 0000000..df78672
--- /dev/null
+++ b/wiki/inc/lang/no/adminplugins.txt
@@ -0,0 +1 @@
+====== Ekstra programtillegg ======
\ No newline at end of file
diff --git a/wiki/inc/lang/no/backlinks.txt b/wiki/inc/lang/no/backlinks.txt
new file mode 100644
index 0000000..2298acc
--- /dev/null
+++ b/wiki/inc/lang/no/backlinks.txt
@@ -0,0 +1,3 @@
+====== Tilbakelenker ======
+
+Dette er en liste over sider som ser ut til å lenke tilbake til denne siden.
\ No newline at end of file
diff --git a/wiki/inc/lang/no/conflict.txt b/wiki/inc/lang/no/conflict.txt
new file mode 100644
index 0000000..49961d0
--- /dev/null
+++ b/wiki/inc/lang/no/conflict.txt
@@ -0,0 +1,6 @@
+====== Det finnes en nyere versjon ======
+
+Det fins en nyere utgave av dokumentet du har redigert. Dette kan skje når en annen bruker redigerer dokumentet samtidig med deg.
+
+Legg nøye merke til forskjellene som vises under, og velg deretter hvilken versjon du vil beholde. Om du velger ''**Lagre**'', så kommer din versjon til å lagres. Velg ''**Avbryt**'' for å beholde den nyeste versjonen (ikke din).
+
diff --git a/wiki/inc/lang/no/denied.txt b/wiki/inc/lang/no/denied.txt
new file mode 100644
index 0000000..f60f48f
--- /dev/null
+++ b/wiki/inc/lang/no/denied.txt
@@ -0,0 +1,4 @@
+====== Adgang forbudt ======
+
+Beklager, men du har ikke rettigheter til dette.
+
diff --git a/wiki/inc/lang/no/diff.txt b/wiki/inc/lang/no/diff.txt
new file mode 100644
index 0000000..e4c2eb0
--- /dev/null
+++ b/wiki/inc/lang/no/diff.txt
@@ -0,0 +1,4 @@
+====== Forskjeller ======
+
+Her vises forskjeller mellom den valgte versjonen og den nåværende versjonen av dokumentet.
+
diff --git a/wiki/inc/lang/no/draft.txt b/wiki/inc/lang/no/draft.txt
new file mode 100644
index 0000000..8bcea65
--- /dev/null
+++ b/wiki/inc/lang/no/draft.txt
@@ -0,0 +1,6 @@
+====== Kladdfil funnet ======
+
+Din siste endring av denne siden ble ikke avsluttet riktig. DokuWiki lagret automatisk en kladd under ditt arbeid som du nå kan bruke for å fortsette redigeringen. Nedenfor kan du se de lagrede data.
+
+Vennligst avgjør om du vil //gjennopprette// din tapte sesjon, //slette// kladden eller //avbryte// redigeringen.
+
diff --git a/wiki/inc/lang/no/edit.txt b/wiki/inc/lang/no/edit.txt
new file mode 100644
index 0000000..bdb3bc8
--- /dev/null
+++ b/wiki/inc/lang/no/edit.txt
@@ -0,0 +1,2 @@
+Rediger siden og klikk på ''**Lagre**''. Se [[wiki:syntax]] for Wikisyntaks. Rediger siden bare hvis du kan **forbedre** sidens innhold. Hvis du vil teste ut hvordan saker og ting fungerer, kan du gjøre det på [[playground:playground|lekeplassen]].
+
diff --git a/wiki/inc/lang/no/editrev.txt b/wiki/inc/lang/no/editrev.txt
new file mode 100644
index 0000000..652a84c
--- /dev/null
+++ b/wiki/inc/lang/no/editrev.txt
@@ -0,0 +1,2 @@
+**Du har hentet en tidligere versjon av dokumentet!** Hvis du lagrer den tidligere versjonen så kommer du til å lage en ny og aktiv versjon med dette innholdet.
+----
diff --git a/wiki/inc/lang/no/index.txt b/wiki/inc/lang/no/index.txt
new file mode 100644
index 0000000..e2ea959
--- /dev/null
+++ b/wiki/inc/lang/no/index.txt
@@ -0,0 +1,4 @@
+====== Indeks ======
+
+Dette er en fortegnelse over alle tilgjengelige sider, sortert etter [[doku>namespaces|navnerom]].
+
diff --git a/wiki/inc/lang/no/install.html b/wiki/inc/lang/no/install.html
new file mode 100644
index 0000000..ef3ee2e
--- /dev/null
+++ b/wiki/inc/lang/no/install.html
@@ -0,0 +1,24 @@
+<p>Denne siden assisterer under førstegangs installasjon og konfigurasjon av
+<a href="http://dokuwiki.org">Dokuwiki</a>. Mer informasjon for denne
+installasjonen er tilgjengelig på
+<a href="http://dokuwiki.org/installer">dokumentasjonssiden</a>.</p>
+
+<p>DokuWiki bruker vanlige filer for lagring av wikisider og annen
+informasjon assosiert med disse sidene (f.eks. bilder, søkeindekser, eldre
+revisjoner osv.). For å kunne virke <strong>må</strong> DokuWiki
+ha skrivetilgang til de mapper som lagrer disse filene.
+Denne installasjonen kan ikke sette opp mapperettigheter. Det må normalt
+gjøres direkte fra et kommandoskall, eller om du bruker en leverandør,
+via FTP eller ditt kontrollpanel på tjener (f.eks. cPanel).</p>
+
+<p>Denne installasjonen vil sette opp din DokuWiki-konfigurasjon for
+<abbr title="access control list">ACL</abbr>, som igjen tillater administrator
+innlogging og tilgang til DokuWikiens administratormeny for installasjon av tillegg,
+brukerbehandling, adgangskontrollbehandling til wikisider og endring av konfigurasjon.
+Det er ikke påkrevd for at DokuWiki skal virke, men det vil gjøre Dokuwiki enklere å
+administrere.</p>
+
+<p>Erfarne brukere eller brukere med spessielle oppsettingskrav bør se på disse lenkene
+for detaljer rundt
+<a href="http://dokuwiki.org/install">installasjonsinstrukser</a>
+og <a href="http://dokuwiki.org/config">konfigurasjonsinnstillinger</a>.</p>
diff --git a/wiki/inc/lang/no/jquery.ui.datepicker.js b/wiki/inc/lang/no/jquery.ui.datepicker.js
new file mode 100644
index 0000000..8a755aa
--- /dev/null
+++ b/wiki/inc/lang/no/jquery.ui.datepicker.js
@@ -0,0 +1,50 @@
+/* Norwegian initialisation for the jQuery UI date picker plugin. */
+/* Written by Naimdjon Takhirov (naimdjon@gmail.com). */
+
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "../widgets/datepicker" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery.datepicker );
+	}
+}( function( datepicker ) {
+
+datepicker.regional.no = {
+	closeText: "Lukk",
+	prevText: "&#xAB;Forrige",
+	nextText: "Neste&#xBB;",
+	currentText: "I dag",
+	monthNames: [
+		"januar",
+		"februar",
+		"mars",
+		"april",
+		"mai",
+		"juni",
+		"juli",
+		"august",
+		"september",
+		"oktober",
+		"november",
+		"desember"
+	],
+	monthNamesShort: [ "jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des" ],
+	dayNamesShort: [ "søn","man","tir","ons","tor","fre","lør" ],
+	dayNames: [ "søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag" ],
+	dayNamesMin: [ "sø","ma","ti","on","to","fr","lø" ],
+	weekHeader: "Uke",
+	dateFormat: "dd.mm.yy",
+	firstDay: 1,
+	isRTL: false,
+	showMonthAfterYear: false,
+	yearSuffix: ""
+};
+datepicker.setDefaults( datepicker.regional.no );
+
+return datepicker.regional.no;
+
+} ) );
diff --git a/wiki/inc/lang/no/lang.php b/wiki/inc/lang/no/lang.php
new file mode 100644
index 0000000..b8d3d3b
--- /dev/null
+++ b/wiki/inc/lang/no/lang.php
@@ -0,0 +1,366 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Reidar Mosvold <Reidar.Mosvold@hit.no>
+ * @author Jorge Barrera Grandon <jorge@digitalwolves.org>
+ * @author Rune Rasmussen [http://www.syntaxerror.no/]
+ * @author Thomas Nygreen <nygreen@gmail.com>
+ * @author Arild Burud <arildb@met.no>
+ * @author Torkill Bruland <torkar-b@online.no>
+ * @author Rune M. Andersen <rune.andersen@gmail.com>
+ * @author Jakob Vad Nielsen <me@jakobnielsen.net>
+ * @author Kjell Tore Næsgaard <kjell.t.nasgaard@ntnu.no>
+ * @author Knut Staring <knutst@gmail.com>
+ * @author Lisa Ditlefsen <lisa@vervesearch.com>
+ * @author Erik Pedersen <erik.pedersen@shaw.ca>
+ * @author Rune Rasmussen syntaxerror.no@gmail.com
+ * @author Jon Bøe <jonmagneboe@hotmail.com>
+ * @author Egil Hansen <egil@rosetta.no>
+ * @author Thomas Juberg <Thomas.Juberg@Gmail.com>
+ * @author Boris <boris@newton-media.no>
+ * @author Christopher Schive <chschive@frisurf.no>
+ * @author Patrick <spill.p@hotmail.com>
+ * @author Danny Buckhof <daniel.raknes@hotmail.no>
+ * @author Arne Hanssen <arne.hanssen@getmail.no>
+ * @author Arne Hanssen <arnehans@getmail.no>
+ * @author Patrick Sletvold <patricksletvold@hotmail.com>
+ */
+$lang['encoding']              = 'utf-8';
+$lang['direction']             = 'ltr';
+$lang['doublequoteopening']    = '«';
+$lang['doublequoteclosing']    = '»';
+$lang['singlequoteopening']    = '‘';
+$lang['singlequoteclosing']    = '’';
+$lang['apostrophe']            = '’';
+$lang['btn_edit']              = 'Rediger denne siden';
+$lang['btn_source']            = 'Vis kildekode';
+$lang['btn_show']              = 'Vis siden';
+$lang['btn_create']            = 'Lag denne siden';
+$lang['btn_search']            = 'Søk';
+$lang['btn_save']              = 'Lagre';
+$lang['btn_preview']           = 'Forhåndsvis';
+$lang['btn_top']               = 'Til toppen av siden';
+$lang['btn_newer']             = '<< nyere';
+$lang['btn_older']             = 'eldre >>';
+$lang['btn_revs']              = 'Historikk';
+$lang['btn_recent']            = 'Siste endringer';
+$lang['btn_upload']            = 'Last opp';
+$lang['btn_cancel']            = 'Avbryt';
+$lang['btn_index']             = 'Indeks';
+$lang['btn_secedit']           = 'Rediger';
+$lang['btn_login']             = 'Logg inn';
+$lang['btn_logout']            = 'Logg ut';
+$lang['btn_admin']             = 'Admin';
+$lang['btn_update']            = 'Oppdater';
+$lang['btn_delete']            = 'Slett';
+$lang['btn_back']              = 'Tilbake';
+$lang['btn_backlink']          = 'Tilbakelenker';
+$lang['btn_subscribe']         = 'Abonnér på endringer';
+$lang['btn_profile']           = 'Oppdater profil';
+$lang['btn_reset']             = 'Tilbakestill';
+$lang['btn_resendpwd']         = 'Sett nytt passord';
+$lang['btn_draft']             = 'Rediger kladd';
+$lang['btn_recover']           = 'Gjennvinn kladd';
+$lang['btn_draftdel']          = 'Slett kladd';
+$lang['btn_revert']            = 'Gjenopprette';
+$lang['btn_register']          = 'Registrer deg';
+$lang['btn_apply']             = 'Bruk';
+$lang['btn_media']             = 'Mediefiler';
+$lang['btn_deleteuser']        = 'Fjern min konto';
+$lang['btn_img_backto']        = 'Tilbake til %s';
+$lang['btn_mediaManager']      = 'Vis i mediefilbehandler';
+$lang['loggedinas']            = 'Innlogget som:';
+$lang['user']                  = 'Brukernavn';
+$lang['pass']                  = 'Passord';
+$lang['newpass']               = 'Nytt passord';
+$lang['oldpass']               = 'Bekreft gjeldende passord';
+$lang['passchk']               = 'Bekreft passord';
+$lang['remember']              = 'Husk meg';
+$lang['fullname']              = 'Fullt navn';
+$lang['email']                 = 'E-post';
+$lang['profile']               = 'Brukerprofil';
+$lang['badlogin']              = 'Ugyldig brukernavn og/eller passord.';
+$lang['badpassconfirm']        = 'Beklager, passordet var feil';
+$lang['minoredit']             = 'Mindre endringer';
+$lang['draftdate']             = 'Kladd autolagret';
+$lang['nosecedit']             = 'Siden er i mellomtiden endret, seksjonsinfo har blitt foreldet - lastet full side istedet.';
+$lang['regmissing']            = 'Vennligst fyll ut alle felt.';
+$lang['reguexists']            = 'Det finnes allerede en konto med dette brukernavnet.';
+$lang['regsuccess']            = 'Brukerkonto har blitt laget og passord har blitt sendt via e-post.';
+$lang['regsuccess2']           = 'Brukeren har blitt laget.';
+$lang['regfail']               = 'Brukeren kan ikke opprettes';
+$lang['regmailfail']           = 'En feil oppstod da passordet ditt skulle sendes via e-post. Vennligst kontakt administratoren!';
+$lang['regbadmail']            = 'Den angitte e-post adressen ser ut til å være ugyldig. Vennligst kontakt administratoren om du anser dette som feilaktig.';
+$lang['regbadpass']            = 'De to angitte passordene er ikke like, vennligst forsøk igjen.';
+$lang['regpwmail']             = 'Ditt DokuWiki passord';
+$lang['reghere']               = 'Har du ikke en konto ennå? Lag deg en';
+$lang['profna']                = 'Denne wikien støtter ikke profilendringer';
+$lang['profnochange']          = 'Ingen endringer, ingenting å gjøre.';
+$lang['profnoempty']           = 'Tomt navn- eller e-postfelt er ikke tillatt.';
+$lang['profchanged']           = 'Brukerprofilen ble vellykket oppdatert.';
+$lang['profnodelete']          = 'Denne wikien støtter ikke sletting av brukere';
+$lang['profdeleteuser']        = 'Slett konto';
+$lang['profdeleted']           = 'Din brukerkonto har blitt slettet fra denne wikien';
+$lang['profconfdelete']        = 'Jeg ønsker å fjerne min konto fra denne wikien. <br/> Denne handlingen kan ikke gjøres om.';
+$lang['profconfdeletemissing'] = 'Boks for bekreftelse ikke avkrysset';
+$lang['proffail']              = 'Brukerprofilen ble ikke oppdatert';
+$lang['pwdforget']             = 'Glemt passordet ditt? Få deg et nytt';
+$lang['resendna']              = 'Denne wikien støtter ikke nyutsending av passord.';
+$lang['resendpwd']             = 'Sett nytt passord for';
+$lang['resendpwdmissing']      = 'Beklager, du må fylle inn alle felt.';
+$lang['resendpwdnouser']       = 'Beklager, vi kan ikke finne denne brukeren i vår database.';
+$lang['resendpwdbadauth']      = 'Beklager, denne autorisasjonskoden er ikke gyldig. Sjekk at du brukte hele bekreftelseslenken.';
+$lang['resendpwdconfirm']      = 'En bekreftelseslenke er blitt sendt på e-post.';
+$lang['resendpwdsuccess']      = 'Ditt nye passord er blitt sendt på e-post.';
+$lang['license']               = 'Der annet ikke er angitt, er innholdet på denne wiki utgitt under følgende lisens:';
+$lang['licenseok']             = 'Merk: Ved å endre på denne siden godtar du at ditt innhold utgis under følgende lisens:';
+$lang['searchmedia']           = 'Søk filnavn';
+$lang['searchmedia_in']        = 'Søk i %s';
+$lang['txt_upload']            = 'Velg fil som skal lastes opp:';
+$lang['txt_filename']          = 'Skriv inn wikinavn (alternativt):';
+$lang['txt_overwrt']           = 'Overskriv eksisterende fil';
+$lang['maxuploadsize']         = 'Opplast maks %s per fil.';
+$lang['lockedby']              = 'Låst av:';
+$lang['lockexpire']            = 'Låsingen utløper:';
+$lang['js']['willexpire']      = 'Din redigeringslås for dette dokumentet kommer snart til å utløpe.\nFor å unngå versjonskonflikter bør du forhåndsvise dokumentet ditt for å forlenge redigeringslåsen.';
+$lang['js']['notsavedyet']     = 'Ulagrede endringer vil gå tapt!
+Vil du fortsette?';
+$lang['js']['searchmedia']     = 'Søk etter filer';
+$lang['js']['keepopen']        = 'Hold vindu åpent ved valg';
+$lang['js']['hidedetails']     = 'Skjul detaljer';
+$lang['js']['mediatitle']      = 'Lenkeinnstillinger';
+$lang['js']['mediadisplay']    = 'Lenketype';
+$lang['js']['mediaalign']      = 'Justering';
+$lang['js']['mediasize']       = 'Bildestørrelse';
+$lang['js']['mediatarget']     = 'Lenkemål';
+$lang['js']['mediaclose']      = 'Lukk';
+$lang['js']['mediainsert']     = 'Sett inn';
+$lang['js']['mediadisplayimg'] = 'Vis bilde.';
+$lang['js']['mediadisplaylnk'] = 'Vis bare lenken.';
+$lang['js']['mediasmall']      = 'Liten versjon';
+$lang['js']['mediamedium']     = 'Medium versjon';
+$lang['js']['medialarge']      = 'Stor versjon';
+$lang['js']['mediaoriginal']   = 'Original versjon';
+$lang['js']['medialnk']        = 'Lenke til detaljside';
+$lang['js']['mediadirect']     = 'Direktelenke til original';
+$lang['js']['medianolnk']      = 'Ingen lenke';
+$lang['js']['medianolink']     = 'Ikke lenk bildet';
+$lang['js']['medialeft']       = 'Venstrejuster bilde';
+$lang['js']['mediaright']      = 'Høyrejuster bilde';
+$lang['js']['mediacenter']     = 'Midtstill bilde';
+$lang['js']['medianoalign']    = 'Ingen justering';
+$lang['js']['nosmblinks']      = 'Lenker til Windows-ressurser fungerer bare i Microsoft sin Internet Explorer.
+Du kan fortsatt kopiere og lime inn lenken.';
+$lang['js']['linkwiz']         = 'guide til lenker';
+$lang['js']['linkto']          = 'Lenke til:';
+$lang['js']['del_confirm']     = 'Slett denne oppføringen?';
+$lang['js']['restore_confirm'] = 'Er du sikker på at du vil gjenopprette denne versjonen?';
+$lang['js']['media_diff']      = 'Vis forskjeller:';
+$lang['js']['media_diff_both'] = 'Side ved side';
+$lang['js']['media_diff_opacity'] = 'Gjennomskinnelighet';
+$lang['js']['media_diff_portions'] = 'Glidebryter';
+$lang['js']['media_select']    = 'Velg filer…';
+$lang['js']['media_upload_btn'] = 'Last opp';
+$lang['js']['media_done_btn']  = 'Ferdig';
+$lang['js']['media_drop']      = 'Dra filer hit for å laste dem opp';
+$lang['js']['media_cancel']    = 'fjern';
+$lang['js']['media_overwrt']   = 'Erstatt eksisterende filer';
+$lang['rssfailed']             = 'En feil oppstod da denne kilden skulle hentes:';
+$lang['nothingfound']          = 'Ingen data funnet.';
+$lang['mediaselect']           = 'Mediefiler';
+$lang['uploadsucc']            = 'Opplastingen var vellykket';
+$lang['uploadfail']            = 'Opplastingen var mislykket. Kanskje feil rettigheter?';
+$lang['uploadwrong']           = 'Opplastingen ble nektet. Denne filendelsen er ikke tillatt!';
+$lang['uploadexist']           = 'Filen eksisterer. Ingenting har blitt gjort.';
+$lang['uploadbadcontent']      = 'Det opplastede innholdet passer ikke til filendelsen %s.';
+$lang['uploadspam']            = 'Opplastingen ble blokkert av svartelisten for spam.';
+$lang['uploadxss']             = 'Opplastingen ble blokkert på grunn av mulig skadelig innhold.';
+$lang['uploadsize']            = 'Den opplastede filen var for stor. (max. %s)';
+$lang['deletesucc']            = 'Filen "%s" har blitt slettet.';
+$lang['deletefail']            = '"%s" kunne ikke slettes - sjekk rettighetene.';
+$lang['mediainuse']            = 'Filen "%s" har ikke biltt slettet - den er fortsatt i bruk.';
+$lang['namespaces']            = 'Navnerom';
+$lang['mediafiles']            = 'Tilgjengelige filer i';
+$lang['accessdenied']          = 'Du har ikke tilgang til å se denne siden';
+$lang['mediausage']            = 'Bruk følgende syntaks til å referere til denne filen:';
+$lang['mediaview']             = 'Vis original fil';
+$lang['mediaroot']             = 'rot';
+$lang['mediaupload']           = 'Last opp en fil til gjeldende navnerom her. For å opprette undernavnerom, før dem opp før filnavnet adskilt med kolon.';
+$lang['mediaextchange']        = 'Filendelse endret fra .%s til .%s!';
+$lang['reference']             = 'Referanser for';
+$lang['ref_inuse']             = 'Denne filen kan ikke slettes fordi den er fortsatt i bruk på følgende sider:';
+$lang['ref_hidden']            = 'Noen referanser er på sider du ikke har tilgang til å lese';
+$lang['hits']                  = 'Treff';
+$lang['quickhits']             = 'Matchende wikinavn';
+$lang['toc']                   = 'Innholdsfortegnelse';
+$lang['current']               = 'nåværende versjon';
+$lang['yours']                 = 'Din versjon';
+$lang['diff']                  = 'Vis forskjeller mot nåværende versjon';
+$lang['diff2']                 = 'Vis forskjeller mellom valgte versjoner';
+$lang['difflink']              = 'Lenk til denne sammenligningen';
+$lang['diff_type']             = 'Vis forskjeller:';
+$lang['diff_inline']           = 'I teksten';
+$lang['diff_side']             = 'Side ved side';
+$lang['diffprevrev']           = 'Forrige revisjon';
+$lang['diffnextrev']           = 'Neste revisjon';
+$lang['difflastrev']           = 'Siste revisjon';
+$lang['diffbothprevrev']       = 'Begge sider forrige revisjon';
+$lang['diffbothnextrev']       = 'Begge sider neste revisjon';
+$lang['line']                  = 'Linje';
+$lang['breadcrumb']            = 'Spor:';
+$lang['youarehere']            = 'Du er her:';
+$lang['lastmod']               = 'Sist endret:';
+$lang['by']                    = 'av';
+$lang['deleted']               = 'fjernet';
+$lang['created']               = 'opprettet';
+$lang['restored']              = 'gjenopprettet til en tidligere versjon (%s)';
+$lang['external_edit']         = 'ekstern redigering';
+$lang['summary']               = 'Redigeringskommentar';
+$lang['noflash']               = 'For at dette innholdet skal vises må du ha <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a>.';
+$lang['download']              = 'Last ned utdraget';
+$lang['tools']                 = 'Verktøy';
+$lang['user_tools']            = 'Brukerverktøy';
+$lang['site_tools']            = 'Nettstedverktøy';
+$lang['page_tools']            = 'Sideverktøy';
+$lang['skip_to_content']       = 'Hopp til innhold';
+$lang['sidebar']               = 'Sidefelt';
+$lang['mail_newpage']          = 'side lagt til:';
+$lang['mail_changed']          = 'side endret:';
+$lang['mail_subscribe_list']   = 'side endret i \'namespace\':';
+$lang['mail_new_user']         = 'ny bruker:';
+$lang['mail_upload']           = 'fil opplastet:';
+$lang['changes_type']          = 'Vis endringer for';
+$lang['pages_changes']         = 'Sider';
+$lang['media_changes']         = 'Mediefiler';
+$lang['both_changes']          = 'Både sider og mediefiler';
+$lang['qb_bold']               = 'Fet tekst';
+$lang['qb_italic']             = 'Kursiv tekst';
+$lang['qb_underl']             = 'Understreket tekst';
+$lang['qb_code']               = 'Kodetekst';
+$lang['qb_strike']             = 'Gjennomstreket tekst';
+$lang['qb_h1']                 = 'Overskrift nivå 1';
+$lang['qb_h2']                 = 'Overskrift nivå 2';
+$lang['qb_h3']                 = 'Overskrift nivå 3';
+$lang['qb_h4']                 = 'Overskrift nivå 4';
+$lang['qb_h5']                 = 'Overskrift nivå 5';
+$lang['qb_h']                  = 'Overskrift';
+$lang['qb_hs']                 = 'Velg overskrift';
+$lang['qb_hplus']              = 'Høyere overskrift';
+$lang['qb_hminus']             = 'Lavere overskrift';
+$lang['qb_hequal']             = 'Overskrift på samme nivå';
+$lang['qb_link']               = 'Intern lenke';
+$lang['qb_extlink']            = 'Ekstern lenke';
+$lang['qb_hr']                 = 'Horisontal linje';
+$lang['qb_ol']                 = 'Sortert listepunkt';
+$lang['qb_ul']                 = 'Usortert listepunkt';
+$lang['qb_media']              = 'Legg til bilder og andre filer';
+$lang['qb_sig']                = 'Føy til signatur';
+$lang['qb_smileys']            = 'Smilefjes';
+$lang['qb_chars']              = 'Spesialtegn';
+$lang['upperns']               = 'gå til overordnet navnerom';
+$lang['metaedit']              = 'Rediger metadata';
+$lang['metasaveerr']           = 'Skriving av metadata feilet';
+$lang['metasaveok']            = 'Metadata lagret';
+$lang['img_title']             = 'Tittel:';
+$lang['img_caption']           = 'Bildetekst:';
+$lang['img_date']              = 'Dato:';
+$lang['img_fname']             = 'Filnavn:';
+$lang['img_fsize']             = 'Størrelse:';
+$lang['img_artist']            = 'Fotograf:';
+$lang['img_copyr']             = 'Opphavsrett:';
+$lang['img_format']            = 'Format:';
+$lang['img_camera']            = 'Kamera:';
+$lang['img_keywords']          = 'Nøkkelord:';
+$lang['img_width']             = 'Bredde:';
+$lang['img_height']            = 'Høyde:';
+$lang['subscr_subscribe_success'] = 'La til %s som abonnent på %s';
+$lang['subscr_subscribe_error'] = 'Klarte ikke å legge til %s som abonnent på %s';
+$lang['subscr_subscribe_noaddress'] = 'Brukeren din er ikke registrert med noen adresse. Du kan derfor ikke legges til som abonnent.';
+$lang['subscr_unsubscribe_success'] = 'Avsluttet %s sitt abonnement på %s';
+$lang['subscr_unsubscribe_error'] = 'Klarte ikke å avslutte %s sitt abonnement på %s';
+$lang['subscr_already_subscribed'] = '%s abonnerer allerede på %s';
+$lang['subscr_not_subscribed'] = '%s abonnerer ikke på %s';
+$lang['subscr_m_not_subscribed'] = 'Du abonnerer ikke på denne sida eller dette navnerommet';
+$lang['subscr_m_new_header']   = 'Legg til abonnement';
+$lang['subscr_m_current_header'] = 'Gjeldende abonnementer';
+$lang['subscr_m_unsubscribe']  = 'Stoppe abonnement';
+$lang['subscr_m_subscribe']    = 'Abonnere på';
+$lang['subscr_m_receive']      = 'Motta';
+$lang['subscr_style_every']    = 'e-post for alle endringer';
+$lang['subscr_style_digest']   = 'e-post med sammendrag av endringer for hver side (%.2f dager mellom hver)';
+$lang['subscr_style_list']     = 'liste med sider som er endra siden forrige e-post (%.2f dager mellom hver)';
+$lang['authtempfail']          = 'Brukerautorisasjon er midlertidig utilgjengelig. Om dette vedvarer, vennligst informer Wiki-admin.';
+$lang['i_chooselang']          = 'Velg språk';
+$lang['i_installer']           = 'DokuWiki-installasjon';
+$lang['i_wikiname']            = 'Wikinavn';
+$lang['i_enableacl']           = 'Aktiver ACL (anbefalt)';
+$lang['i_superuser']           = 'Superbruker';
+$lang['i_problems']            = 'Installasjonen oppdaget noen problemer, disse listes nedenfor. Du kan ikke fortsett før du har løst disse.';
+$lang['i_modified']            = 'For sikkerhets skyld vil dette skriptet bare virke med en ny og uendret Dokuwiki-installsjon.
+                         Du bør enten pakke ut filene på nytt fra den nedlastede pakken, eller konsultere den komplette
+                         <a href="http://dokuwiki.org/install">Dokuwiki-installasjonsinstruksen</a>';
+$lang['i_funcna']              = 'PHP-funksjonen <code>%s</code> er ikke tilgjengelig. Kanskje din nettleverandør har deaktivert denne?';
+$lang['i_phpver']              = 'Din PHP versjon <code>%s</code> er lavere enn kravet <code>%s</code>. Du må oppgradere PHP installasjonen. ';
+$lang['i_mbfuncoverload']      = 'mbstring.func_overload må deaktiveres i php.ini for å kjøre DokuWiki.';
+$lang['i_permfail']            = '<code>%s</code> er ikke skrivbar for DokuWiki. Du må fikse rettighetene for denne mappen!';
+$lang['i_confexists']          = '<code>%s</code> eksisterer allerede';
+$lang['i_writeerr']            = 'Kunne ikke opprette <code>%s</code>. Du må sjekke mappe-/filrettigheter og opprette filen manuelt.';
+$lang['i_badhash']             = 'ikke gjenkjent eller modifisert dokuwiki.php (hash=<code>%s</code>)';
+$lang['i_badval']              = '<code>%s</code> - ugyldig eller tom verdi';
+$lang['i_success']             = 'Konfigurasjonen ble vellykket fullført. Du kan slette install.php filen nå. Fortsett til
+                        <a href="doku.php?id=wiki:welcome">din nye DokuWiki</a>.';
+$lang['i_failure']             = 'En eller flere feil oppstod ved skriving til konfigurasjonsfilene. Du må kanskje fikse dem manuelt før
+                         du kan bruke <a href="doku.php?id=wiki:welcome">din nye DokuWiki</a>.';
+$lang['i_policy']              = 'Innledende ACL-politikk';
+$lang['i_pol0']                = 'Åpen Wiki (les, skriv og opplasting for alle)';
+$lang['i_pol1']                = 'Offentlig Wiki (les for alle, skriving og opplasting bare for registrerte brukere)';
+$lang['i_pol2']                = 'Lukket Wiki (les, skriv og opplasting bare for registrerte brukere)';
+$lang['i_allowreg']            = 'Tillat at brukere registrerer seg selv';
+$lang['i_retry']               = 'Prøv igjen';
+$lang['i_license']             = 'Velg lisens som du vil legge ut innholdet under:';
+$lang['i_license_none']        = 'Ikke vis noen lisensinformasjon';
+$lang['i_pop_field']           = 'Venligst hejlp oss å forbedre Dokuwiki-opplevelsen:';
+$lang['i_pop_label']           = 'Sand annonyme bruksdata til Dokuwiki-utviklerene, en gang i måneden';
+$lang['recent_global']         = 'Du ser nå på endringene i navnerommet <b>%s</b>. Du kan også <a href="%s">se på nylig foretatte endringer for hele wikien</a>. ';
+$lang['years']                 = '%d år siden';
+$lang['months']                = '%d måneder siden';
+$lang['weeks']                 = '%d uker siden';
+$lang['days']                  = '%d dager siden';
+$lang['hours']                 = '%d timer siden';
+$lang['minutes']               = '%d minutter siden';
+$lang['seconds']               = '%d sekunder siden';
+$lang['wordblock']             = 'Din endring ble ikke lagret ettersom den inneholder blokkert tekst (søppel).';
+$lang['media_uploadtab']       = 'Last opp';
+$lang['media_searchtab']       = 'Søk';
+$lang['media_file']            = 'Fil';
+$lang['media_viewtab']         = 'Vis';
+$lang['media_edittab']         = 'Rediger';
+$lang['media_historytab']      = 'Historikk';
+$lang['media_list_thumbs']     = 'Miniatyrbilder';
+$lang['media_list_rows']       = 'Rader';
+$lang['media_sort_name']       = 'etter navn';
+$lang['media_sort_date']       = 'etter dato';
+$lang['media_namespaces']      = 'Velg navnerom';
+$lang['media_files']           = 'Filer i %s';
+$lang['media_upload']          = 'Last opp til navnerommet <strong>%s</strong>.';
+$lang['media_search']          = 'Søk i navnerommet <strong>%s</strong>.';
+$lang['media_view']            = '%s';
+$lang['media_viewold']         = '%s på %s';
+$lang['media_edit']            = 'Rediger %s';
+$lang['media_history']         = '%s vis historikk';
+$lang['media_meta_edited']     = 'metadata er endra';
+$lang['media_perm_read']       = 'Beklager, du har ikke tilgang til å lese filer.';
+$lang['media_perm_upload']     = 'Beklager, du har ikke tilgang til å laste opp filer.';
+$lang['media_update']          = 'Last opp ny versjon';
+$lang['media_restore']         = 'Gjenopprett denne versjonen';
+$lang['media_acl_warning']     = 'Kanskje er denne listen ikke komplett, pga. restrisjoner satt i ACL eller skjulte sider.';
+$lang['currentns']             = 'gjeldende navnemellomrom';
+$lang['searchresult']          = 'Søk i resultat';
+$lang['plainhtml']             = 'Enkel HTML';
+$lang['wikimarkup']            = 'wiki-format';
+$lang['page_nonexist_rev']     = 'Finnes ingen side på %s. Den er derfor laget på <a href="%s">%s</a>';
+$lang['unable_to_parse_date']  = 'Ikke mulig å tolke "%s".';
+$lang['email_signature_text']  = 'Denne meldingen ble laget av DokuWiki
+@DOKUWIKIURL@';
diff --git a/wiki/inc/lang/no/locked.txt b/wiki/inc/lang/no/locked.txt
new file mode 100644
index 0000000..cb14c89
--- /dev/null
+++ b/wiki/inc/lang/no/locked.txt
@@ -0,0 +1,3 @@
+====== Dokumentet er låst ======
+
+Dette dokumentet er for tiden låst for redigering av en annen bruker. Du må vente til denne brukeren er ferdig med sin redigering, eller til dokumentlåsen opphører å gjelde.
diff --git a/wiki/inc/lang/no/login.txt b/wiki/inc/lang/no/login.txt
new file mode 100644
index 0000000..877fff0
--- /dev/null
+++ b/wiki/inc/lang/no/login.txt
@@ -0,0 +1,4 @@
+====== Logg inn ======
+
+Du er ikke innlogget! Angi ditt brukernavn og passord nedenfor for å logge inn. Støtte for informasjonskapsler (cockies) må være aktivert i din nettleser for at du skal kunne logge inn.
+
diff --git a/wiki/inc/lang/no/mailtext.txt b/wiki/inc/lang/no/mailtext.txt
new file mode 100644
index 0000000..7260733
--- /dev/null
+++ b/wiki/inc/lang/no/mailtext.txt
@@ -0,0 +1,12 @@
+En side i din DokuWiki har blitt lagt til eller blitt endret. Informasjon om endringen:
+
+Dato                 : @DATE@
+Nettleser            : @BROWSER@
+IP-adresse           : @IPADDRESS@
+Vertsnavn            : @HOSTNAME@
+Tidligere versjon    : @OLDPAGE@
+Aktuell versjon      : @NEWPAGE@
+Redigeringskommentar : @SUMMARY@
+Bruker               : @USER@
+
+@DIFF@
diff --git a/wiki/inc/lang/no/newpage.txt b/wiki/inc/lang/no/newpage.txt
new file mode 100644
index 0000000..86cad00
--- /dev/null
+++ b/wiki/inc/lang/no/newpage.txt
@@ -0,0 +1,3 @@
+====== Dette emnet har ikke noe innhold ======
+
+Du har klikket på en lenke til et emne som ikke finnes ennå. Du kan opprette det ved å klikke på ''**Lag denne siden**''.
diff --git a/wiki/inc/lang/no/norev.txt b/wiki/inc/lang/no/norev.txt
new file mode 100644
index 0000000..cc58c99
--- /dev/null
+++ b/wiki/inc/lang/no/norev.txt
@@ -0,0 +1,4 @@
+====== Versjonen finnes ikke ======
+
+Den angitte versjonen finnes ikke. Bruk ''**Historikk**'' for en oversikt over de versjoner som finnes av dette dokumentet.
+
diff --git a/wiki/inc/lang/no/password.txt b/wiki/inc/lang/no/password.txt
new file mode 100644
index 0000000..46023e3
--- /dev/null
+++ b/wiki/inc/lang/no/password.txt
@@ -0,0 +1,6 @@
+Hei @FULLNAME@!
+
+Her er dine brukeropplysninger for @TITLE@ på @DOKUWIKIURL@
+
+Brukernavn : @LOGIN@
+Passord : @PASSWORD@
diff --git a/wiki/inc/lang/no/preview.txt b/wiki/inc/lang/no/preview.txt
new file mode 100644
index 0000000..2bed20e
--- /dev/null
+++ b/wiki/inc/lang/no/preview.txt
@@ -0,0 +1,4 @@
+====== Forhåndsvisning ======
+
+Dette er en forhåndsvisning av hvordan din tekst kommer til å se ut når den blir vist. Husk at den er **ikke lagret** ennå!
+
diff --git a/wiki/inc/lang/no/pwconfirm.txt b/wiki/inc/lang/no/pwconfirm.txt
new file mode 100644
index 0000000..29ff6f2
--- /dev/null
+++ b/wiki/inc/lang/no/pwconfirm.txt
@@ -0,0 +1,11 @@
+Hei @FULLNAME@!
+
+Noen har bedt om nytt passord for din @TITLE@ innlogging
+på @DOKUWIKIURL@
+
+Om du ikke ba om nytt passord kan du bare overse denne e-posten.
+
+For å bekrefte at forespørselen virkelig kom fra deg kan du bruke
+følgende lenke:
+
+@CONFIRM@
diff --git a/wiki/inc/lang/no/read.txt b/wiki/inc/lang/no/read.txt
new file mode 100644
index 0000000..27fcb51
--- /dev/null
+++ b/wiki/inc/lang/no/read.txt
@@ -0,0 +1,2 @@
+Denne siden er skrivebeskyttet. Du kan se på den, men ikke endre den. Kontakt administratoren hvis du mener at du bør kunne endre siden.
+
diff --git a/wiki/inc/lang/no/recent.txt b/wiki/inc/lang/no/recent.txt
new file mode 100644
index 0000000..857013c
--- /dev/null
+++ b/wiki/inc/lang/no/recent.txt
@@ -0,0 +1,5 @@
+====== Siste nytt ======
+
+Følgende sider har nylig blitt oppdatert.
+
+
diff --git a/wiki/inc/lang/no/register.txt b/wiki/inc/lang/no/register.txt
new file mode 100644
index 0000000..160e473
--- /dev/null
+++ b/wiki/inc/lang/no/register.txt
@@ -0,0 +1,4 @@
+====== Registrer deg som bruker ======
+
+Angi all informasjon som det blir spurt om nedenfor for å lage en ny brukerkonto for denne wikien. Vær spesielt nøye med å angi en **gyldig e-postadresse** - ditt passord vil bli sendt til den e-postadressen du angir. Brukernavnet må være et gyldig [[doku>pagename|sidenavn]].
+
diff --git a/wiki/inc/lang/no/registermail.txt b/wiki/inc/lang/no/registermail.txt
new file mode 100644
index 0000000..8902273
--- /dev/null
+++ b/wiki/inc/lang/no/registermail.txt
@@ -0,0 +1,10 @@
+En ny bruker har registrert seg, her er detaljene:
+
+Brukernavn  : @NEWUSER@
+Fult navn   : @NEWNAME@
+E-post      : @NEWEMAIL@
+
+Dato        : @DATE@
+Nettleser   : @BROWSER@
+IP-adresse  : @IPADDRESS@
+Tjener      : @HOSTNAME@
diff --git a/wiki/inc/lang/no/resendpwd.txt b/wiki/inc/lang/no/resendpwd.txt
new file mode 100644
index 0000000..315ab81
--- /dev/null
+++ b/wiki/inc/lang/no/resendpwd.txt
@@ -0,0 +1,4 @@
+====== Send nytt passord ======
+
+Fyll inn ditt brukernavn i skjema nedenfor for å be om nytt passord for din konto i denne wiki. En bekreftelseslenke vil bli sendt til din e-postadresse.
+
diff --git a/wiki/inc/lang/no/resetpwd.txt b/wiki/inc/lang/no/resetpwd.txt
new file mode 100644
index 0000000..2da7170
--- /dev/null
+++ b/wiki/inc/lang/no/resetpwd.txt
@@ -0,0 +1,3 @@
+====== Sett nytt passord ======
+
+Vennligst skriv inn et nytt passord for din konto i denne wikien. 
\ No newline at end of file
diff --git a/wiki/inc/lang/no/revisions.txt b/wiki/inc/lang/no/revisions.txt
new file mode 100644
index 0000000..023fd8d
--- /dev/null
+++ b/wiki/inc/lang/no/revisions.txt
@@ -0,0 +1,4 @@
+====== Historikk ======
+
+Her vises tidligere versjoner av dokumentet. For å sette dette dokumentet tilbake til en tidligere versjon kan du velge den ønskede versjonen nedenfor, klikke på **''Rediger denne siden''** og lagre dokumentet.
+
diff --git a/wiki/inc/lang/no/searchpage.txt b/wiki/inc/lang/no/searchpage.txt
new file mode 100644
index 0000000..b8d9f01
--- /dev/null
+++ b/wiki/inc/lang/no/searchpage.txt
@@ -0,0 +1,4 @@
+====== Søk ======
+
+Du ser resultatet av dette søket nedenfor. @CREATEPAGEINFO@
+
diff --git a/wiki/inc/lang/no/showrev.txt b/wiki/inc/lang/no/showrev.txt
new file mode 100644
index 0000000..06514f2
--- /dev/null
+++ b/wiki/inc/lang/no/showrev.txt
@@ -0,0 +1,2 @@
+**Dette er en gammel utgave av dokumentet!**
+----
diff --git a/wiki/inc/lang/no/stopwords.txt b/wiki/inc/lang/no/stopwords.txt
new file mode 100644
index 0000000..9a4c302
--- /dev/null
+++ b/wiki/inc/lang/no/stopwords.txt
@@ -0,0 +1,68 @@
+# Dette er en liste med ord som indeksereren ignorerer, ett ord per linje.
+# Når du redigerer siden, pass på å bruke UNIX linjeslutt (enkel ny linje).
+# Ord kortere enn 3 bokstaver er automatisk ignorert.
+# Listen er basert på http://helmer.aksis.uib.no/nta/ord10000.txt
+i
+og
+det
+er
+på
+til
+som
+en

+for
+av
+at
+har
+med
+de
+ikke
+den
+han
+om
+et
+fra
+men
+vi
+var
+jeg
+seg
+sier
+vil
+kan
+ble
+skal
+etter
+også
+så
+ut
+år
+nå
+da
+dette
+blir
+ved
+mot
+hadde
+to
+hun
+over
+være
+ha
+må
+går
+opp
+få
+andre
+eller
+bare
+sin
+mer
+inn
+før
+bli
+vært
+enn
+alle
+www
\ No newline at end of file
diff --git a/wiki/inc/lang/no/subscr_digest.txt b/wiki/inc/lang/no/subscr_digest.txt
new file mode 100644
index 0000000..90da8e6
--- /dev/null
+++ b/wiki/inc/lang/no/subscr_digest.txt
@@ -0,0 +1,16 @@
+Hei!
+
+Siden @PAGE@ på wikien @TITLE@ har blitt endret.
+Her er endringene:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Gammel versjon : @OLDPAGE@
+Ny versjon: @NEWPAGE@
+
+For å avslutte varslingen, logg inn på
+@DOKUWIKIURL@ og gå til
+@SUBSCRIBE@
+og avslutt abonnementet på endringer av siden eller i navnerommet.
diff --git a/wiki/inc/lang/no/subscr_form.txt b/wiki/inc/lang/no/subscr_form.txt
new file mode 100644
index 0000000..f62b25b
--- /dev/null
+++ b/wiki/inc/lang/no/subscr_form.txt
@@ -0,0 +1,3 @@
+====== Administrere abonnement ======
+
+Denne siden lar deg administrere abonnementene dine for denne siden og dette navnerommet.
\ No newline at end of file
diff --git a/wiki/inc/lang/no/subscr_list.txt b/wiki/inc/lang/no/subscr_list.txt
new file mode 100644
index 0000000..d06bc23
--- /dev/null
+++ b/wiki/inc/lang/no/subscr_list.txt
@@ -0,0 +1,13 @@
+Hei!
+
+Sider i navnerommet @PAGE@ på wikien @TITLE@ har blitt endra.
+Her er endringene:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+For å avslutte varslinga, logg inn på
+@DOKUWIKIURL@ og gå til
+@SUBSCRIBE@
+og avslutt abonnementet på endringer av sida eller i navnerommet.
diff --git a/wiki/inc/lang/no/subscr_single.txt b/wiki/inc/lang/no/subscr_single.txt
new file mode 100644
index 0000000..5fb7716
--- /dev/null
+++ b/wiki/inc/lang/no/subscr_single.txt
@@ -0,0 +1,19 @@
+Hei!
+
+Siden @PAGE@ på wikien @TITLE@ har blitt endret.
+Her er endringene:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Dato : @DATE@
+Bruker : @USER@
+Sammendrag: @SUMMARY@
+Gammel versjon : @OLDPAGE@
+Ny versjon: @NEWPAGE@
+
+For å avslutte varslingen, logg inn på
+@DOKUWIKIURL@, gå til
+@SUBSCRIBE@
+og avslutt abonnementet på endringer av siden eller i navnerommet.
diff --git a/wiki/inc/lang/no/updateprofile.txt b/wiki/inc/lang/no/updateprofile.txt
new file mode 100644
index 0000000..b2e37e7
--- /dev/null
+++ b/wiki/inc/lang/no/updateprofile.txt
@@ -0,0 +1,5 @@
+====== Oppdater din brukerprofil ======
+
+Du behøver bare fylle ut de felter du ønsker å endre. Du kan ikke endre brukernavnet ditt.
+
+
diff --git a/wiki/inc/lang/no/uploadmail.txt b/wiki/inc/lang/no/uploadmail.txt
new file mode 100644
index 0000000..237ec65
--- /dev/null
+++ b/wiki/inc/lang/no/uploadmail.txt
@@ -0,0 +1,11 @@
+En fil ble lastet opp på din DokuWiki. Her er detaljene:
+
+Fil : @MEDIA@
+Gammel versjon: @OLD@
+Dato : @DATE@
+Nettleser : @BROWSER@
+IP-adresse : @IPADDRESS@
+Vertnavn : @HOSTNAME@
+Størrelse : @SIZE@
+MIME-type : @MIME@
+Bruker : @USER@
diff --git a/wiki/inc/lang/pl/admin.txt b/wiki/inc/lang/pl/admin.txt
new file mode 100644
index 0000000..cea45f9
--- /dev/null
+++ b/wiki/inc/lang/pl/admin.txt
@@ -0,0 +1,4 @@
+====== Administracja ======
+
+Czynności administracyjne DokuWiki.
+
diff --git a/wiki/inc/lang/pl/adminplugins.txt b/wiki/inc/lang/pl/adminplugins.txt
new file mode 100644
index 0000000..0fb0399
--- /dev/null
+++ b/wiki/inc/lang/pl/adminplugins.txt
@@ -0,0 +1 @@
+===== Dodatkowe Wtyczki =====
\ No newline at end of file
diff --git a/wiki/inc/lang/pl/backlinks.txt b/wiki/inc/lang/pl/backlinks.txt
new file mode 100644
index 0000000..4edccb0
--- /dev/null
+++ b/wiki/inc/lang/pl/backlinks.txt
@@ -0,0 +1,4 @@
+====== Odnośnik z innych stron ======
+
+Strony zawierające odnośniki do aktualnej strony.
+
diff --git a/wiki/inc/lang/pl/conflict.txt b/wiki/inc/lang/pl/conflict.txt
new file mode 100644
index 0000000..da6f952
--- /dev/null
+++ b/wiki/inc/lang/pl/conflict.txt
@@ -0,0 +1,6 @@
+====== Istnieje nowsza wersja strony ======
+
+Istnieje nowsza wersja edytowanej strony. Prawdopodobnie ktoś zmienił tę stronę w trakcie Twojej pracy.
+
+Przeglądnij dokładnie poniższe różnice i zdecyduj, którą wersję zatrzymać. Jeśli naciśniesz ''zapisz'' to Twoja wersja zostanie zapisana. Jeśli naciśniesz ''anuluj'' to zostanie wybrana aktualna wersja strony.
+
diff --git a/wiki/inc/lang/pl/denied.txt b/wiki/inc/lang/pl/denied.txt
new file mode 100644
index 0000000..2b268b9
--- /dev/null
+++ b/wiki/inc/lang/pl/denied.txt
@@ -0,0 +1,4 @@
+====== Brak dostępu ======
+
+Nie masz wystarczających uprawnień.
+
diff --git a/wiki/inc/lang/pl/diff.txt b/wiki/inc/lang/pl/diff.txt
new file mode 100644
index 0000000..2c896dd
--- /dev/null
+++ b/wiki/inc/lang/pl/diff.txt
@@ -0,0 +1,4 @@
+====== Różnice ======
+
+Różnice między wybraną wersją a wersją aktualną.
+
diff --git a/wiki/inc/lang/pl/draft.txt b/wiki/inc/lang/pl/draft.txt
new file mode 100644
index 0000000..4036c30
--- /dev/null
+++ b/wiki/inc/lang/pl/draft.txt
@@ -0,0 +1,6 @@
+====== Znaleziono szkic strony ======
+
+Twoja ostatnia sesja edycji nie została poprawnie zakończona. DokuWiki automatycznie zachowało szkic strony podczas Twojej pracy abyś mógł (mogła) ją dokończyć. Poniżej możesz zobaczyć co zostało zapisane w czasie ostatnie sesji.
+
+Zdecyduj czy chcesz //przywrócić// ostatnią sesję, //usunąć// ją lub //anulować//.
+
diff --git a/wiki/inc/lang/pl/edit.txt b/wiki/inc/lang/pl/edit.txt
new file mode 100644
index 0000000..abb20ae
--- /dev/null
+++ b/wiki/inc/lang/pl/edit.txt
@@ -0,0 +1,4 @@
+Zredaguj tę stronę i naciśnij ''zapisz''.
+
+Na stronie ze [[wiki:syntax|składnią]] znajdziesz opis znaczników wiki. Jeśli chcesz poćwiczyć zajrzyj do [[playground:playground|piaskownicy]].
+
diff --git a/wiki/inc/lang/pl/editrev.txt b/wiki/inc/lang/pl/editrev.txt
new file mode 100644
index 0000000..1528cac
--- /dev/null
+++ b/wiki/inc/lang/pl/editrev.txt
@@ -0,0 +1,2 @@
+**Edytujesz nieaktualną wersję strony!** Jeśli ją zapiszesz to stanie się ona wersją aktualną.
+----
diff --git a/wiki/inc/lang/pl/index.txt b/wiki/inc/lang/pl/index.txt
new file mode 100644
index 0000000..1d3fd27
--- /dev/null
+++ b/wiki/inc/lang/pl/index.txt
@@ -0,0 +1,4 @@
+====== Indeks ======
+
+Indeks wszystkich dostępnych stron pogrupowany według [[doku>namespaces|katalogów]].
+
diff --git a/wiki/inc/lang/pl/install.html b/wiki/inc/lang/pl/install.html
new file mode 100644
index 0000000..01405e6
--- /dev/null
+++ b/wiki/inc/lang/pl/install.html
@@ -0,0 +1,23 @@
+<p>Ta strona ma na celu pomóc Ci w instalacji i konfiguracji
+<a href="http://dokuwiki.org">Dokuwiki</a>.
+Więcej informacji o instalatorze znajdziesz w
+<a href="http://dokuwiki.org/installer">dokumentacji instalatora</a>.</p>
+
+<p>DokuWiki używa zwykłych plików do przechowywania zawartości stron oraz wszelkich
+innych informacji takich jak obrazki, poprzednie wersje strony, itp.
+Żeby DokuWiki mogło poprawnie działać <strong>musisz</strong>
+nadać prawo zapisu do katalogu zawierającego te pliki. Instalator nie może wykonać
+tych czynności. Musisz zrobić to za pomocą polecenia powłoki, klienta FTP
+lub panelu kontrolnego Twojego dostawcy usług serwerowych.</p>
+
+<p>Instalator pomoże Ci w konfiguracji uprawnień
+<abbr title="access control list">ACL</abbr>,
+które z kolei umożliwią Ci założenie konta administratora oraz umożliwią dostęp
+do czynności administracyjnych takich jak instalowanie wtyczek, zarządzanie kontami,
+zarządzania uprawnieniami do stron oraz konfiguracji wiki. Użycie tego instalatora
+nie jest konieczne, jego celem jest tylko ułatwienie administracji DokuWiki.</p>
+
+<p>Zaawansowani użytkownicy lub użytkownicy mający specjalne wymagania powinni
+zapoznać się z
+<a href="http://dokuwiki.org/install">instrukcją instalacji</a>
+oraz <a href="http://dokuwiki.org/config">instrukcją konfiguracji</a>.</p>
diff --git a/wiki/inc/lang/pl/jquery.ui.datepicker.js b/wiki/inc/lang/pl/jquery.ui.datepicker.js
new file mode 100644
index 0000000..c2fddc1
--- /dev/null
+++ b/wiki/inc/lang/pl/jquery.ui.datepicker.js
@@ -0,0 +1,37 @@
+/* Polish initialisation for the jQuery UI date picker plugin. */
+/* Written by Jacek Wysocki (jacek.wysocki@gmail.com). */
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "../widgets/datepicker" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery.datepicker );
+	}
+}( function( datepicker ) {
+
+datepicker.regional.pl = {
+	closeText: "Zamknij",
+	prevText: "&#x3C;Poprzedni",
+	nextText: "Następny&#x3E;",
+	currentText: "Dziś",
+	monthNames: [ "Styczeń","Luty","Marzec","Kwiecień","Maj","Czerwiec",
+	"Lipiec","Sierpień","Wrzesień","Październik","Listopad","Grudzień" ],
+	monthNamesShort: [ "Sty","Lu","Mar","Kw","Maj","Cze",
+	"Lip","Sie","Wrz","Pa","Lis","Gru" ],
+	dayNames: [ "Niedziela","Poniedziałek","Wtorek","Środa","Czwartek","Piątek","Sobota" ],
+	dayNamesShort: [ "Nie","Pn","Wt","Śr","Czw","Pt","So" ],
+	dayNamesMin: [ "N","Pn","Wt","Śr","Cz","Pt","So" ],
+	weekHeader: "Tydz",
+	dateFormat: "dd.mm.yy",
+	firstDay: 1,
+	isRTL: false,
+	showMonthAfterYear: false,
+	yearSuffix: "" };
+datepicker.setDefaults( datepicker.regional.pl );
+
+return datepicker.regional.pl;
+
+} ) );
diff --git a/wiki/inc/lang/pl/lang.php b/wiki/inc/lang/pl/lang.php
new file mode 100644
index 0000000..f8e3fe8
--- /dev/null
+++ b/wiki/inc/lang/pl/lang.php
@@ -0,0 +1,358 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Wojciech Lichota <wojciech@lichota.pl>
+ * @author Max <maxrb146@gmail.com>
+ * @author Grzegorz Żur <grzegorz.zur@gmail.com>
+ * @author Mariusz Kujawski <marinespl@gmail.com>
+ * @author Maciej Kurczewski <pipijajko@gmail.com>
+ * @author Sławomir Boczek <slawkens@gmail.com>
+ * @author sleshek <sleshek@wp.pl>
+ * @author Leszek Stachowski <shazarre@gmail.com>
+ * @author maros <dobrimaros@yahoo.pl>
+ * @author Grzegorz Widła <dzesdzes@gmail.com>
+ * @author Łukasz Chmaj <teachmeter@gmail.com>
+ * @author Begina Felicysym <begina.felicysym@wp.eu>
+ * @author Aoi Karasu <aoikarasu@gmail.com>
+ * @author Tomasz Bosak <bosak.tomasz@gmail.com>
+ * @author Paweł Jan Czochański <czochanski@gmail.com>
+ * @author Mati <mackosa@wp.pl>
+ * @author Maciej Helt <geraldziu@gmail.com>
+ * @author Kris Charatonik <krishary@gmail.com>
+ */
+$lang['encoding']              = 'utf-8';
+$lang['direction']             = 'ltr';
+$lang['doublequoteopening']    = '„';
+$lang['doublequoteclosing']    = '”';
+$lang['singlequoteopening']    = '‚';
+$lang['singlequoteclosing']    = '’';
+$lang['apostrophe']            = '’';
+$lang['btn_edit']              = 'Edytuj stronę';
+$lang['btn_source']            = 'Pokaż źródło strony';
+$lang['btn_show']              = 'Pokaż stronę';
+$lang['btn_create']            = 'Utwórz stronę';
+$lang['btn_search']            = 'Szukaj';
+$lang['btn_save']              = 'Zapisz';
+$lang['btn_preview']           = 'Podgląd';
+$lang['btn_top']               = 'Do góry';
+$lang['btn_newer']             = '<< nowsze';
+$lang['btn_older']             = 'starsze >>';
+$lang['btn_revs']              = 'Poprzednie wersje';
+$lang['btn_recent']            = 'Ostatnie zmiany';
+$lang['btn_upload']            = 'Wyślij';
+$lang['btn_cancel']            = 'Anuluj';
+$lang['btn_index']             = 'Indeks';
+$lang['btn_secedit']           = 'Edytuj';
+$lang['btn_login']             = 'Zaloguj';
+$lang['btn_logout']            = 'Wyloguj';
+$lang['btn_admin']             = 'Administracja';
+$lang['btn_update']            = 'Aktualizuj';
+$lang['btn_delete']            = 'Usuń';
+$lang['btn_back']              = 'Wstecz';
+$lang['btn_backlink']          = 'Odnośniki';
+$lang['btn_subscribe']         = 'Subskrybuj zmiany';
+$lang['btn_profile']           = 'Aktualizuj profil';
+$lang['btn_reset']             = 'Resetuj';
+$lang['btn_resendpwd']         = 'Podaj nowe hasło';
+$lang['btn_draft']             = 'Edytuj szkic';
+$lang['btn_recover']           = 'Przywróć szkic';
+$lang['btn_draftdel']          = 'Usuń szkic';
+$lang['btn_revert']            = 'Przywróć';
+$lang['btn_register']          = 'Zarejestruj się!';
+$lang['btn_apply']             = 'Zastosuj';
+$lang['btn_media']             = 'Menadżer multimediów';
+$lang['btn_deleteuser']        = 'Usuń moje konto';
+$lang['btn_img_backto']        = 'Wróć do %s';
+$lang['btn_mediaManager']      = 'Zobacz w menadżerze multimediów';
+$lang['loggedinas']            = 'Zalogowany jako:';
+$lang['user']                  = 'Użytkownik';
+$lang['pass']                  = 'Hasło';
+$lang['newpass']               = 'Nowe hasło';
+$lang['oldpass']               = 'Potwierdź aktualne hasło';
+$lang['passchk']               = 'Powtórz hasło';
+$lang['remember']              = 'Zapamiętaj';
+$lang['fullname']              = 'Imię i nazwisko';
+$lang['email']                 = 'E-mail';
+$lang['profile']               = 'Profil użytkownika';
+$lang['badlogin']              = 'Nazwa użytkownika lub hasło są nieprawidłowe.';
+$lang['badpassconfirm']        = 'Niestety, hasło jest niepoprawne.';
+$lang['minoredit']             = 'Mniejsze zmiany';
+$lang['draftdate']             = 'Czas zachowania szkicu';
+$lang['nosecedit']             = 'Strona została zmodyfikowana, sekcje zostały zmienione. Załadowano całą stronę.';
+$lang['regmissing']            = 'Wypełnij wszystkie pola.';
+$lang['reguexists']            = 'Użytkownik o tej nazwie już istnieje.';
+$lang['regsuccess']            = 'Utworzono użytkownika. Hasło zostało przesłane pocztą.';
+$lang['regsuccess2']           = 'Utworzono użytkownika.';
+$lang['regfail']               = 'Użytkownik nie mógł zostać utworzony.';
+$lang['regmailfail']           = 'Wystąpił błąd przy wysyłaniu hasła pocztą!';
+$lang['regbadmail']            = 'Adres e-mail jest nieprawidłowy!';
+$lang['regbadpass']            = 'Hasła nie są identyczne, spróbuj ponownie.';
+$lang['regpwmail']             = 'Twoje hasło do DokuWiki';
+$lang['reghere']               = 'Nie masz jeszcze konta? Zdobądź je';
+$lang['profna']                = 'To wiki nie pozwala na zmianę profilu.';
+$lang['profnochange']          = 'Żadnych zmian, nic do zrobienia.';
+$lang['profnoempty']           = 'Pusta nazwa lub adres e-mail nie dozwolone.';
+$lang['profchanged']           = 'Zaktualizowano profil użytkownika.';
+$lang['profnodelete']          = 'Ta wiki nie umożliwia usuwania użytkowników';
+$lang['profdeleteuser']        = 'Usuń konto';
+$lang['profdeleted']           = 'Twoje konto zostało usunięte z tej wiki';
+$lang['profconfdelete']        = 'Chcę usunąć moje konto z tej wiki. <br/> Decyzja nie może być cofnięta.';
+$lang['profconfdeletemissing'] = 'Pole potwierdzenia nie zostało zaznaczone';
+$lang['proffail']              = 'Profil użytkownika nie został uaktualniony.';
+$lang['pwdforget']             = 'Nie pamiętasz hasła? Zdobądź nowe!';
+$lang['resendna']              = 'To wiki nie pozwala na powtórne przesyłanie hasła.';
+$lang['resendpwd']             = 'Podaj nowe hasło dla';
+$lang['resendpwdmissing']      = 'Wypełnij wszystkie pola.';
+$lang['resendpwdnouser']       = 'Nie można znaleźć tego użytkownika w bazie danych.';
+$lang['resendpwdbadauth']      = 'Błędny kod autoryzacji! Upewnij się, że użyłeś(aś) właściwego odnośnika.';
+$lang['resendpwdconfirm']      = 'Prośba o potwierdzenie została przesłana pocztą.';
+$lang['resendpwdsuccess']      = 'Nowe hasło zostało wysłane pocztą.';
+$lang['license']               = 'Wszystkie treści w tym wiki, którym nie przyporządkowano licencji, podlegają licencji:';
+$lang['licenseok']             = 'Uwaga: edytując tę stronę zgadzasz się na publikowanie jej treści pod licencją:';
+$lang['searchmedia']           = 'Szukaj pliku o nazwie:';
+$lang['searchmedia_in']        = 'Szukaj w  %s';
+$lang['txt_upload']            = 'Wybierz plik do wysłania:';
+$lang['txt_filename']          = 'Nazwa pliku (opcjonalnie):';
+$lang['txt_overwrt']           = 'Nadpisać istniejący plik?';
+$lang['maxuploadsize']         = 'Maksymalny rozmiar wysyłanych danych wynosi %s dla jednego pliku.';
+$lang['lockedby']              = 'Aktualnie zablokowane przez:';
+$lang['lockexpire']            = 'Blokada wygasa:';
+$lang['js']['willexpire']      = 'Twoja blokada edycji tej strony wygaśnie w ciągu minuty. \nW celu uniknięcia konfliktów użyj przycisku podglądu aby odnowić blokadę.';
+$lang['js']['notsavedyet']     = 'Nie zapisane zmiany zostaną utracone.
+Czy na pewno kontynuować?';
+$lang['js']['searchmedia']     = 'Szukaj plików';
+$lang['js']['keepopen']        = 'Nie zamykaj okna po wyborze';
+$lang['js']['hidedetails']     = 'Ukryj szczegóły';
+$lang['js']['mediatitle']      = 'Ustawienia odnośników';
+$lang['js']['mediadisplay']    = 'Typ odnośnika';
+$lang['js']['mediaalign']      = 'Położenie';
+$lang['js']['mediasize']       = 'Rozmiar grafiki';
+$lang['js']['mediatarget']     = 'Cel odnośnika';
+$lang['js']['mediaclose']      = 'Zamknij';
+$lang['js']['mediainsert']     = 'Wstaw';
+$lang['js']['mediadisplayimg'] = 'Pokaż grafikę';
+$lang['js']['mediadisplaylnk'] = 'Pokaż tylko odnośnik.';
+$lang['js']['mediasmall']      = 'Mały rozmiar';
+$lang['js']['mediamedium']     = 'Średni rozmiar';
+$lang['js']['medialarge']      = 'Duży rozmiar';
+$lang['js']['mediaoriginal']   = 'Wersja oryginalna';
+$lang['js']['medialnk']        = 'Odnośnik do strony ze szczegółami';
+$lang['js']['mediadirect']     = 'Bezpośredni odnośnik do oryginału';
+$lang['js']['medianolnk']      = 'Bez odnośnika';
+$lang['js']['medianolink']     = 'Nie ustawiaj odnośnika do grafiki';
+$lang['js']['medialeft']       = 'Ustaw położenie po lewej stronie.';
+$lang['js']['mediaright']      = 'Ustaw położenie po prawej stronie.';
+$lang['js']['mediacenter']     = 'Ustaw położenie po środku.';
+$lang['js']['medianoalign']    = 'Nie ustawiaj położenia.';
+$lang['js']['nosmblinks']      = 'Odnośniki do zasobów sieci Windows działają tylko w przeglądarce Internet Explorer.
+Możesz skopiować odnośnik.';
+$lang['js']['linkwiz']         = 'Tworzenie odnośników';
+$lang['js']['linkto']          = 'Link do';
+$lang['js']['del_confirm']     = 'Czy na pewno usunąć?';
+$lang['js']['restore_confirm'] = 'Naprawdę przywrócić tą wersję?';
+$lang['js']['media_diff']      = 'Pokaż różnice:';
+$lang['js']['media_diff_both'] = 'Obok siebie';
+$lang['js']['media_diff_opacity'] = 'Przezroczystość';
+$lang['js']['media_diff_portions'] = 'Przesunięcie';
+$lang['js']['media_select']    = 'Wybierz pliki...';
+$lang['js']['media_upload_btn'] = 'Przesłanie plików';
+$lang['js']['media_done_btn']  = 'Zrobione';
+$lang['js']['media_drop']      = 'Upuść tutaj pliki do przesłania';
+$lang['js']['media_cancel']    = 'usuń';
+$lang['js']['media_overwrt']   = 'Nadpisz istniejące pliki';
+$lang['rssfailed']             = 'Wystąpił błąd przy pobieraniu tych danych: ';
+$lang['nothingfound']          = 'Nic nie znaleziono.';
+$lang['mediaselect']           = 'Wysyłanie pliku';
+$lang['uploadsucc']            = 'Wysyłanie powiodło się!';
+$lang['uploadfail']            = 'Błąd wysyłania pliku. Czy prawa do katalogów są poprawne?';
+$lang['uploadwrong']           = 'Wysyłanie zabronione. Nie można wysłać plików z takim rozszerzeniem';
+$lang['uploadexist']           = 'Plik już istnieje, nie wykonano operacji.';
+$lang['uploadbadcontent']      = 'Typ pliku "%s" nie odpowiadał jego rozszerzeniu.';
+$lang['uploadspam']            = 'Plik zablokowany przez filtr antyspamowy.';
+$lang['uploadxss']             = 'Plik zablokowany ze względu na podejrzaną zawartość.';
+$lang['uploadsize']            = 'Plik jest za duży (maksymalny rozmiar %s)';
+$lang['deletesucc']            = 'Plik "%s" został usunięty.';
+$lang['deletefail']            = 'Plik "%s" nie został usunięty, sprawdź uprawnienia.';
+$lang['mediainuse']            = 'Plik "%s" nie został usunięty, ponieważ jest używany.';
+$lang['namespaces']            = 'Katalogi';
+$lang['mediafiles']            = 'Dostępne pliki';
+$lang['accessdenied']          = 'Nie masz uprawnień, żeby wyświetlić tę stronę.';
+$lang['mediausage']            = 'Użyj następującej składni w odnośniku do tego pliku:';
+$lang['mediaview']             = 'Pokaż oryginalny plik';
+$lang['mediaroot']             = 'główny';
+$lang['mediaupload']           = 'Umieść plik w aktualnym katalogu. Aby utworzyć podkatalogi, poprzedź nazwę pliku nazwami katalogów oddzielonymi dwukropkami.';
+$lang['mediaextchange']        = 'Rozszerzenie pliku zmieniono z .%s na .%s!';
+$lang['reference']             = 'Odnośniki do';
+$lang['ref_inuse']             = 'Ten plik nie może być usunięty, ponieważ jest używany na następujących stronach:';
+$lang['ref_hidden']            = 'Odnośniki mogą znajdować się na stronach, do których nie masz uprawnień.';
+$lang['hits']                  = 'trafień';
+$lang['quickhits']             = 'Pasujące hasła';
+$lang['toc']                   = 'Spis treści';
+$lang['current']               = 'aktualna';
+$lang['yours']                 = 'Twoja wersja';
+$lang['diff']                  = 'Pokaż różnice między wersjami';
+$lang['diff2']                 = 'Pokaż różnice między zaznaczonymi wersjami';
+$lang['difflink']              = 'Odnośnik do tego porównania';
+$lang['diff_type']             = 'Zobacz różnice:';
+$lang['diff_inline']           = 'W linii';
+$lang['diff_side']             = 'Jeden obok drugiego';
+$lang['diffprevrev']           = 'Poprzednia wersja';
+$lang['diffnextrev']           = 'Nowa wersja';
+$lang['difflastrev']           = 'Ostatnia wersja';
+$lang['diffbothprevrev']       = 'Poprzednia rewizja po obu stronach';
+$lang['diffbothnextrev']       = 'Następna rewizja po obu stronach';
+$lang['line']                  = 'Linia';
+$lang['breadcrumb']            = 'Ślad:';
+$lang['youarehere']            = 'Jesteś tutaj:';
+$lang['lastmod']               = 'ostatnio zmienione:';
+$lang['by']                    = 'przez';
+$lang['deleted']               = 'usunięto';
+$lang['created']               = 'utworzono';
+$lang['restored']              = 'przywrócono poprzednią wersję (%s)';
+$lang['external_edit']         = 'edycja zewnętrzna';
+$lang['summary']               = 'Opis zmian';
+$lang['noflash']               = 'Plugin <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> jest niezbędny do obejrzenia tej zawartości.';
+$lang['download']              = 'Pobierz zrzut';
+$lang['tools']                 = 'Narzędzia';
+$lang['user_tools']            = 'Narzędzia użytkownika';
+$lang['site_tools']            = 'Narzędzia witryny';
+$lang['page_tools']            = 'Narzędzia strony';
+$lang['skip_to_content']       = 'przejście do zawartości';
+$lang['sidebar']               = 'Pasek boczny';
+$lang['mail_newpage']          = 'Strona dodana:';
+$lang['mail_changed']          = 'Strona zmieniona:';
+$lang['mail_subscribe_list']   = 'Zmienione strony w katalogu:';
+$lang['mail_new_user']         = 'Nowy użytkownik:';
+$lang['mail_upload']           = 'Umieszczono plik:';
+$lang['changes_type']          = 'Zobacz zmiany';
+$lang['pages_changes']         = 'Strony';
+$lang['media_changes']         = 'Pliki multimediów';
+$lang['both_changes']          = 'Zarówno strony jak i pliki multimediów';
+$lang['qb_bold']               = 'Pogrubienie';
+$lang['qb_italic']             = 'Pochylenie';
+$lang['qb_underl']             = 'Podkreślenie';
+$lang['qb_code']               = 'Kod źródłowy';
+$lang['qb_strike']             = 'Przekreślenie';
+$lang['qb_h1']                 = 'Nagłówek 1 stopnia';
+$lang['qb_h2']                 = 'Nagłówek 2 stopnia';
+$lang['qb_h3']                 = 'Nagłówek 3 stopnia';
+$lang['qb_h4']                 = 'Nagłówek 4 stopnia';
+$lang['qb_h5']                 = 'Nagłówek 5 stopnia';
+$lang['qb_h']                  = 'Nagłówek';
+$lang['qb_hs']                 = 'Wybierz nagłówek';
+$lang['qb_hplus']              = 'Nagłówek wyższego stopnia';
+$lang['qb_hminus']             = 'Nagłówek niższego stopnia';
+$lang['qb_hequal']             = 'Nagłówek tego samego stopnia';
+$lang['qb_link']               = 'Odnośnik wewnętrzny';
+$lang['qb_extlink']            = 'Odnośnik zewnętrzny';
+$lang['qb_hr']                 = 'Linia pozioma';
+$lang['qb_ol']                 = 'Numeracja';
+$lang['qb_ul']                 = 'Wypunktowanie';
+$lang['qb_media']              = 'Dodaj obrazek lub inny plik';
+$lang['qb_sig']                = 'Wstaw podpis';
+$lang['qb_smileys']            = 'Emotikony';
+$lang['qb_chars']              = 'Znaki specjalne';
+$lang['upperns']               = 'Skok piętro wyżej';
+$lang['metaedit']              = 'Edytuj metadane';
+$lang['metasaveerr']           = 'Zapis metadanych nie powiódł się';
+$lang['metasaveok']            = 'Metadane zapisano';
+$lang['img_title']             = 'Tytuł:';
+$lang['img_caption']           = 'Nagłówek:';
+$lang['img_date']              = 'Data:';
+$lang['img_fname']             = 'Nazwa pliku:';
+$lang['img_fsize']             = 'Rozmiar:';
+$lang['img_artist']            = 'Fotograf:';
+$lang['img_copyr']             = 'Prawa autorskie:';
+$lang['img_format']            = 'Format:';
+$lang['img_camera']            = 'Aparat:';
+$lang['img_keywords']          = 'Słowa kluczowe:';
+$lang['img_width']             = 'Szerokość:';
+$lang['img_height']            = 'Wysokość:';
+$lang['subscr_subscribe_success'] = 'Dodano %s do listy subskrypcji %s';
+$lang['subscr_subscribe_error'] = 'Błąd podczas dodawania %s do listy subskrypcji %s';
+$lang['subscr_subscribe_noaddress'] = 'Brak adresu skojarzonego z twoim loginem, nie możesz zostać dodany(a) do listy subskrypcji';
+$lang['subscr_unsubscribe_success'] = 'Usunięto %s z listy subskrypcji %s';
+$lang['subscr_unsubscribe_error'] = 'Błąd podczas usuwania %s z listy subskrypcji %s';
+$lang['subscr_already_subscribed'] = '%s jest już subskrybowany(a) przez %s';
+$lang['subscr_not_subscribed'] = '%s nie jest subskrybowany(a) przez %s';
+$lang['subscr_m_not_subscribed'] = 'Obecnie nie subskrybujesz bieżącej strony lub katalogu.';
+$lang['subscr_m_new_header']   = 'Dodaj subskrypcję';
+$lang['subscr_m_current_header'] = 'Aktualne subskrypcje';
+$lang['subscr_m_unsubscribe']  = 'Zrezygnuj z subskrypcji';
+$lang['subscr_m_subscribe']    = 'Subskrybuj';
+$lang['subscr_m_receive']      = 'Otrzymuj';
+$lang['subscr_style_every']    = 'email przy każdej zmianie';
+$lang['subscr_style_digest']   = 'e-mailowy wyciąg zmian dla każdej strony (co %.2f dni)';
+$lang['subscr_style_list']     = 'lista zmienionych stron od ostatniego e-maila (co %.2f dni)';
+$lang['authtempfail']          = 'Uwierzytelnienie użytkownika jest w tej chwili niemożliwe. Jeśli ta sytuacja się powtórzy, powiadom administratora tego wiki.';
+$lang['i_chooselang']          = 'Wybierz język';
+$lang['i_installer']           = 'Instalator DokuWiki';
+$lang['i_wikiname']            = 'Nazwa Wiki';
+$lang['i_enableacl']           = 'Włącz mechanizm uprawnień ACL (zalecane)';
+$lang['i_superuser']           = 'Administrator';
+$lang['i_problems']            = 'Instalator napotkał poniższe problemy. Nie można kontynuować póki nie zostaną usunięte.';
+$lang['i_modified']            = 'Ze względów bezpieczeństwa, ten skrypt działa tylko z nową i niezmodyfikowaną instalacją DokuWiki.
+Aby uruchomić instalator ponownie, rozpakuj archiwum DokuWiki lub zapoznaj się z <a href="http://dokuwiki.org/install">instrukcją instalacji Dokuwiki</a>';
+$lang['i_funcna']              = 'Funkcja PHP <code>%s</code> jest niedostępna.';
+$lang['i_phpver']              = 'Wersja PHP <code>%s</code> jest niższa od wymaganej <code>%s</code>. Zaktualizuj instalację PHP.';
+$lang['i_mbfuncoverload']      = 'mbstring.func_overload musi zostać wyłączone w pliku php.ini aby móc uruchomić DokuWiki.';
+$lang['i_permfail']            = 'DokuWiki nie ma prawa zapisu w katalogu <code>%s</code>. Zmień uprawnienia zapisu dla tego katalogu!';
+$lang['i_confexists']          = '<code>%s</code> już istnieje';
+$lang['i_writeerr']            = 'Nie można utworzyć <code>%s</code>. Sprawdź uprawnienia do katalogu lub pliku i stwórz plik ręcznie.';
+$lang['i_badhash']             = 'nierozpoznany lub zmodyfikowany plik dokuwiki.php (skrót=<code>%s</code>)';
+$lang['i_badval']              = '<code>%s</code> - nieprawidłowa wartość lub jej brak';
+$lang['i_success']             = 'Konfiguracja pomyślnie zakończona. Możesz teraz usunąć plik install.php. Przejdź do <a href="doku.php?id=wiki:welcome">Twojego nowego DokuWiki</a>.';
+$lang['i_failure']             = 'Podczas zapisu plików konfiguracyjnych wystąpiły błędy. Musisz usunąć wszystkie problemy, zanim zaczniesz korzystać z <a href="doku.php?id=wiki:welcome">Twojego nowego DokuWiki</a>.';
+$lang['i_policy']              = 'Wstępna polityka uprawnień ACL';
+$lang['i_pol0']                = 'Otwarte Wiki (odczyt, zapis i dodawanie plików dla wszystkich)';
+$lang['i_pol1']                = 'Publiczne Wiki (odczyt dla wszystkich, zapis i dodawanie plików tylko dla zarejestrowanych użytkowników)';
+$lang['i_pol2']                = 'Zamknięte Wiki (odczyt, zapis i dodawanie plików tylko dla zarejestrowanych użytkowników)';
+$lang['i_allowreg']            = 'Pozwól użytkownikom rejestrować się.';
+$lang['i_retry']               = 'Spróbuj ponownie';
+$lang['i_license']             = 'Wybierz licencję, na warunkach której chcesz udostępniać treści:';
+$lang['i_license_none']        = 'Nie pokazuj żadnych informacji o licencji.';
+$lang['i_pop_field']           = 'Proszę, pomóż nam ulepszyć doświadczenia z DokuWiki:';
+$lang['i_pop_label']           = 'Raz na miesiąc, wysyłaj anonimowe statystyki do deweloperów DokuWiki';
+$lang['recent_global']         = 'W tej chwili przeglądasz zmiany w katalogu <b>%s</b>. Możesz przejrzeć także <a href="%s">zmiany w całym wiki</a>.';
+$lang['years']                 = '%d lat temu';
+$lang['months']                = '%d miesięcy temu';
+$lang['weeks']                 = '%d tygodni temu';
+$lang['days']                  = '%d dni temu';
+$lang['hours']                 = '%d godzin temu';
+$lang['minutes']               = '%d minut temu';
+$lang['seconds']               = '%d sekund temu';
+$lang['wordblock']             = 'Twoje ustawienia nie zostały zapisane ponieważ zawierają niedozwoloną treść (spam).';
+$lang['media_uploadtab']       = 'Przesyłanie plików';
+$lang['media_searchtab']       = 'Szukaj';
+$lang['media_file']            = 'Plik';
+$lang['media_viewtab']         = 'Widok';
+$lang['media_edittab']         = 'Zmiana';
+$lang['media_historytab']      = 'Historia';
+$lang['media_list_thumbs']     = 'Miniatury';
+$lang['media_list_rows']       = 'Wiersze';
+$lang['media_sort_name']       = 'Nazwa';
+$lang['media_sort_date']       = 'Data';
+$lang['media_namespaces']      = 'Wybierz katalog';
+$lang['media_files']           = 'Pliki w %s';
+$lang['media_upload']          = 'Przesyłanie plików na %s';
+$lang['media_search']          = 'Znajdź w %s';
+$lang['media_view']            = '%s';
+$lang['media_viewold']         = '%s na %s';
+$lang['media_edit']            = 'Zmień %s';
+$lang['media_history']         = 'Historia dla %s';
+$lang['media_meta_edited']     = 'zmienione metadane';
+$lang['media_perm_read']       = 'Przepraszamy, nie masz wystarczających uprawnień do odczytu plików.';
+$lang['media_perm_upload']     = 'Przepraszamy, nie masz wystarczających uprawnień do przesyłania plików.';
+$lang['media_update']          = 'Prześlij nową wersję';
+$lang['media_restore']         = 'Odtwórz tą wersję';
+$lang['media_acl_warning']     = 'Ta lista może nie być kompletna ze względu na ograniczenia ACL oraz ukryte strony.';
+$lang['currentns']             = 'Obecny katalog';
+$lang['searchresult']          = 'Wyniki wyszukiwania';
+$lang['plainhtml']             = 'Czysty HTML';
+$lang['wikimarkup']            = 'Znaczniki';
+$lang['page_nonexist_rev']     = 'Strona nie istnieje w %s. Została następnie utworzony w <a href="%s">%s</a>.';
+$lang['unable_to_parse_date']  = 'Nie można przeanalizować parametru "%s".';
+$lang['email_signature_text']  = 'List został wygenerowany przez DokuWiki pod adresem
+@DOKUWIKIURL@';
diff --git a/wiki/inc/lang/pl/locked.txt b/wiki/inc/lang/pl/locked.txt
new file mode 100644
index 0000000..e3e05fe
--- /dev/null
+++ b/wiki/inc/lang/pl/locked.txt
@@ -0,0 +1,3 @@
+====== Strona zablokowana ======
+
+Ta strona jest zablokowana do edycji przez innego użytkownika. Musisz zaczekać aż użytkownik zakończy redagowanie lub jego blokada wygaśnie.
diff --git a/wiki/inc/lang/pl/login.txt b/wiki/inc/lang/pl/login.txt
new file mode 100644
index 0000000..b60427f
--- /dev/null
+++ b/wiki/inc/lang/pl/login.txt
@@ -0,0 +1,4 @@
+====== Logowanie ======
+
+Wprowadź nazwę użytkownika i hasło aby się zalogować. Twoja przeglądarka musi mieć włączoną obsługę ciasteczek (cookies).
+
diff --git a/wiki/inc/lang/pl/mailtext.txt b/wiki/inc/lang/pl/mailtext.txt
new file mode 100644
index 0000000..cae98db
--- /dev/null
+++ b/wiki/inc/lang/pl/mailtext.txt
@@ -0,0 +1,13 @@
+Strona w Twoim DokuWiki została dodana lub zmieniona.
+Szczegółowe informacje:
+
+Data         : @DATE@
+Przeglądarka : @BROWSER@
+Adres IP     : @IPADDRESS@
+Nazwa DNS    : @HOSTNAME@
+Stara wersja : @OLDPAGE@
+Nowa wersja  : @NEWPAGE@
+Opis zmian   : @SUMMARY@
+Użytkownik   : @USER@
+
+@DIFF@
diff --git a/wiki/inc/lang/pl/mailwrap.html b/wiki/inc/lang/pl/mailwrap.html
new file mode 100644
index 0000000..d257190
--- /dev/null
+++ b/wiki/inc/lang/pl/mailwrap.html
@@ -0,0 +1,13 @@
+<html>
+<head>
+<title>@TITLE@</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+</head>
+<body>
+
+@HTMLBODY@
+
+<br /><hr />
+<small>@EMAILSIGNATURE@</small>
+</body>
+</html>
\ No newline at end of file
diff --git a/wiki/inc/lang/pl/newpage.txt b/wiki/inc/lang/pl/newpage.txt
new file mode 100644
index 0000000..532d3f4
--- /dev/null
+++ b/wiki/inc/lang/pl/newpage.txt
@@ -0,0 +1,4 @@
+====== Ta strona jeszcze nie istnieje ======
+
+Jesteś na stronie, która jeszcze nie istnieje. Jeśli masz wystarczające uprawnienia, możesz utworzyć tę stronę klikając ''utwórz stronę''.
+
diff --git a/wiki/inc/lang/pl/norev.txt b/wiki/inc/lang/pl/norev.txt
new file mode 100644
index 0000000..858e4a8
--- /dev/null
+++ b/wiki/inc/lang/pl/norev.txt
@@ -0,0 +1,4 @@
+====== Nie ma takiej wersji ======
+
+Nie ma takiej wersji. Kliknij przycisk ''poprzednie wersje'', aby wyświetlić listę wszystkich wersji tej strony.
+
diff --git a/wiki/inc/lang/pl/password.txt b/wiki/inc/lang/pl/password.txt
new file mode 100644
index 0000000..745556f
--- /dev/null
+++ b/wiki/inc/lang/pl/password.txt
@@ -0,0 +1,6 @@
+Witaj @FULLNAME@!
+
+Dane użytkownika @TITLE@ pod adresem @DOKUWIKIURL@
+
+Użytkownik : @LOGIN@
+Hasło      : @PASSWORD@
diff --git a/wiki/inc/lang/pl/preview.txt b/wiki/inc/lang/pl/preview.txt
new file mode 100644
index 0000000..41a123c
--- /dev/null
+++ b/wiki/inc/lang/pl/preview.txt
@@ -0,0 +1,4 @@
+====== Podgląd ======
+
+To jest podgląd edytowanej strony. Pamiętaj, że ta strona **nie** jest jeszcze zapisana!
+
diff --git a/wiki/inc/lang/pl/pwconfirm.txt b/wiki/inc/lang/pl/pwconfirm.txt
new file mode 100644
index 0000000..989de79
--- /dev/null
+++ b/wiki/inc/lang/pl/pwconfirm.txt
@@ -0,0 +1,9 @@
+Witaj @FULLNAME@!
+
+Potwierdzenie prośby o nowe hasło dla konta @TITLE@ w wiki @DOKUWIKIURL@
+
+Jeśli to nie Ty prosiłeś(aś) o nowe hasło, zignoruj ten list.
+
+Aby potwierdzić prośbę o hasło, przejdź na następującą stronę.
+
+@CONFIRM@
diff --git a/wiki/inc/lang/pl/read.txt b/wiki/inc/lang/pl/read.txt
new file mode 100644
index 0000000..5f89fd9
--- /dev/null
+++ b/wiki/inc/lang/pl/read.txt
@@ -0,0 +1,2 @@
+Ta strona jest tylko do odczytu. Możesz wyświetlić źródła tej strony ale nie możesz ich zmienić.
+
diff --git a/wiki/inc/lang/pl/recent.txt b/wiki/inc/lang/pl/recent.txt
new file mode 100644
index 0000000..65a776c
--- /dev/null
+++ b/wiki/inc/lang/pl/recent.txt
@@ -0,0 +1,5 @@
+====== Ostatnie zmiany ======
+
+Ostatnio zmienione strony.
+
+
diff --git a/wiki/inc/lang/pl/register.txt b/wiki/inc/lang/pl/register.txt
new file mode 100644
index 0000000..91b761d
--- /dev/null
+++ b/wiki/inc/lang/pl/register.txt
@@ -0,0 +1,4 @@
+====== Rejestracja nowego użytkownika ======
+
+Wypełnij wszystkie pola formularza aby utworzyć nowe konto w tym wiki. Pamiętaj, żeby podać **poprawny adres e-mail**, ponieważ nowe hasło może zostać do Ciebie przesłane pocztą. Nazwa użytkownika powinna być zgodna z formatem [[doku>pagename|nazw stron]].
+
diff --git a/wiki/inc/lang/pl/registermail.txt b/wiki/inc/lang/pl/registermail.txt
new file mode 100644
index 0000000..0022967
--- /dev/null
+++ b/wiki/inc/lang/pl/registermail.txt
@@ -0,0 +1,11 @@
+Zarejestrował się nowy użytkownik.
+Szczegółowe informacje:
+
+Użytkownik      : @NEWUSER@
+Imię i nazwisko : @NEWNAME@
+E-mail          : @NEWEMAIL@
+
+Data            : @DATE@
+Przeglądarka    : @BROWSER@
+Adres IP        : @IPADDRESS@
+Nazwa DNS       : @HOSTNAME@
diff --git a/wiki/inc/lang/pl/resendpwd.txt b/wiki/inc/lang/pl/resendpwd.txt
new file mode 100644
index 0000000..a7cac74
--- /dev/null
+++ b/wiki/inc/lang/pl/resendpwd.txt
@@ -0,0 +1,4 @@
+====== Przesyłanie nowego hasła ======
+
+Aby otrzymać nowe hasło, podaj nazwę Twojego konta w tym wiki. Prośba o potwierdzenie w postaci odnośnika zostanie Ci przesłana pocztą elektroniczną.
+
diff --git a/wiki/inc/lang/pl/resetpwd.txt b/wiki/inc/lang/pl/resetpwd.txt
new file mode 100644
index 0000000..64d2d7d
--- /dev/null
+++ b/wiki/inc/lang/pl/resetpwd.txt
@@ -0,0 +1,3 @@
+====== Ustalenie nowego hasła ======
+
+Podaj, proszę, nowe hasło do Twojego konta w tym wiki.
\ No newline at end of file
diff --git a/wiki/inc/lang/pl/revisions.txt b/wiki/inc/lang/pl/revisions.txt
new file mode 100644
index 0000000..afe2b64
--- /dev/null
+++ b/wiki/inc/lang/pl/revisions.txt
@@ -0,0 +1,4 @@
+====== Poprzednie wersje ======
+
+Poprzednie wersje tej strony. Aby przywrócić poprzednią wersję wybierz ją, rozpocznij edycję a potem zapisz.
+
diff --git a/wiki/inc/lang/pl/searchpage.txt b/wiki/inc/lang/pl/searchpage.txt
new file mode 100644
index 0000000..70e1de6
--- /dev/null
+++ b/wiki/inc/lang/pl/searchpage.txt
@@ -0,0 +1,4 @@
+====== Wyszukiwanie ======
+
+Wyniki wyszukiwania. @CREATEPAGEINFO@
+
diff --git a/wiki/inc/lang/pl/showrev.txt b/wiki/inc/lang/pl/showrev.txt
new file mode 100644
index 0000000..43e826e
--- /dev/null
+++ b/wiki/inc/lang/pl/showrev.txt
@@ -0,0 +1,2 @@
+**To jest stara wersja strony!**
+----
diff --git a/wiki/inc/lang/pl/stopwords.txt b/wiki/inc/lang/pl/stopwords.txt
new file mode 100644
index 0000000..f1d244a
--- /dev/null
+++ b/wiki/inc/lang/pl/stopwords.txt
@@ -0,0 +1,89 @@
+# Lista słów ignorowanych przy indeksowaniu treści.
+# W jednej linii powinno znajdować się tylko jedno słowo.
+# Przy edycji tego pliku pamiętaj o używaniu uniksowego końca linii (LF).
+# Nie ma potrzeby wpisywania słów krótszych niż 3 znaki, ponieważ one są zawsze ignorowane.
+# Lista oparta na danych ze strony http://www.ranks.nl/stopwords/
+aby
+ale
+bardziej
+bardzo
+bez
+bowiem
+był
+była
+było
+były
+będzie
+czy
+czyli
+dla
+dlatego
+gdy
+gdzie
+ich
+innych
+jak
+jako
+jednak
+jego
+jej
+jest
+jeszcze
+jeśli
+już
+kiedy
+kilka
+która
+które
+którego
+której
+który
+których
+którym
+którzy
+lub
+między
+mnie
+mogą
+może
+można
+nad
+nam
+nas
+naszego
+naszych
+nawet
+nich
+nie
+nim
+niż
+oraz
+pod
+poza
+przed
+przede
+przez
+przy
+również
+się
+sobie
+swoje
+tak
+takie
+także
+tam
+tego
+tej
+ten
+też
+tych
+tylko
+tym
+wiele
+wielu
+więc
+wszystkich
+wszystkim
+wszystko
+właśnie
+zawsze
diff --git a/wiki/inc/lang/pl/subscr_digest.txt b/wiki/inc/lang/pl/subscr_digest.txt
new file mode 100644
index 0000000..7abbb35
--- /dev/null
+++ b/wiki/inc/lang/pl/subscr_digest.txt
@@ -0,0 +1,17 @@
+Witaj!
+
+Treść strony @PAGE@ na wiki @TITLE@ uległa
+następującym zmianom:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Stara wersja: @OLDPAGE@
+Nowa wersja: @NEWPAGE@
+
+Aby zrezygnować z powiadomień o zmianach zaloguj się do wiki na
+@DOKUWIKIURL@, a następnie odwiedź
+@SUBSCRIBE@
+i anuluj otrzymywanie powiadomień o zmianach na stronach i/lub
+katalogach.
diff --git a/wiki/inc/lang/pl/subscr_form.txt b/wiki/inc/lang/pl/subscr_form.txt
new file mode 100644
index 0000000..59fdbdb
--- /dev/null
+++ b/wiki/inc/lang/pl/subscr_form.txt
@@ -0,0 +1,3 @@
+====== Zarządzanie Subskrypcją  ======
+
+Ta strona pozwala Tobie na zarządzanie Twoimi subskrypcjami dla obecnej strony i katalogu.
\ No newline at end of file
diff --git a/wiki/inc/lang/pl/subscr_list.txt b/wiki/inc/lang/pl/subscr_list.txt
new file mode 100644
index 0000000..633225f
--- /dev/null
+++ b/wiki/inc/lang/pl/subscr_list.txt
@@ -0,0 +1,14 @@
+Witaj!
+
+Strony w katalogu @PAGE@ na wiki @TITLE@ uległy
+następującym zmianom:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Aby zrezygnować z powiadomień o zmianach zaloguj się do wiki na
+@DOKUWIKIURL@, a następnie odwiedź
+@SUBSCRIBE@
+i anuluj otrzymywanie powiadomień o zmianach na stronach i/lub
+katalogach.
diff --git a/wiki/inc/lang/pl/subscr_single.txt b/wiki/inc/lang/pl/subscr_single.txt
new file mode 100644
index 0000000..0c8c3ea
--- /dev/null
+++ b/wiki/inc/lang/pl/subscr_single.txt
@@ -0,0 +1,20 @@
+Witaj!
+
+Treść strony @PAGE@ na wiki @TITLE@ uległa
+następującym zmianom:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Data: @DATE@
+Użytkownik: @USER@
+Podsumowanie zmian: @SUMMARY@
+Stara wersja: @OLDPAGE@
+Nowa wersja: @NEWPAGE@
+
+Aby zrezygnować z powiadomień o zmianach zaloguj się do wiki na
+@DOKUWIKIURL@, a następnie odwiedź
+@SUBSCRIBE@
+i anuluj otrzymywanie powiadomień o zmianach na stronach i/lub
+katalogach.
diff --git a/wiki/inc/lang/pl/updateprofile.txt b/wiki/inc/lang/pl/updateprofile.txt
new file mode 100644
index 0000000..aa80f4c
--- /dev/null
+++ b/wiki/inc/lang/pl/updateprofile.txt
@@ -0,0 +1,5 @@
+====== Aktualizacja profilu użytkownika ======
+
+Wystarczy, że wypełnisz tylko te pola, które chcesz zmienić. Nie możesz zmienić nazwy użytkownika.
+
+
diff --git a/wiki/inc/lang/pl/uploadmail.txt b/wiki/inc/lang/pl/uploadmail.txt
new file mode 100644
index 0000000..a8daa05
--- /dev/null
+++ b/wiki/inc/lang/pl/uploadmail.txt
@@ -0,0 +1,12 @@
+Umieszczono nowy plik.
+
+Szczegóły:
+
+Plik         : @MEDIA@
+Data         : @DATE@
+Przeglądarka : @BROWSER@
+Adres IP     : @IPADDRESS@
+Nazwa DNS    : @HOSTNAME@
+Rozmiar      : @SIZE@
+Typ MIME     : @MIME@
+Użytkownik   : @USER@
diff --git a/wiki/inc/lang/pt-br/admin.txt b/wiki/inc/lang/pt-br/admin.txt
new file mode 100644
index 0000000..f8be56e
--- /dev/null
+++ b/wiki/inc/lang/pt-br/admin.txt
@@ -0,0 +1,4 @@
+====== Administração ======
+
+Abaixo você encontra uma lista das tarefas administrativas disponíveis no DokuWiki.
+
diff --git a/wiki/inc/lang/pt-br/adminplugins.txt b/wiki/inc/lang/pt-br/adminplugins.txt
new file mode 100644
index 0000000..3eac7af
--- /dev/null
+++ b/wiki/inc/lang/pt-br/adminplugins.txt
@@ -0,0 +1 @@
+===== Plugins Adicionais =====
\ No newline at end of file
diff --git a/wiki/inc/lang/pt-br/backlinks.txt b/wiki/inc/lang/pt-br/backlinks.txt
new file mode 100644
index 0000000..fce9dba
--- /dev/null
+++ b/wiki/inc/lang/pt-br/backlinks.txt
@@ -0,0 +1,4 @@
+====== Links reversos ======
+
+Esta é uma lista de todas as páginas que apresentam links para a página atual.
+
diff --git a/wiki/inc/lang/pt-br/conflict.txt b/wiki/inc/lang/pt-br/conflict.txt
new file mode 100644
index 0000000..53d9afa
--- /dev/null
+++ b/wiki/inc/lang/pt-br/conflict.txt
@@ -0,0 +1,5 @@
+====== Existe uma nova versão ======
+
+Existe uma versão mais nova do documento que você editou. Isso acontece quando outro usuário modifica o documento enquanto você o está editando.
+
+Examine as diferenças mostradas abaixo atentamente e então decida qual versão deve permanecer. Se você selecionar ''Salvar'', sua versão será salva. Pressione ''Cancelar'' para manter a versão atual.
diff --git a/wiki/inc/lang/pt-br/denied.txt b/wiki/inc/lang/pt-br/denied.txt
new file mode 100644
index 0000000..9a71df6
--- /dev/null
+++ b/wiki/inc/lang/pt-br/denied.txt
@@ -0,0 +1,4 @@
+====== Permissão Negada ======
+
+Desculpe, você não tem permissões suficientes para continuar.
+
diff --git a/wiki/inc/lang/pt-br/diff.txt b/wiki/inc/lang/pt-br/diff.txt
new file mode 100644
index 0000000..517d9f2
--- /dev/null
+++ b/wiki/inc/lang/pt-br/diff.txt
@@ -0,0 +1,3 @@
+====== Diferenças ======
+
+Aqui você vê as diferenças entre duas revisões dessa página.
diff --git a/wiki/inc/lang/pt-br/draft.txt b/wiki/inc/lang/pt-br/draft.txt
new file mode 100644
index 0000000..b3d345c
--- /dev/null
+++ b/wiki/inc/lang/pt-br/draft.txt
@@ -0,0 +1,5 @@
+====== Rascunho encontrado ======
+
+A sua última sessão de edição não foi concluída corretamente. O DokuWiki automaticamente salvou um rascunho durante o seu trabalho, que você pode usar agora para continuar a sua edição. Abaixo você pode ver os dados que foram salvos na sua última sessão.
+
+Por favor, escolha se você quer //recuperar// sua sessão de edição perdida, //excluir// o rascunho salvo automaticamente ou //cancelar// o processo de edição.
\ No newline at end of file
diff --git a/wiki/inc/lang/pt-br/edit.txt b/wiki/inc/lang/pt-br/edit.txt
new file mode 100644
index 0000000..113fb8e
--- /dev/null
+++ b/wiki/inc/lang/pt-br/edit.txt
@@ -0,0 +1,2 @@
+Edite a página e clique em ''Salvar''. Veja [[wiki:syntax|aqui]] a sintaxe do Wiki. Por favor, edite a página apenas se você puder **aprimorá-la**. Se você deseja testar alguma coisa, faça-o no [[playground:playground|playground]].
+
diff --git a/wiki/inc/lang/pt-br/editrev.txt b/wiki/inc/lang/pt-br/editrev.txt
new file mode 100644
index 0000000..df64135
--- /dev/null
+++ b/wiki/inc/lang/pt-br/editrev.txt
@@ -0,0 +1,4 @@
+**Você carregou uma revisão antiga desse documento!** Se você salvá-la, irá criar uma nova versão com esses dados.
+----
+
+
diff --git a/wiki/inc/lang/pt-br/index.txt b/wiki/inc/lang/pt-br/index.txt
new file mode 100644
index 0000000..816a499
--- /dev/null
+++ b/wiki/inc/lang/pt-br/index.txt
@@ -0,0 +1,3 @@
+====== Índice ======
+
+Esse é um índice de todas as páginas disponíveis, ordenadas por [[doku>namespaces|domínios]].
\ No newline at end of file
diff --git a/wiki/inc/lang/pt-br/install.html b/wiki/inc/lang/pt-br/install.html
new file mode 100644
index 0000000..d1b7869
--- /dev/null
+++ b/wiki/inc/lang/pt-br/install.html
@@ -0,0 +1,7 @@
+<p>Essa página irá auxiliá-lo na instalação e configuração do <a href="http://dokuwiki.org">DokuWiki</a>. Você encontra mais informações sobre esse instalador na sua <a href="http://dokuwiki.org/installer">página de documentação</a>.</p>
+
+<p>O DokuWiki utiliza arquivos em texto simples para o armazenamento das páginas wiki e de outras informações associadas a essas páginas (ex.: imagens, índices de pesquisa, revisões antigas, etc.). Para que o DokuWiki funcione corretamente, ele <strong>precisa</strong> ter permissão de escrita aos diretórios onde esses arquivos ficarão armazenados. Esse instalador não tem capacidade de configurar as permissões de diretório. Isso normalmente é feito usando-se a linha de comando ou através do FTP ou do painel de controle da sua hospedagem (ex.: cPanel).</p>
+
+<p>O instalador irá definir as configurações da <abbr title="access control list (lista de controle de acessos)">ACL</abbr> do seu DokuWiki, o que permitirá a autenticação do administrador e o acesso ao menu de administração do sistema. Esse menu é utilizado para instalar plug-ins, alterar as configurações do ambiente e gerenciar usuários e acessos às páginas do wiki. Isso não é necessário para o funcionamento do DokuWiki, mas irá torna sua administração mais simples.</p>
+
+<p>Usuários experientes ou que necessitem efetuar configurações especiais devem utilizar os seguintes links, com instruções detalhadas da <a href="http://dokuwiki.org/install">instalação</a> e da <a href="http://dokuwiki.org/config">configuração</a>.</p>
\ No newline at end of file
diff --git a/wiki/inc/lang/pt-br/jquery.ui.datepicker.js b/wiki/inc/lang/pt-br/jquery.ui.datepicker.js
new file mode 100644
index 0000000..aeae7ca
--- /dev/null
+++ b/wiki/inc/lang/pt-br/jquery.ui.datepicker.js
@@ -0,0 +1,45 @@
+/* Brazilian initialisation for the jQuery UI date picker plugin. */
+/* Written by Leonildo Costa Silva (leocsilva@gmail.com). */
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "../widgets/datepicker" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery.datepicker );
+	}
+}( function( datepicker ) {
+
+datepicker.regional[ "pt-BR" ] = {
+	closeText: "Fechar",
+	prevText: "&#x3C;Anterior",
+	nextText: "Próximo&#x3E;",
+	currentText: "Hoje",
+	monthNames: [ "Janeiro","Fevereiro","Março","Abril","Maio","Junho",
+	"Julho","Agosto","Setembro","Outubro","Novembro","Dezembro" ],
+	monthNamesShort: [ "Jan","Fev","Mar","Abr","Mai","Jun",
+	"Jul","Ago","Set","Out","Nov","Dez" ],
+	dayNames: [
+		"Domingo",
+		"Segunda-feira",
+		"Terça-feira",
+		"Quarta-feira",
+		"Quinta-feira",
+		"Sexta-feira",
+		"Sábado"
+	],
+	dayNamesShort: [ "Dom","Seg","Ter","Qua","Qui","Sex","Sáb" ],
+	dayNamesMin: [ "Dom","Seg","Ter","Qua","Qui","Sex","Sáb" ],
+	weekHeader: "Sm",
+	dateFormat: "dd/mm/yy",
+	firstDay: 0,
+	isRTL: false,
+	showMonthAfterYear: false,
+	yearSuffix: "" };
+datepicker.setDefaults( datepicker.regional[ "pt-BR" ] );
+
+return datepicker.regional[ "pt-BR" ];
+
+} ) );
diff --git a/wiki/inc/lang/pt-br/lang.php b/wiki/inc/lang/pt-br/lang.php
new file mode 100644
index 0000000..f671f9c
--- /dev/null
+++ b/wiki/inc/lang/pt-br/lang.php
@@ -0,0 +1,361 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Frederico Gonçalves Guimarães <frederico@teia.bio.br>
+ * @author Luis Fernando Enciso <lfenciso@certto.com.br>
+ * @author Alauton/Loug
+ * @author Felipe Castro <fefcas@gmail.com>
+ * @author Lucien Raven <lucienraven@yahoo.com.br>
+ * @author Enrico Nicoletto <liverig@gmail.com>
+ * @author Flávio Veras <flaviove@gmail.com>
+ * @author Jeferson Propheta <jeferson.propheta@gmail.com>
+ * @author jair.henrique <jair.henrique@gmail.com>
+ * @author Luis Dantas <luis@dantas.com>
+ * @author Sergio Motta <sergio@cisne.com.br>
+ * @author Isaias Masiero Filho <masiero@masiero.org>
+ * @author Balaco Baco <balacobaco@imap.cc>
+ * @author Victor Westmann <victor.westmann@gmail.com>
+ * @author Leone Lisboa Magevski <leone1983@gmail.com>
+ * @author Dário Estevão <darioems@gmail.com>
+ * @author Juliano Marconi Lanigra <juliano.marconi@gmail.com>
+ * @author Ednei <leuloch@gmail.com>
+ * @author Hudson FAS <hudsonfas@gmail.com>
+ * @author Guilherme Cardoso <guicardoso@gmail.com>
+ * @author Viliam Dias <viliamjr@gmail.com>
+ */
+$lang['encoding']              = 'utf-8';
+$lang['direction']             = 'ltr';
+$lang['doublequoteopening']    = '“';
+$lang['doublequoteclosing']    = '”';
+$lang['singlequoteopening']    = '‘';
+$lang['singlequoteclosing']    = '’';
+$lang['apostrophe']            = '’';
+$lang['btn_edit']              = 'Editar esta página';
+$lang['btn_source']            = 'Mostrar código fonte';
+$lang['btn_show']              = 'Mostrar página';
+$lang['btn_create']            = 'Criar esta página';
+$lang['btn_search']            = 'Pesquisar';
+$lang['btn_save']              = 'Salvar';
+$lang['btn_preview']           = 'Visualizar';
+$lang['btn_top']               = 'Voltar ao topo';
+$lang['btn_newer']             = '<< mais recente';
+$lang['btn_older']             = 'menos recente >>';
+$lang['btn_revs']              = 'Revisões anteriores';
+$lang['btn_recent']            = 'Alterações recentes';
+$lang['btn_upload']            = 'Enviar';
+$lang['btn_cancel']            = 'Cancelar';
+$lang['btn_index']             = 'Índice';
+$lang['btn_secedit']           = 'Editar';
+$lang['btn_login']             = 'Entrar';
+$lang['btn_logout']            = 'Sair';
+$lang['btn_admin']             = 'Administrar';
+$lang['btn_update']            = 'Atualizar';
+$lang['btn_delete']            = 'Excluir';
+$lang['btn_back']              = 'Voltar';
+$lang['btn_backlink']          = 'Links reversos';
+$lang['btn_subscribe']         = 'Monitorar alterações';
+$lang['btn_profile']           = 'Atualizar o perfil';
+$lang['btn_reset']             = 'Limpar';
+$lang['btn_resendpwd']         = 'Definir a nova senha';
+$lang['btn_draft']             = 'Editar o rascunho';
+$lang['btn_recover']           = 'Recuperar o rascunho';
+$lang['btn_draftdel']          = 'Excluir o rascunho';
+$lang['btn_revert']            = 'Restaurar';
+$lang['btn_register']          = 'Cadastre-se';
+$lang['btn_apply']             = 'Aplicar';
+$lang['btn_media']             = 'Gerenciador de mídias';
+$lang['btn_deleteuser']        = 'Remover minha conta';
+$lang['btn_img_backto']        = 'Voltar para %s';
+$lang['btn_mediaManager']      = 'Ver no gerenciador de mídias';
+$lang['loggedinas']            = 'Identificado(a) como:';
+$lang['user']                  = 'Nome de usuário';
+$lang['pass']                  = 'Senha';
+$lang['newpass']               = 'Nova senha';
+$lang['oldpass']               = 'Confirme a senha atual';
+$lang['passchk']               = 'Outra vez';
+$lang['remember']              = 'Lembre-se de mim';
+$lang['fullname']              = 'Nome completo';
+$lang['email']                 = 'E-mail';
+$lang['profile']               = 'Perfil do usuário';
+$lang['badlogin']              = 'Desculpe, mas o nome de usuário ou a senha estão incorretos.';
+$lang['badpassconfirm']        = 'Desculpe, mas a senha está errada ';
+$lang['minoredit']             = 'Alterações mínimas';
+$lang['draftdate']             = 'O rascunho foi salvo automaticamente em';
+$lang['nosecedit']             = 'A página foi modificada nesse intervalo de tempo. Como a informação da seção estava desatualizada, foi carregada a página inteira.';
+$lang['regmissing']            = 'Desculpe, mas você precisa preencher todos os campos.';
+$lang['reguexists']            = 'Desculpe, mas já existe um usuário com esse nome.';
+$lang['regsuccess']            = 'O usuário foi criado e a senha enviada para seu e-mail.';
+$lang['regsuccess2']           = 'O usuário foi criado.';
+$lang['regfail']               = 'Não foi possível criar esse usuário.';
+$lang['regmailfail']           = 'Aparentemente ocorreu um erro no envio da senha. Por favor, entre em contato com o administrador!';
+$lang['regbadmail']            = 'O endereço de e-mail fornecido é, aparentemente, inválido - se você acha que isso é um erro, entre em contato com o administrador';
+$lang['regbadpass']            = 'As senhas digitadas não são idênticas. Por favor, tente novamente.';
+$lang['regpwmail']             = 'A sua senha do DokuWiki';
+$lang['reghere']               = 'Ainda não tem uma conta? Crie uma';
+$lang['profna']                = 'Esse wiki não suporta modificações do perfil.';
+$lang['profnochange']          = 'Sem alterações, nada para fazer.';
+$lang['profnoempty']           = 'Não são permitidos nomes ou endereços de e-mail em branco.';
+$lang['profchanged']           = 'O perfil do usuário foi atualizado com sucesso.';
+$lang['profnodelete']          = 'Esse wiki não suporta a exclusão de usuários ';
+$lang['profdeleteuser']        = 'Excluir a conta';
+$lang['profdeleted']           = 'Sua conta de usuário foi excluída desse wiki';
+$lang['profconfdelete']        = 'Eu desejo remover minha conta dessa wiki. <br/> Essa ação não pode ser desfeita.';
+$lang['profconfdeletemissing'] = 'Caixa de confirmação não marcada';
+$lang['proffail']              = 'O perfil do usuário não foi atualizado.';
+$lang['pwdforget']             = 'Esqueceu sua senha? Solicite outra';
+$lang['resendna']              = 'Esse wiki não tem suporte para o reenvio de senhas.';
+$lang['resendpwd']             = 'Definir a nova senha para';
+$lang['resendpwdmissing']      = 'Desculpe, você deve preencher todos os campos.';
+$lang['resendpwdnouser']       = 'Desculpe, não foi possível encontrar esse usuário no nosso banco de dados.';
+$lang['resendpwdbadauth']      = 'Desculpe, esse código de autorização é inválido. Certifique-se de que você usou o link de confirmação inteiro.';
+$lang['resendpwdconfirm']      = 'Um link de confirmação foi enviado por e-mail.';
+$lang['resendpwdsuccess']      = 'Sua nova senha foi enviada por e-mail.';
+$lang['license']               = 'Exceto onde for informado ao contrário, o conteúdo neste wiki está sob a seguinte licença:';
+$lang['licenseok']             = 'Observe: editando esta página você aceita disponibilizar o seu conteúdo sob a seguinte licença:';
+$lang['searchmedia']           = 'Buscar arquivo:';
+$lang['searchmedia_in']        = 'Buscar em %s';
+$lang['txt_upload']            = 'Selecione o arquivo a ser enviado:';
+$lang['txt_filename']          = 'Enviar como (opcional):';
+$lang['txt_overwrt']           = 'Substituir o arquivo existente';
+$lang['maxuploadsize']         = 'Tamanho máximo de %s por arquivo.';
+$lang['lockedby']              = 'Atualmente bloqueada por:';
+$lang['lockexpire']            = 'O bloqueio expira em:';
+$lang['js']['willexpire']      = 'O seu bloqueio de edição deste página irá expirar em um minuto.\nPara evitar conflitos de edição, clique no botão de visualização para reiniciar o temporizador de bloqueio.';
+$lang['js']['notsavedyet']     = 'As alterações não salvas serão perdidas.
+Deseja realmente continuar?';
+$lang['js']['searchmedia']     = 'Buscar por arquivos';
+$lang['js']['keepopen']        = 'Manter a janela aberta na seleção';
+$lang['js']['hidedetails']     = 'Esconder detalhes';
+$lang['js']['mediatitle']      = 'Configurações do Link';
+$lang['js']['mediadisplay']    = 'Tipo de Link';
+$lang['js']['mediaalign']      = 'Alinhamento';
+$lang['js']['mediasize']       = 'Tamanho da Imagem';
+$lang['js']['mediatarget']     = 'Alvo do Link';
+$lang['js']['mediaclose']      = 'Fechar';
+$lang['js']['mediainsert']     = 'Inserir';
+$lang['js']['mediadisplayimg'] = 'Mostrar Imagem.';
+$lang['js']['mediadisplaylnk'] = 'Mostrar apenas Link.';
+$lang['js']['mediasmall']      = 'Versão Pequena';
+$lang['js']['mediamedium']     = 'Versão Média';
+$lang['js']['medialarge']      = 'Versão Grande';
+$lang['js']['mediaoriginal']   = 'Versão Original';
+$lang['js']['medialnk']        = 'Link para página de detalhes';
+$lang['js']['mediadirect']     = 'Link direto para original';
+$lang['js']['medianolnk']      = 'Sem Link';
+$lang['js']['medianolink']     = 'Sem link na imagem';
+$lang['js']['medialeft']       = 'Alinhamento de imagem a esquerda';
+$lang['js']['mediaright']      = 'Alinhamento de imagem a direita';
+$lang['js']['mediacenter']     = 'Alinhamento de imagem ao centro';
+$lang['js']['medianoalign']    = 'Sem alinhamento';
+$lang['js']['nosmblinks']      = 'Atalhos para pastas compartilhadas do Windows funcionam apenas no Microsoft Internet Explorer.
+Entretanto, você ainda pode copiar e colar o atalho.';
+$lang['js']['linkwiz']         = 'Link Wizard';
+$lang['js']['linkto']          = 'Link para:';
+$lang['js']['del_confirm']     = 'Deseja realmente excluir o(s) item(ns) selecionado(s)?';
+$lang['js']['restore_confirm'] = 'Deseja realmente restaurar essa versão?';
+$lang['js']['media_diff']      = 'Ver as diferenças:';
+$lang['js']['media_diff_both'] = 'Lado a lado';
+$lang['js']['media_diff_opacity'] = 'Sobreposição';
+$lang['js']['media_diff_portions'] = 'Deslizamento';
+$lang['js']['media_select']    = 'Selecione os arquivos...';
+$lang['js']['media_upload_btn'] = 'Enviar';
+$lang['js']['media_done_btn']  = 'Concluído';
+$lang['js']['media_drop']      = 'Arraste os arquivos até aqui para enviar';
+$lang['js']['media_cancel']    = 'remover';
+$lang['js']['media_overwrt']   = 'Sobrescrever arquivos existentes';
+$lang['rssfailed']             = 'Ocorreu um erro durante a atualização dessa fonte: ';
+$lang['nothingfound']          = 'Não foi encontrado nada.';
+$lang['mediaselect']           = 'Arquivos de mídia';
+$lang['uploadsucc']            = 'O envio foi efetuado com sucesso';
+$lang['uploadfail']            = 'Não foi possível enviar o arquivo. Será algum problema com as permissões?';
+$lang['uploadwrong']           = 'O envio foi bloqueado. Essa extensão de arquivo é proibida!';
+$lang['uploadexist']           = 'O arquivo já existe. Não foi feito nada.';
+$lang['uploadbadcontent']      = 'O conteúdo enviado não corresponde à extensão do arquivo %s.';
+$lang['uploadspam']            = 'O envio foi bloqueado pela lista negra de spams.';
+$lang['uploadxss']             = 'O envio foi bloqueado devido à possibilidade do seu conteúdo ser malicioso.';
+$lang['uploadsize']            = 'O arquivo transmitido era grande demais. (max. %s)';
+$lang['deletesucc']            = 'O arquivo "%s" foi excluído.';
+$lang['deletefail']            = 'Não foi possível excluir "%s" - verifique as permissões.';
+$lang['mediainuse']            = 'O arquivo "%s" não foi excluído - ele ainda está em uso.';
+$lang['namespaces']            = 'Espaços de nomes';
+$lang['mediafiles']            = 'Arquivos disponíveis em';
+$lang['accessdenied']          = 'Você não tem permissão para visualizar esta página.';
+$lang['mediausage']            = 'Use a seguinte sintaxe para referenciar esse arquivo:';
+$lang['mediaview']             = 'Ver o arquivo original';
+$lang['mediaroot']             = 'raiz';
+$lang['mediaupload']           = 'Envie um arquivo para o espaço de nomes atual aqui. Para criar subespaços de nomes, preponha-os ao nome do arquivo no parâmetro "Enviar como", separados por vírgulas.';
+$lang['mediaextchange']        = 'A extensão do arquivo mudou de .%s para .%s!';
+$lang['reference']             = 'Referências para';
+$lang['ref_inuse']             = 'O arquivo não pode ser excluído, porque ele ainda está sendo utilizado nas seguintes páginas:';
+$lang['ref_hidden']            = 'Algumas referências estão em páginas que você não tem permissão para ler';
+$lang['hits']                  = 'Resultados';
+$lang['quickhits']             = 'Nomes de páginas coincidentes';
+$lang['toc']                   = 'Tabela de conteúdos';
+$lang['current']               = 'atual';
+$lang['yours']                 = 'Sua versão';
+$lang['diff']                  = 'Mostrar diferenças com a revisão atual';
+$lang['diff2']                 = 'Mostrar diferenças entre as revisões selecionadas';
+$lang['difflink']              = 'Link para esta página de comparações';
+$lang['diff_type']             = 'Ver as diferenças:';
+$lang['diff_inline']           = 'Mescladas';
+$lang['diff_side']             = 'Lado a lado';
+$lang['diffprevrev']           = 'Revisão anterior';
+$lang['diffnextrev']           = 'Próxima revisão';
+$lang['difflastrev']           = 'Última revisão';
+$lang['diffbothprevrev']       = 'Ambos lados da revisão anterior';
+$lang['diffbothnextrev']       = 'Ambos lados da revisão seguinte';
+$lang['line']                  = 'Linha';
+$lang['breadcrumb']            = 'Visitou:';
+$lang['youarehere']            = 'Você está aqui:';
+$lang['lastmod']               = 'Última modificação:';
+$lang['by']                    = 'por';
+$lang['deleted']               = 'removida';
+$lang['created']               = 'criada';
+$lang['restored']              = 'a revisão anterior foi restaurada (%s)';
+$lang['external_edit']         = 'edição externa';
+$lang['summary']               = 'Resumo da edição';
+$lang['noflash']               = 'O <a href="http://www.adobe.com/products/flashplayer/">plug-in Adobe Flash</a> é necessário para exibir este conteúdo.';
+$lang['download']              = 'Baixar o snippet';
+$lang['tools']                 = 'Ferramentas';
+$lang['user_tools']            = 'Ferramentas do usuário';
+$lang['site_tools']            = 'Ferramentas do site';
+$lang['page_tools']            = 'Ferramentas da página';
+$lang['skip_to_content']       = 'ir para o conteúdo';
+$lang['sidebar']               = 'Barra lateral';
+$lang['mail_newpage']          = 'página adicionada:';
+$lang['mail_changed']          = 'página modificada:';
+$lang['mail_subscribe_list']   = 'páginas alteradas no espaço de nomes:';
+$lang['mail_new_user']         = 'novo usuário:';
+$lang['mail_upload']           = 'arquivo enviado:';
+$lang['changes_type']          = 'Ver as mudanças de';
+$lang['pages_changes']         = 'Páginas';
+$lang['media_changes']         = 'Arquivos de mídia';
+$lang['both_changes']          = 'Páginas e arquivos de mídia';
+$lang['qb_bold']               = 'Texto em negrito';
+$lang['qb_italic']             = 'Texto em itálico';
+$lang['qb_underl']             = 'Texto sublinhado';
+$lang['qb_code']               = 'Texto de código';
+$lang['qb_strike']             = 'Texto tachado';
+$lang['qb_h1']                 = 'Cabeçalho de nível 1';
+$lang['qb_h2']                 = 'Cabeçalho de nível 2';
+$lang['qb_h3']                 = 'Cabeçalho de nível 3';
+$lang['qb_h4']                 = 'Cabeçalho de nível 4';
+$lang['qb_h5']                 = 'Cabeçalho de nível 5';
+$lang['qb_h']                  = 'Cabeçalho';
+$lang['qb_hs']                 = 'Escolha o cabeçalho';
+$lang['qb_hplus']              = 'Cabeçalho de nível mais alto';
+$lang['qb_hminus']             = 'Cabeçalho de nível mais baixo';
+$lang['qb_hequal']             = 'Cabeçalho de mesmo nível';
+$lang['qb_link']               = 'Link interno';
+$lang['qb_extlink']            = 'Link externo';
+$lang['qb_hr']                 = 'Linha horizontal';
+$lang['qb_ol']                 = 'Item de lista ordenada';
+$lang['qb_ul']                 = 'Item de lista não ordenada';
+$lang['qb_media']              = 'Adicionar imagens e/ou outros arquivos';
+$lang['qb_sig']                = 'Inserir assinatura';
+$lang['qb_smileys']            = 'Carinhas';
+$lang['qb_chars']              = 'Caracteres especiais';
+$lang['upperns']               = 'Pular para espaço de nomes acima';
+$lang['metaedit']              = 'Editar metadados';
+$lang['metasaveerr']           = 'Não foi possível escrever os metadados';
+$lang['metasaveok']            = 'Os metadados foram salvos';
+$lang['img_title']             = 'Título:';
+$lang['img_caption']           = 'Descrição:';
+$lang['img_date']              = 'Data:';
+$lang['img_fname']             = 'Nome do arquivo:';
+$lang['img_fsize']             = 'Tamanho:';
+$lang['img_artist']            = 'Fotógrafo:';
+$lang['img_copyr']             = 'Direitos autorais:';
+$lang['img_format']            = 'Formato:';
+$lang['img_camera']            = 'Câmera:';
+$lang['img_keywords']          = 'Palavras-chave:';
+$lang['img_width']             = 'Largura:';
+$lang['img_height']            = 'Altura:';
+$lang['subscr_subscribe_success'] = 'Adicionado %s à lista de monitoramentos de %s';
+$lang['subscr_subscribe_error'] = 'Ocorreu um erro na adição de %s à lista de monitoramentos de %s';
+$lang['subscr_subscribe_noaddress'] = 'Como não há nenhum endereço associado ao seu usuário, você não pode ser adicionado à lista de monitoramento';
+$lang['subscr_unsubscribe_success'] = '%s foi removido da lista de monitoramento de %s';
+$lang['subscr_unsubscribe_error'] = 'Ocorreu um erro na remoção de %s da lista de monitoramentos de %s';
+$lang['subscr_already_subscribed'] = '%s já está monitorando %s';
+$lang['subscr_not_subscribed'] = '%s não está monitorando %s';
+$lang['subscr_m_not_subscribed'] = 'Você não está monitorando nem a página atual nem o espaço de nomes.';
+$lang['subscr_m_new_header']   = 'Adicionar monitoramento';
+$lang['subscr_m_current_header'] = 'Monitoramentos atuais';
+$lang['subscr_m_unsubscribe']  = 'Cancelar monitoramento';
+$lang['subscr_m_subscribe']    = 'Monitorar';
+$lang['subscr_m_receive']      = 'Receber';
+$lang['subscr_style_every']    = 'um e-mail a cada modificação';
+$lang['subscr_style_digest']   = 'um agrupamento de e-mails com as mudanças para cada página (a cada %.2f dias)';
+$lang['subscr_style_list']     = 'uma lista de páginas modificadas desde o último e-mail (a cada %.2f dias)';
+$lang['authtempfail']          = 'A autenticação de usuários está temporariamente desabilitada. Se essa situação persistir, por favor, informe ao administrador do Wiki.';
+$lang['i_chooselang']          = 'Selecione o seu idioma';
+$lang['i_installer']           = 'Instalador do DokuWiki';
+$lang['i_wikiname']            = 'Nome do Wiki';
+$lang['i_enableacl']           = 'Habilitar Lista de Controle de Acessos (recomendado)';
+$lang['i_superuser']           = 'Superusuário';
+$lang['i_problems']            = 'O instalador encontrou alguns problemas, indicados abaixo. Você não pode continuar até corrigi-los.';
+$lang['i_modified']            = 'Por questões de segurança, esse script funcionará apenas em uma instalação nova e não modificada do DokuWiki.
+Você pode extrair novamente os arquivos do pacote original ou consultar as <a href="http://dokuwiki.org/install">instruções de instalação do DokuWiki</a>.';
+$lang['i_funcna']              = 'A função PHP <code>%s</code> não está disponível. O seu host a mantém desabilitada por algum motivo?';
+$lang['i_phpver']              = 'A sua versão do PHP (<code>%s</code>) é inferior à necessária (<code>%s</code>). Você precisa atualizar a sua instalação do PHP.';
+$lang['i_mbfuncoverload']      = 'mbstring.func_overload precisa ser desabilitado no php.ini para executar o DokuWiki';
+$lang['i_permfail']            = 'O DokuWiki não tem permissão de escrita em <code>%s</code>. Você precisa corrigir as configurações de permissão nesse diretório!';
+$lang['i_confexists']          = '<code>%s</code> já existe';
+$lang['i_writeerr']            = 'Não foi possível criar <code>%s</code>. É necessário checar as permissões de arquivos/diretórios e criar o arquivo manualmente.';
+$lang['i_badhash']             = 'dokuwiki.php não reconhecido ou modificado (hash=<code>%s</code>)';
+$lang['i_badval']              = '<code>%s</code> - valor ilegal ou em branco';
+$lang['i_success']             = 'A configuração terminou com sucesso. Agora você deve excluir o arquivo install.php. Conheça o seu <a href="doku.php?id=wiki:welcome">novo DokuWiki</a>!';
+$lang['i_failure']             = 'Ocorreram alguns erros durante a escrita dos arquivos de configuração. É necessário corrigi-los manualmente antes de usar seu <a href="doku.php?id=wiki:welcome">novo DokuWiki</a>';
+$lang['i_policy']              = 'Política inicial de permissões';
+$lang['i_pol0']                = 'Wiki aberto (leitura, escrita e envio de arquivos por todos)';
+$lang['i_pol1']                = 'Wiki público (leitura por todos, escrita e envio de arquivos por usuários registrados)';
+$lang['i_pol2']                = 'Wiki fechado (leitura, escrita e envio de arquivos somente por usuários registrados)';
+$lang['i_allowreg']            = 'Permite usuários se registrarem';
+$lang['i_retry']               = 'Tentar novamente';
+$lang['i_license']             = 'Por favor escolha a licença que voce deseja utilizar para seu conteúdo:';
+$lang['i_license_none']        = 'Não mostrar nenhuma informação da licença';
+$lang['i_pop_field']           = 'Por favor, nos ajude a melhorar sua experiência com DokuWiki:';
+$lang['i_pop_label']           = 'Uma vez por mês, enviar anonimamente informações de uso de dados para os desenvolvedores DokuWiki';
+$lang['recent_global']         = 'Você está observando as alterações dentro do espaço de nomes <b>%s</b>. Também é possível ver as <a href="%s">modificações recentes no wiki inteiro</a>.';
+$lang['years']                 = '%d anos atrás';
+$lang['months']                = '%d meses atrás';
+$lang['weeks']                 = '%d semanas atrás';
+$lang['days']                  = '%d dias atrás';
+$lang['hours']                 = '%d horas atrás';
+$lang['minutes']               = '%d minutos atrás';
+$lang['seconds']               = '%d segundos atrás';
+$lang['wordblock']             = 'Suas mudanças não foram salvas pois contem texto bloqueados (spam)';
+$lang['media_uploadtab']       = 'Enviar';
+$lang['media_searchtab']       = 'Pesquisar';
+$lang['media_file']            = 'Arquivo';
+$lang['media_viewtab']         = 'Ver';
+$lang['media_edittab']         = 'Editar';
+$lang['media_historytab']      = 'Histórico';
+$lang['media_list_thumbs']     = 'Miniaturas';
+$lang['media_list_rows']       = 'Linhas';
+$lang['media_sort_name']       = 'Nome';
+$lang['media_sort_date']       = 'Data';
+$lang['media_namespaces']      = 'Selecione o espaço de nomes';
+$lang['media_files']           = 'Arquivos em %s';
+$lang['media_upload']          = 'Enviar para %s';
+$lang['media_search']          = 'Pesquisar em %s';
+$lang['media_view']            = '%s';
+$lang['media_viewold']         = '%s em %s';
+$lang['media_edit']            = 'Editar %s';
+$lang['media_history']         = 'Histórico de %s';
+$lang['media_meta_edited']     = 'o metadado foi editado';
+$lang['media_perm_read']       = 'Desculpe, mas você não tem privilégios suficientes para ler arquivos.';
+$lang['media_perm_upload']     = 'Desculpe, mas você não tem privilégios suficientes para enviar arquivos.';
+$lang['media_update']          = 'Enviar uma nova versão';
+$lang['media_restore']         = 'Restaurar esta versão';
+$lang['media_acl_warning']     = 'Essa lista pode não estar completa devido a restrições de ACL e páginas ocultas.';
+$lang['currentns']             = 'Domínio atual';
+$lang['searchresult']          = 'Resultado da Busca';
+$lang['plainhtml']             = 'HTML simples';
+$lang['wikimarkup']            = 'Marcação wiki';
+$lang['page_nonexist_rev']     = 'Página não encontrada em %s. Foi criada posteriormente em <a href="%s">%s</a>.';
+$lang['unable_to_parse_date']  = 'Impossível analisar em "%s".';
+$lang['email_signature_text']  = 'Essa mensagem foi gerada pelo DokuWiki em
+@DOKUWIKIURL@';
diff --git a/wiki/inc/lang/pt-br/locked.txt b/wiki/inc/lang/pt-br/locked.txt
new file mode 100644
index 0000000..70658cb
--- /dev/null
+++ b/wiki/inc/lang/pt-br/locked.txt
@@ -0,0 +1,3 @@
+====== Página bloqueada ======
+
+Essa página está bloqueada para edição por outro usuário. Você tem que esperar até que esse usuário termine a edição ou que o bloqueio expire.
diff --git a/wiki/inc/lang/pt-br/login.txt b/wiki/inc/lang/pt-br/login.txt
new file mode 100644
index 0000000..23215e1
--- /dev/null
+++ b/wiki/inc/lang/pt-br/login.txt
@@ -0,0 +1,3 @@
+====== Autenticação ======
+
+Você não está autenticado. Digite as seus dados de usuário abaixo para entrar no sistema. É necessário habilitar os //cookies// no seu navegador para que isso funcione.
diff --git a/wiki/inc/lang/pt-br/mailtext.txt b/wiki/inc/lang/pt-br/mailtext.txt
new file mode 100644
index 0000000..5bdbfdd
--- /dev/null
+++ b/wiki/inc/lang/pt-br/mailtext.txt
@@ -0,0 +1,12 @@
+Uma página em seu DokuWiki foi adicionada ou alterada. Aqui estão os detalhes:
+
+Data: @DATE@
+Navegador: @BROWSER@
+Endereço IP: @IPADDRESS@
+Nome do host: @HOSTNAME@
+Revisão antiga: @OLDPAGE@
+Nova revisão: @NEWPAGE@
+Resumo da edição: @SUMMARY@
+Usuário: @USER@
+
+@DIFF@
diff --git a/wiki/inc/lang/pt-br/mailwrap.html b/wiki/inc/lang/pt-br/mailwrap.html
new file mode 100644
index 0000000..d257190
--- /dev/null
+++ b/wiki/inc/lang/pt-br/mailwrap.html
@@ -0,0 +1,13 @@
+<html>
+<head>
+<title>@TITLE@</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+</head>
+<body>
+
+@HTMLBODY@
+
+<br /><hr />
+<small>@EMAILSIGNATURE@</small>
+</body>
+</html>
\ No newline at end of file
diff --git a/wiki/inc/lang/pt-br/newpage.txt b/wiki/inc/lang/pt-br/newpage.txt
new file mode 100644
index 0000000..77ba49f
--- /dev/null
+++ b/wiki/inc/lang/pt-br/newpage.txt
@@ -0,0 +1,3 @@
+====== Esse tópico ainda não existe ======
+
+Você clicou em um link para um tópico que ainda não existe. Se for permitido, você poderá criá-lo usando o botão ''Criar essa página''.
diff --git a/wiki/inc/lang/pt-br/norev.txt b/wiki/inc/lang/pt-br/norev.txt
new file mode 100644
index 0000000..19024dc
--- /dev/null
+++ b/wiki/inc/lang/pt-br/norev.txt
@@ -0,0 +1,3 @@
+====== Essa revisão não existe ======
+
+A revisão especificada não existe. Utilize o botão ''Revisões anteriores'' para uma listagem das revisões anteriores deste documento.
diff --git a/wiki/inc/lang/pt-br/password.txt b/wiki/inc/lang/pt-br/password.txt
new file mode 100644
index 0000000..0a7587a
--- /dev/null
+++ b/wiki/inc/lang/pt-br/password.txt
@@ -0,0 +1,6 @@
+Olá @FULLNAME@!
+
+Aqui estão os seus dados de usuário para @TITLE@ em @DOKUWIKIURL@
+
+Usuário  : @LOGIN@
+Senha    : @PASSWORD@
diff --git a/wiki/inc/lang/pt-br/preview.txt b/wiki/inc/lang/pt-br/preview.txt
new file mode 100644
index 0000000..efdc8f7
--- /dev/null
+++ b/wiki/inc/lang/pt-br/preview.txt
@@ -0,0 +1,3 @@
+====== Visualização ======
+
+Essa é uma visualização de como será a aparência do seu texto. Lembre-se: ele ainda **não foi gravado**!
diff --git a/wiki/inc/lang/pt-br/pwconfirm.txt b/wiki/inc/lang/pt-br/pwconfirm.txt
new file mode 100644
index 0000000..324f9df
--- /dev/null
+++ b/wiki/inc/lang/pt-br/pwconfirm.txt
@@ -0,0 +1,9 @@
+Olá @FULLNAME@!
+
+Alguém requisitou um nova senha para o seu usuário @TITLE@ em @DOKUWIKIURL@.
+
+Se não foi você quem fez essa requisição, simplesmente ignore essa mensagem.
+
+Se você realmente deseja receber uma nova senha, por favor, utilize o link abaixo, para confirmar sua requisição.
+
+@CONFIRM@
diff --git a/wiki/inc/lang/pt-br/read.txt b/wiki/inc/lang/pt-br/read.txt
new file mode 100644
index 0000000..897155e
--- /dev/null
+++ b/wiki/inc/lang/pt-br/read.txt
@@ -0,0 +1 @@
+Essa página está em modo somente de leitura. Você pode visualizar a fonte, mas não alterá-la. Informe-se com o administrador do Wiki, caso você ache que isso está incorreto.
diff --git a/wiki/inc/lang/pt-br/recent.txt b/wiki/inc/lang/pt-br/recent.txt
new file mode 100644
index 0000000..988f235
--- /dev/null
+++ b/wiki/inc/lang/pt-br/recent.txt
@@ -0,0 +1,4 @@
+====== Alterações Recentes ======
+
+As seguintes páginas foram alteradas recentemente.
+
diff --git a/wiki/inc/lang/pt-br/register.txt b/wiki/inc/lang/pt-br/register.txt
new file mode 100644
index 0000000..431feca
--- /dev/null
+++ b/wiki/inc/lang/pt-br/register.txt
@@ -0,0 +1,4 @@
+====== Registre-se como um novo usuário ======
+
+Preencha todas as informações abaixo para criar uma nova conta nesse Wiki. Certifique-se de que você forneceu um **endereço de e-mail válido** - se não for pedido que você entre com uma senha aqui, ela será enviada para esse endereço. O nome de usuário deve ser um [[doku>pagename|nome de página]] válido.
+
diff --git a/wiki/inc/lang/pt-br/registermail.txt b/wiki/inc/lang/pt-br/registermail.txt
new file mode 100644
index 0000000..bbf2547
--- /dev/null
+++ b/wiki/inc/lang/pt-br/registermail.txt
@@ -0,0 +1,10 @@
+Foi registrado um novo usuário. Seus detalhes são:
+
+Nome de usuário: @NEWUSER@
+Nome completo: @NEWNAME@
+E-mail: @NEWEMAIL@
+
+Data: @DATE@
+Navegador: @BROWSER@
+Endereço IP: @IPADDRESS@
+Nome do host: @HOSTNAME@
diff --git a/wiki/inc/lang/pt-br/resendpwd.txt b/wiki/inc/lang/pt-br/resendpwd.txt
new file mode 100644
index 0000000..b74713f
--- /dev/null
+++ b/wiki/inc/lang/pt-br/resendpwd.txt
@@ -0,0 +1,3 @@
+====== Enviar nova senha ======
+
+Por favor, digite o seu nome de usuário no formulário abaixo para requisitar uma nova senha para a sua conta nesse wiki. O link de confirmação será enviado para o endereço de e-mail que você forneceu.
\ No newline at end of file
diff --git a/wiki/inc/lang/pt-br/resetpwd.txt b/wiki/inc/lang/pt-br/resetpwd.txt
new file mode 100644
index 0000000..febb1d6
--- /dev/null
+++ b/wiki/inc/lang/pt-br/resetpwd.txt
@@ -0,0 +1,3 @@
+====== Definir uma nova senha ======
+
+Por favor, digite uma nova senha para sua conta neste wiki.
\ No newline at end of file
diff --git a/wiki/inc/lang/pt-br/revisions.txt b/wiki/inc/lang/pt-br/revisions.txt
new file mode 100644
index 0000000..1c174dc
--- /dev/null
+++ b/wiki/inc/lang/pt-br/revisions.txt
@@ -0,0 +1,4 @@
+====== Revisões anteriores ======
+
+Essas são as revisões anteriores desse documento. Para reverter a uma revisão antiga, selecione-a abaixo, clique em ''Editar esta página'' e salve-a.
+
diff --git a/wiki/inc/lang/pt-br/searchpage.txt b/wiki/inc/lang/pt-br/searchpage.txt
new file mode 100644
index 0000000..2e8dd59
--- /dev/null
+++ b/wiki/inc/lang/pt-br/searchpage.txt
@@ -0,0 +1,4 @@
+====== Pesquisa ======
+
+Você pode encontrar os resultados da sua pesquisa abaixo. @CREATEPAGEINFO@
+
diff --git a/wiki/inc/lang/pt-br/showrev.txt b/wiki/inc/lang/pt-br/showrev.txt
new file mode 100644
index 0000000..89d9cad
--- /dev/null
+++ b/wiki/inc/lang/pt-br/showrev.txt
@@ -0,0 +1,2 @@
+**Essa é uma revisão anterior do documento!**
+----
diff --git a/wiki/inc/lang/pt-br/stopwords.txt b/wiki/inc/lang/pt-br/stopwords.txt
new file mode 100644
index 0000000..c781ffb
--- /dev/null
+++ b/wiki/inc/lang/pt-br/stopwords.txt
@@ -0,0 +1,55 @@
+# Essa é uma lista de palavras que o indexador ignora, uma palavra por linha
+# Ao editar esse arquivo, certifique-se de usar terminações de linha UNIX (newline simples)
+# Não há necessidade de incluir palavras menores que 3 caracteres - elas já são ignoradas por padrão
+# Essa lista é baseada na encontrada em http://www.ranks.nl/stopwords/portugese.html
+acerca
+algum
+alguma
+algumas
+alguns
+ambos
+antes
+após
+aquela
+aquelas
+aquele
+aqueles
+até
+bem
+bom
+cada
+com
+como
+das
+desde
+dos
+enquanto
+então
+esta
+este
+estas
+estes
+essa
+essas
+esse
+esses
+isso
+isto
+mas
+mesmo
+onde
+para
+pelo
+por
+qual
+quando
+que
+quem
+sem
+somente
+tal
+também
+uma
+umas
+uns
+www
\ No newline at end of file
diff --git a/wiki/inc/lang/pt-br/subscr_digest.txt b/wiki/inc/lang/pt-br/subscr_digest.txt
new file mode 100644
index 0000000..8251651
--- /dev/null
+++ b/wiki/inc/lang/pt-br/subscr_digest.txt
@@ -0,0 +1,16 @@
+Olá!
+
+A página @PAGE@ na wiki @TITLE@ foi modificada.
+Estas foram as mudanças:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Revisão antiga:@OLDPAGE@
+Nova Revisão:@NEWPAGE@
+
+Para cancelar as notificações de mudanças, entre em
+@DOKUWIKIURL@, vá até @SUBSCRIBE@
+e cancele o monitoramento da página e/ou do espaço de
+nomes.
diff --git a/wiki/inc/lang/pt-br/subscr_form.txt b/wiki/inc/lang/pt-br/subscr_form.txt
new file mode 100644
index 0000000..1611ea9
--- /dev/null
+++ b/wiki/inc/lang/pt-br/subscr_form.txt
@@ -0,0 +1,3 @@
+====== Gerenciamento de inscrição ======
+
+Esta página permite voce gerencias as inscrições para a página e namespace corrente.
diff --git a/wiki/inc/lang/pt-br/subscr_list.txt b/wiki/inc/lang/pt-br/subscr_list.txt
new file mode 100644
index 0000000..fb46777
--- /dev/null
+++ b/wiki/inc/lang/pt-br/subscr_list.txt
@@ -0,0 +1,26 @@
+Olá!
+
+Páginas no espaço de nomes @PAGE@ na wiki
+@TITLE@ foram modificadas.
+Estas são as páginas modificadas:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Para cancelar as notificações de alterações, entre em
+@DOKUWIKIURL@, vá até @SUBSCRIBE@
+e cancele o monitoramento da página e/ou do espaço de
+nomes.
+
+
+Para cancelar as notificações de páginas, entre na wiki @DOKUWIKIURL@
+e então visite @SUBSCRIBE@ e cancele a inscrição de edição da página ou namespace.
+
+
+Para cancelar a página de notificações, entre na wiki @DOKUWIKIURL@,
+visite a página de @SUBSCRIBE@ e cancele a inscrição de edição da página ou namespace.
+
+
+
+preview.txt ====== Preview ======
diff --git a/wiki/inc/lang/pt-br/subscr_single.txt b/wiki/inc/lang/pt-br/subscr_single.txt
new file mode 100644
index 0000000..e59a1e1
--- /dev/null
+++ b/wiki/inc/lang/pt-br/subscr_single.txt
@@ -0,0 +1,19 @@
+Olá!
+
+A página @PAGE@ na wiki @TITLE@ foi alterada.
+Estas foram as mudanças:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Data : @DATE@
+Usuário : @USER@
+Sumário : @SUMMARY@
+Revisão antiga:@OLDPAGE@
+Nova Revisão:@NEWPAGE@
+
+Para cancelar as notificações de mudanças, entre em
+@DOKUWIKIURL@, vá até @NEWPAGE@
+e cancele o monitoramento da página e/ou do espaço de
+nomes.
diff --git a/wiki/inc/lang/pt-br/updateprofile.txt b/wiki/inc/lang/pt-br/updateprofile.txt
new file mode 100644
index 0000000..b3f62f3
--- /dev/null
+++ b/wiki/inc/lang/pt-br/updateprofile.txt
@@ -0,0 +1,5 @@
+====== Atualize o perfil da sua conta ======
+
+Você precisa preencher somente os campos que você deseja alterar. Você não pode alterar o seu nome de usuário.
+
+
diff --git a/wiki/inc/lang/pt-br/uploadmail.txt b/wiki/inc/lang/pt-br/uploadmail.txt
new file mode 100644
index 0000000..8527f8e
--- /dev/null
+++ b/wiki/inc/lang/pt-br/uploadmail.txt
@@ -0,0 +1,10 @@
+Um arquivo foi enviado para o seu DokuWiki. Os detalhes são:
+
+Arquivo: @MEDIA@
+Data: @DATE@
+Navegador: @BROWSER@
+Endereço IP: @IPADDRESS@
+Nome do host: @HOSTNAME@
+Tamanho: @SIZE@
+Tipo MIME: @MIME@
+Usuário: @USER@
diff --git a/wiki/inc/lang/pt/admin.txt b/wiki/inc/lang/pt/admin.txt
new file mode 100644
index 0000000..5b103b3
--- /dev/null
+++ b/wiki/inc/lang/pt/admin.txt
@@ -0,0 +1,3 @@
+====== Administração ======
+
+Abaixo pode encontrar uma lista de tarefas de administrativas disponíveis na DokuWiki.
\ No newline at end of file
diff --git a/wiki/inc/lang/pt/adminplugins.txt b/wiki/inc/lang/pt/adminplugins.txt
new file mode 100644
index 0000000..259f5ce
--- /dev/null
+++ b/wiki/inc/lang/pt/adminplugins.txt
@@ -0,0 +1 @@
+===== Extras Adicionais =====
\ No newline at end of file
diff --git a/wiki/inc/lang/pt/backlinks.txt b/wiki/inc/lang/pt/backlinks.txt
new file mode 100644
index 0000000..4eb82cb
--- /dev/null
+++ b/wiki/inc/lang/pt/backlinks.txt
@@ -0,0 +1,4 @@
+====== Backlinks ======
+
+Esta é uma lista de páginas que parece que interliga para a página atual.
+
diff --git a/wiki/inc/lang/pt/conflict.txt b/wiki/inc/lang/pt/conflict.txt
new file mode 100644
index 0000000..49575fd
--- /dev/null
+++ b/wiki/inc/lang/pt/conflict.txt
@@ -0,0 +1,5 @@
+====== Existe uma versão mais recente ======
+
+Existe uma versão mais recente do documento editado. Isto acontece quando um outro utilizador alterou o documento enquanto o estava a editar.
+
+Analise cuidadosamente as diferenças mostradas abaixo, depois decida qual a versão a manter. Se escolher 'guardar'', a sua versão será guardada. Clique em ''cancelar '' para manter a versão atual.
diff --git a/wiki/inc/lang/pt/denied.txt b/wiki/inc/lang/pt/denied.txt
new file mode 100644
index 0000000..f4e8e01
--- /dev/null
+++ b/wiki/inc/lang/pt/denied.txt
@@ -0,0 +1,4 @@
+====== Permissão Negada ======
+
+Desculpe, não tem direitos suficientes para continuar.
+
diff --git a/wiki/inc/lang/pt/diff.txt b/wiki/inc/lang/pt/diff.txt
new file mode 100644
index 0000000..b733262
--- /dev/null
+++ b/wiki/inc/lang/pt/diff.txt
@@ -0,0 +1,3 @@
+====== Diferenças ======
+
+Esta página mostra as diferenças entre as duas revisões da página.
\ No newline at end of file
diff --git a/wiki/inc/lang/pt/draft.txt b/wiki/inc/lang/pt/draft.txt
new file mode 100644
index 0000000..1baf95c
--- /dev/null
+++ b/wiki/inc/lang/pt/draft.txt
@@ -0,0 +1,7 @@
+====== Rascunho encontrado ======
+
+A sessão referente à última edição desta página não terminou correctamente. Foi guardado automaticamente um rascunho durante a edição que pode ou não usar para continuar a edição. Abaixo pode ver os dados guardados da última sessão.
+
+Por favor, decida se quer **recuperar** os dados guardados, **remover** o rascunho** ou **cancelar** o processo de edição corrente.
+
+----
diff --git a/wiki/inc/lang/pt/edit.txt b/wiki/inc/lang/pt/edit.txt
new file mode 100644
index 0000000..2fa596e
--- /dev/null
+++ b/wiki/inc/lang/pt/edit.txt
@@ -0,0 +1,4 @@
+Edite o documento e clique no botão <Gravar>. Reveja a [[wiki:syntax|sintaxe]] das regras de formatação do texto.
+
+Por favor, altere o conteúdo deste documento apenas quando puder **melhorá-lo**.\\ Se pretende testar os seus conhecimentos no uso deste motor Wiki, realize os seus testes no [[playground:playground | Recreio]].
+
diff --git a/wiki/inc/lang/pt/editrev.txt b/wiki/inc/lang/pt/editrev.txt
new file mode 100644
index 0000000..2c7697b
--- /dev/null
+++ b/wiki/inc/lang/pt/editrev.txt
@@ -0,0 +1 @@
+**Carregou uma revisão antiga do documento!** Se a gravar irá criar uma nova versão do documento com este conteúdo, que substituirá a versão actual.
\ No newline at end of file
diff --git a/wiki/inc/lang/pt/index.txt b/wiki/inc/lang/pt/index.txt
new file mode 100644
index 0000000..46a807d
--- /dev/null
+++ b/wiki/inc/lang/pt/index.txt
@@ -0,0 +1,3 @@
+====== Índice ======
+
+Este índice mostra todas as páginas disponíveis, agrupadas por [[doku>namespaces|espaço de nome]].
\ No newline at end of file
diff --git a/wiki/inc/lang/pt/install.html b/wiki/inc/lang/pt/install.html
new file mode 100644
index 0000000..69227bd
--- /dev/null
+++ b/wiki/inc/lang/pt/install.html
@@ -0,0 +1,8 @@
+<p>Esta página serve de "assistente" para a primeira instalação e configuração do <a href="http://dokuwiki.org">Dokuwiki</a>. Está disponível mais informação sobre este "assistente" na sua <a href="http://dokuwiki.org/installer">página de documentação</a>.</p>
+
+<p>O DokuWiki usa ficheiros normais para armazenar as páginas Wiki e outras informações associadas a essas páginas (i.e. imagens, índices de pesquisa, revisões antigas, etc.). O DokuWiki para poder funcionar correctamente <strong>requer</strong> permissões de escrita às pastas que contêm esses ficheiros. Este "assistente" não é capaz de configurar essas permissões. Isso tem que ser feito via linha de comandos, FTP ou Painel de Controlo do serviço de alojamento (i.e. cPanel).</p>
+
+<p>Este "assistente" vai configurar o DokuWiki com
+<abbr title="access control list">ACL</abbr>, que por sua vez permite ao administrador entrar em sessão e aceder ao menu de Administração do DokuWiki para poder instalar plugins, gerir utilizadores e seus perfis, gerir acesso às páginas e à própria configuração do DokuWiki. Não é necessário para que o DokuWiki funcione, mas facilita a sua administração.</p>
+
+<p>Utilizadores experiente ou com requisitos especiais devem seguir estes links, que detalham mais em pormenor a<a href="http://dokuwiki.org/install">instalação</a> e <a href="http://dokuwiki.org/config">configuração</a> do DokuWiki.</p>
\ No newline at end of file
diff --git a/wiki/inc/lang/pt/jquery.ui.datepicker.js b/wiki/inc/lang/pt/jquery.ui.datepicker.js
new file mode 100644
index 0000000..b1afd7b
--- /dev/null
+++ b/wiki/inc/lang/pt/jquery.ui.datepicker.js
@@ -0,0 +1,44 @@
+/* Portuguese initialisation for the jQuery UI date picker plugin. */
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "../widgets/datepicker" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery.datepicker );
+	}
+}( function( datepicker ) {
+
+datepicker.regional.pt = {
+	closeText: "Fechar",
+	prevText: "Anterior",
+	nextText: "Seguinte",
+	currentText: "Hoje",
+	monthNames: [ "Janeiro","Fevereiro","Março","Abril","Maio","Junho",
+	"Julho","Agosto","Setembro","Outubro","Novembro","Dezembro" ],
+	monthNamesShort: [ "Jan","Fev","Mar","Abr","Mai","Jun",
+	"Jul","Ago","Set","Out","Nov","Dez" ],
+	dayNames: [
+		"Domingo",
+		"Segunda-feira",
+		"Terça-feira",
+		"Quarta-feira",
+		"Quinta-feira",
+		"Sexta-feira",
+		"Sábado"
+	],
+	dayNamesShort: [ "Dom","Seg","Ter","Qua","Qui","Sex","Sáb" ],
+	dayNamesMin: [ "Dom","Seg","Ter","Qua","Qui","Sex","Sáb" ],
+	weekHeader: "Sem",
+	dateFormat: "dd/mm/yy",
+	firstDay: 0,
+	isRTL: false,
+	showMonthAfterYear: false,
+	yearSuffix: "" };
+datepicker.setDefaults( datepicker.regional.pt );
+
+return datepicker.regional.pt;
+
+} ) );
diff --git a/wiki/inc/lang/pt/lang.php b/wiki/inc/lang/pt/lang.php
new file mode 100644
index 0000000..64c25fa
--- /dev/null
+++ b/wiki/inc/lang/pt/lang.php
@@ -0,0 +1,350 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author José Carlos Monteiro <jose.c.monteiro@netcabo.pt>
+ * @author José Monteiro <Jose.Monteiro@DoWeDo-IT.com>
+ * @author Enrico Nicoletto <liverig@gmail.com>
+ * @author Fil <fil@meteopt.com>
+ * @author André Neves <drakferion@gmail.com>
+ * @author José Campos zecarlosdecampos@gmail.com
+ * @author Murilo <muriloricci@hotmail.com>
+ * @author Paulo Silva <paulotsilva@yahoo.com>
+ * @author Guido Salatino <guidorafael23@gmail.com>
+ * @author Romulo Pereira <romuloccomp@gmail.com>
+ * @author Paulo Carmino <contato@paulocarmino.com>
+ * @author Alfredo Silva <alfredo.silva@sky.com>
+ * @author Guilherme Sá <guilherme.sa@hotmail.com>
+ */
+$lang['encoding']              = 'utf-8';
+$lang['direction']             = 'ltr';
+$lang['doublequoteopening']    = '“';
+$lang['doublequoteclosing']    = '”';
+$lang['singlequoteopening']    = '‘';
+$lang['singlequoteclosing']    = '’';
+$lang['apostrophe']            = '’';
+$lang['btn_edit']              = 'Editar esta página';
+$lang['btn_source']            = 'Mostrar página fonte ';
+$lang['btn_show']              = 'Mostrar página';
+$lang['btn_create']            = 'Criar esta página';
+$lang['btn_search']            = 'Pesquisar';
+$lang['btn_save']              = 'Guardar';
+$lang['btn_preview']           = 'Pré-visualizar';
+$lang['btn_top']               = 'Voltar ao topo';
+$lang['btn_newer']             = '<< mais recente';
+$lang['btn_older']             = 'menos recente >>';
+$lang['btn_revs']              = 'Revisões antigas';
+$lang['btn_recent']            = 'Alterações Recentes';
+$lang['btn_upload']            = 'Enviar';
+$lang['btn_cancel']            = 'Cancelar';
+$lang['btn_index']             = 'Índice';
+$lang['btn_secedit']           = 'Editar';
+$lang['btn_login']             = 'Iniciar sessão';
+$lang['btn_logout']            = 'Terminar sessão';
+$lang['btn_admin']             = 'Administrar';
+$lang['btn_update']            = 'Actualizar';
+$lang['btn_delete']            = 'Apagar';
+$lang['btn_back']              = 'Voltar';
+$lang['btn_backlink']          = 'Backlinks';
+$lang['btn_subscribe']         = 'Subscrever Alterações';
+$lang['btn_profile']           = 'Actualizar Perfil';
+$lang['btn_reset']             = 'Limpar';
+$lang['btn_resendpwd']         = 'Definir nova senha';
+$lang['btn_draft']             = 'Editar rascunho';
+$lang['btn_recover']           = 'Recuperar rascunho';
+$lang['btn_draftdel']          = 'Apagar rascunho';
+$lang['btn_revert']            = 'Restaurar';
+$lang['btn_register']          = 'Registar';
+$lang['btn_apply']             = 'Aplicar';
+$lang['btn_media']             = 'Gestor de Media';
+$lang['btn_deleteuser']        = 'Remover a Minha Conta';
+$lang['btn_img_backto']        = 'De volta a %s';
+$lang['btn_mediaManager']      = 'Ver em gestor de media';
+$lang['loggedinas']            = 'Está em sessão como:';
+$lang['user']                  = 'Utilizador';
+$lang['pass']                  = 'Senha';
+$lang['newpass']               = 'Nova senha';
+$lang['oldpass']               = 'Confirme senha actual';
+$lang['passchk']               = 'Confirmar novamente';
+$lang['remember']              = 'Memorizar?';
+$lang['fullname']              = 'Nome completo';
+$lang['email']                 = 'Email';
+$lang['profile']               = 'Perfil do Utilizador';
+$lang['badlogin']              = 'O utilizador inválido ou senha inválida.';
+$lang['badpassconfirm']        = 'Infelizmente a palavra-passe não é a correcta';
+$lang['minoredit']             = 'Alterações Menores';
+$lang['draftdate']             = 'Rascunho automaticamente gravado em';
+$lang['nosecedit']             = 'A página foi modificada entretanto. Como a informação da secção estava desactualizada, foi carregada a página inteira.';
+$lang['regmissing']            = 'Por favor, preencha todos os campos.';
+$lang['reguexists']            = 'Este utilizador já está inscrito. Por favor escolha outro nome de utilizador.';
+$lang['regsuccess']            = 'O utilizador foi criado e a senha foi enviada para o endereço de correio electrónico usado na inscrição.';
+$lang['regsuccess2']           = 'O utilizador foi criado.';
+$lang['regfail']               = 'O usuário não pode ser criado.';
+$lang['regmailfail']           = 'Houve um erro no envio da senha por e-mail. Por favor, contacte o administrador!';
+$lang['regbadmail']            = 'O endereço de correio electrónico é inválido. Se o endereço está correcto, e isto é um erro, por favor, contacte o administrador!';
+$lang['regbadpass']            = 'As duas senhas não são idênticas, por favor tente de novo.';
+$lang['regpwmail']             = 'A sua senha DokuWiki';
+$lang['reghere']               = 'Para se registar, clique em';
+$lang['profna']                = 'Este Wiki não suporta modificações aos perfis.';
+$lang['profnochange']          = 'Nada alteração, nada a fazer.';
+$lang['profnoempty']           = 'Não são permitidos nomes ou endereços em branco.';
+$lang['profchanged']           = 'Perfil do utilizador actualizado com sucesso.';
+$lang['profnodelete']          = 'Esta wiki não suporta remoção de utilizadores';
+$lang['profdeleteuser']        = 'Apagar Conta';
+$lang['profdeleted']           = 'A sua conta de utilizador foi removida desta wiki';
+$lang['profconfdelete']        = 'Quero remover a minha conta desta wiki. <br/> Esta acção não pode ser anulada.';
+$lang['profconfdeletemissing'] = 'A caixa de confirmação não foi marcada';
+$lang['proffail']              = 'O perfil do usuário não foi atualizado.';
+$lang['pwdforget']             = 'Esqueceu a sua senha? Pedir nova senha';
+$lang['resendna']              = 'Este wiki não suporta reenvio de senhas.';
+$lang['resendpwd']             = 'Definir nova senha para';
+$lang['resendpwdmissing']      = 'É preciso preencher todos os campos.';
+$lang['resendpwdnouser']       = 'Não foi possível encontrar este utilizador.';
+$lang['resendpwdbadauth']      = 'O código de autenticação não é válido. Por favor, assegure-se de que o link de confirmação está completo.';
+$lang['resendpwdconfirm']      = 'O link de confirmação foi enviado por e-mail.';
+$lang['resendpwdsuccess']      = 'A nova senha foi enviada por e-mail.';
+$lang['license']               = 'Excepto menção em contrário, o conteúdo neste wiki está sob a seguinte licença:';
+$lang['licenseok']             = 'Nota: Ao editar esta página você aceita disponibilizar o seu conteúdo sob a seguinte licença:';
+$lang['searchmedia']           = 'Procurar nome de ficheiro:';
+$lang['searchmedia_in']        = 'Procurar em %s';
+$lang['txt_upload']            = 'Escolha ficheiro para carregar:';
+$lang['txt_filename']          = 'Carregar como (opcional):';
+$lang['txt_overwrt']           = 'Escrever por cima do ficheiro já existente';
+$lang['maxuploadsize']         = 'Publique max. %s por arquivo.';
+$lang['lockedby']              = 'Bloqueado por:';
+$lang['lockexpire']            = 'Expira em:';
+$lang['js']['willexpire']      = 'O bloqueio de edição para este documento irá expirar num minuto.\nPara evitar conflitos use o botão Prever para re-iniciar o temporizador de bloqueio.';
+$lang['js']['notsavedyet']     = 'Alterações não gravadas serão perdidas.';
+$lang['js']['searchmedia']     = 'Procurar por ficheiros';
+$lang['js']['keepopen']        = 'Mantenha a janela aberta durante a selecção';
+$lang['js']['hidedetails']     = 'Esconder Detalhes';
+$lang['js']['mediatitle']      = 'Propriedades de ligação';
+$lang['js']['mediadisplay']    = 'Tipo de ligação';
+$lang['js']['mediaalign']      = 'Alinhamento';
+$lang['js']['mediasize']       = 'Tamanho da imagem';
+$lang['js']['mediatarget']     = 'Alvo da ligação';
+$lang['js']['mediaclose']      = 'Fechar';
+$lang['js']['mediainsert']     = 'Inserir';
+$lang['js']['mediadisplayimg'] = 'Mostrar a imagem';
+$lang['js']['mediadisplaylnk'] = 'Mostrar apenas a ligação';
+$lang['js']['mediasmall']      = 'Versão pequena';
+$lang['js']['mediamedium']     = 'Versão média';
+$lang['js']['medialarge']      = 'Versão grande';
+$lang['js']['mediaoriginal']   = 'Versão original';
+$lang['js']['medialnk']        = 'Ligação para a página de detalhe';
+$lang['js']['mediadirect']     = 'Ligação directa para o original';
+$lang['js']['medianolnk']      = 'Nenhuma ligação';
+$lang['js']['medianolink']     = 'Não ligar à imagem';
+$lang['js']['medialeft']       = 'Alinhar a imagem à esquerda.';
+$lang['js']['mediaright']      = 'Alinhar a imagem à direita.';
+$lang['js']['mediacenter']     = 'Alinhar a imagem ao centro.';
+$lang['js']['medianoalign']    = 'Não usar alinhamento algum.';
+$lang['js']['nosmblinks']      = 'Ligação a pastas Windows partilhadas apenas funciona com o Microsoft Internet Explorer.
+Pode no entanto copiar e colar o link.';
+$lang['js']['linkwiz']         = 'Assistente de Criação de Ligação';
+$lang['js']['linkto']          = 'Ligação para:';
+$lang['js']['del_confirm']     = 'Remover o(s) item(s) selecionados?';
+$lang['js']['restore_confirm'] = 'Restaurar esta versão?';
+$lang['js']['media_diff']      = 'Ver diferenças:';
+$lang['js']['media_diff_both'] = 'Lado a Lado';
+$lang['js']['media_diff_opacity'] = 'Sobreposição';
+$lang['js']['media_diff_portions'] = 'Slider';
+$lang['js']['media_select']    = 'Selecione ficheiros…';
+$lang['js']['media_upload_btn'] = 'Enviar';
+$lang['js']['media_done_btn']  = 'Feito';
+$lang['js']['media_drop']      = 'Largue ficheiros aqui para enviar';
+$lang['js']['media_cancel']    = 'remover';
+$lang['js']['media_overwrt']   = 'Escrever por cima de ficheiros existentes';
+$lang['rssfailed']             = 'Ocorreu um erro neste canal RSS: ';
+$lang['nothingfound']          = 'Nada foi encontrado.';
+$lang['mediaselect']           = 'Selecção de ficheiros';
+$lang['uploadsucc']            = 'Carregamento com sucesso';
+$lang['uploadfail']            = 'Falhou o carregamento. Talvez por não ter permissões?';
+$lang['uploadwrong']           = 'Carregamento negado. Esta extensão está proibida.';
+$lang['uploadexist']           = 'O ficheiro já existe. Não pode ser carregado.';
+$lang['uploadbadcontent']      = 'O conteúdo carregado não corresponde à extensão %s.';
+$lang['uploadspam']            = 'O carregamento foi bloqueado pela lista negra de SPAM.';
+$lang['uploadxss']             = 'O carregamento foi bloqueado porque possivelmente contem conteúdo malicioso.';
+$lang['uploadsize']            = 'O ficheiro carregado é demasiado grande. (máx. %s)';
+$lang['deletesucc']            = 'O ficheiro "%s" foi removido.';
+$lang['deletefail']            = 'O ficheiro "%s" não pode ser removido, por favor verifique as permissões.';
+$lang['mediainuse']            = 'O ficheiro "%s" não foi removido porque está ainda a ser usado.';
+$lang['namespaces']            = 'Grupos';
+$lang['mediafiles']            = 'Ficheiros disponíveis em';
+$lang['accessdenied']          = 'Não tem permissão para ver esta página.';
+$lang['mediausage']            = 'Use a seguinte sintaxe para referenciar este ficheiro:';
+$lang['mediaview']             = 'Ver ficheiro original';
+$lang['mediaroot']             = 'root';
+$lang['mediaupload']           = 'Carregar ficheiros para o grupo actual aqui. Para criar sub-grupos: escrever o nome do sub-grupo seguido de : antes do nome do ficheiro no campo "Carregar como".';
+$lang['mediaextchange']        = 'Extensão alterada de .%s para .%s!';
+$lang['reference']             = 'Referências para';
+$lang['ref_inuse']             = 'O ficheiro não pode ser removido, porque está ainda a ser usado nestes documentos:';
+$lang['ref_hidden']            = 'Algumas referências estão em documentos para os quais não tem permissão para ler';
+$lang['hits']                  = 'Resultados';
+$lang['quickhits']             = 'Documentos encontrados';
+$lang['toc']                   = 'Tabela de Conteúdos';
+$lang['current']               = 'Actual';
+$lang['yours']                 = 'A sua versão';
+$lang['diff']                  = 'mostrar diferenças com a versão actual';
+$lang['diff2']                 = 'mostrar diferenças entre versões escolhidas';
+$lang['difflink']              = 'Ligação para esta vista de comparação';
+$lang['diff_type']             = 'Ver diferenças';
+$lang['diff_inline']           = 'Embutido';
+$lang['diff_side']             = 'Lado a lado';
+$lang['diffprevrev']           = 'Revisão anterior';
+$lang['diffnextrev']           = 'Próxima revisão';
+$lang['difflastrev']           = 'Última revisão';
+$lang['diffbothprevrev']       = 'Ambos os lados da revisão anterior';
+$lang['diffbothnextrev']       = 'Ambos os lados da próxima revisão';
+$lang['line']                  = 'Linha';
+$lang['breadcrumb']            = 'Está em:';
+$lang['youarehere']            = 'Está aqui:';
+$lang['lastmod']               = 'Esta página foi modificada pela última vez em:';
+$lang['by']                    = 'por';
+$lang['deleted']               = 'Documento automaticamente removido.';
+$lang['created']               = 'Criação deste novo documento.';
+$lang['restored']              = 'Versão anterior restaurada (%s)';
+$lang['external_edit']         = 'Edição externa';
+$lang['summary']               = 'Sumário da Edição';
+$lang['noflash']               = 'O <a href="http://www.adobe.com/products/flashplayer/">Plugin Adobe Flash</a> é necessário para exibir este conteúdo.';
+$lang['download']              = 'Descarregar Snippet';
+$lang['tools']                 = 'Ferramentas';
+$lang['user_tools']            = 'Ferramentas de Utilizador';
+$lang['site_tools']            = 'Ferramentas de Site';
+$lang['page_tools']            = 'Ferramentas de Página';
+$lang['skip_to_content']       = 'saltar para conteúdo';
+$lang['sidebar']               = 'Barra Lateral';
+$lang['mail_newpage']          = 'documento adicionado:';
+$lang['mail_changed']          = 'documento modificado:';
+$lang['mail_subscribe_list']   = 'páginas alteradas no espaço de nome:';
+$lang['mail_new_user']         = 'Novo utilizador:';
+$lang['mail_upload']           = 'Ficheiro carregado:';
+$lang['changes_type']          = 'Ver alterações de';
+$lang['pages_changes']         = 'Páginas';
+$lang['media_changes']         = 'Ficheiros Media';
+$lang['both_changes']          = 'Tanto páginas como ficheiros media';
+$lang['qb_bold']               = 'Texto com Ênfase';
+$lang['qb_italic']             = 'Texto Itálico';
+$lang['qb_underl']             = 'Texto Sublinhado';
+$lang['qb_code']               = 'Texto Código';
+$lang['qb_strike']             = 'Texto Riscado';
+$lang['qb_h1']                 = 'Cabeçalho Nível 1';
+$lang['qb_h2']                 = 'Cabeçalho Nível 2';
+$lang['qb_h3']                 = 'Cabeçalho Nível 3';
+$lang['qb_h4']                 = 'Cabeçalho Nível 4';
+$lang['qb_h5']                 = 'Cabeçalho Nível 5';
+$lang['qb_h']                  = 'Cabeçalho';
+$lang['qb_hs']                 = 'Seleccionar Cabeçalho';
+$lang['qb_hplus']              = 'Cabeçalho Maior';
+$lang['qb_hminus']             = 'Cabeçalho Menor';
+$lang['qb_hequal']             = 'Cabeçalho de Nível Semelhante';
+$lang['qb_link']               = 'Ligação Interna';
+$lang['qb_extlink']            = 'Ligação Externa';
+$lang['qb_hr']                 = 'Barra Horizontal';
+$lang['qb_ol']                 = 'Item numa Lista Ordenada';
+$lang['qb_ul']                 = 'Item numa Lista Não Ordenada';
+$lang['qb_media']              = 'Incluir imagens e outros ficheiros';
+$lang['qb_sig']                = 'Inserir Assinatura';
+$lang['qb_smileys']            = 'Smileys';
+$lang['qb_chars']              = 'Caracteres Especiais';
+$lang['upperns']               = 'Ir para o espaço de nomes parente';
+$lang['metaedit']              = 'Editar Metadata';
+$lang['metasaveerr']           = 'Falhou a escrita de Metadata';
+$lang['metasaveok']            = 'Metadata gravada';
+$lang['img_title']             = 'Título:';
+$lang['img_caption']           = 'Legenda:';
+$lang['img_date']              = 'Data:';
+$lang['img_fname']             = 'Ficheiro:';
+$lang['img_fsize']             = 'Tamanho:';
+$lang['img_artist']            = 'Fotógrafo:';
+$lang['img_copyr']             = 'Copyright:';
+$lang['img_format']            = 'Formato:';
+$lang['img_camera']            = 'Câmara:';
+$lang['img_keywords']          = 'Palavras-Chave:';
+$lang['img_width']             = 'Largura:';
+$lang['img_height']            = 'Altura:';
+$lang['subscr_subscribe_success'] = 'Adicionado %s à lista de subscrição para %s';
+$lang['subscr_subscribe_error'] = 'Erro ao adicionar %s à lista de subscrição para %s';
+$lang['subscr_subscribe_noaddress'] = 'Não existe endereço algum associado com o seu nome de utilizador, não pode ser adicionado à lista de subscrição';
+$lang['subscr_unsubscribe_success'] = 'Removido %s da lista de subscrição para %s';
+$lang['subscr_unsubscribe_error'] = 'Erro ao remover %s da lista de subscrição para %s';
+$lang['subscr_already_subscribed'] = '%s já está subscrito em %s';
+$lang['subscr_not_subscribed'] = '%s não está subscrito em %s';
+$lang['subscr_m_not_subscribed'] = 'Não está subscrito à página ou espaço de nome corrente.';
+$lang['subscr_m_new_header']   = 'Adicionar subscrição';
+$lang['subscr_m_current_header'] = 'Subscrições correntes';
+$lang['subscr_m_unsubscribe']  = 'Des-subscrever';
+$lang['subscr_m_subscribe']    = 'Subscrever';
+$lang['subscr_m_receive']      = 'Receber';
+$lang['subscr_style_every']    = 'email em qualquer alteração';
+$lang['subscr_style_digest']   = '"digest email" de alterações em cada página (cada %.2f dias)';
+$lang['subscr_style_list']     = 'lista de páginas alteradas desde o último email (cada %.2f dias)';
+$lang['authtempfail']          = 'Autenticação temporariamente indisponível. Se a situação persistir, por favor informe o Wiki Admin.';
+$lang['i_chooselang']          = 'Escolha a linguagem';
+$lang['i_installer']           = 'Instalador do DokuWiki';
+$lang['i_wikiname']            = 'Nome Wiki';
+$lang['i_enableacl']           = 'Activar ACL (recomendado)';
+$lang['i_superuser']           = 'Super-utilizador';
+$lang['i_problems']            = 'O instalador encontrou alguns problemas, indicados mais abaixo. Não pode continuar até que sejam corrigidos.';
+$lang['i_modified']            = 'Por razões de segurança, este script só funciona em novas e não-modificadas instalações do Dokuwiki. Deve por isso re-extrair os ficheiros do pacote que descarregou ou então deve consultar as completas <a href="http://dokuwiki.org/install">instruções de instalação do Dokuwiki installation instructions</a>';
+$lang['i_funcna']              = 'A função PHP <code>%s</code> não está disponível. Terá o serviço de alojamento desactivado-a por alguma razão?';
+$lang['i_phpver']              = 'A versão de PHP actual <code>%s</code> é inferior à versão mínima <code>%s</code>. É preciso actualizar a instalação PHP.';
+$lang['i_mbfuncoverload']      = 'mbstring.func_overload deve ser desabilitada no php.ini para executar DokuWiki.';
+$lang['i_permfail']            = '<code>%s</code> não permite que o DokuWiki escreva nela. É preciso corrigir as permissões desta pasta!';
+$lang['i_confexists']          = '<code>%s</code> já existe';
+$lang['i_writeerr']            = 'Não foi possível criar <code>%s</code>. É preciso verificar as permissões e criar o ficheiro manualmente.';
+$lang['i_badhash']             = 'dokuwiki.php não é o original ou não é reconhecido (hash=<code>%s</code>)';
+$lang['i_badval']              = '<code>%s</code> - valor ilegal ou vazio';
+$lang['i_success']             = 'A instalação e configuração inicial foram bem sucedidas. Pode remover o install.php. Aceda ao seu novo <a href="doku.php?id=wiki:welcome">Wiki</a> a correr o DokuWiki.';
+$lang['i_failure']             = 'Ocorreram alguns erros durante a escrita nos ficheiros de configuração. Poderá ser preciso corrigi-los manualmente antes de poder aceder ao seu novo <a href="doku.php?id=wiki:welcome">Wiki</a> a correr o DokuWiki.';
+$lang['i_policy']              = 'Politica ACL inicial';
+$lang['i_pol0']                = 'Wiki Aberto (ler, escrever e carregar para todos)';
+$lang['i_pol1']                = 'Wiki Público (ler para todos, escrever e carregar para utilizadores inscritos)';
+$lang['i_pol2']                = 'Wiki Fechado (ler, escrever e carregar somente para utilizadores inscritos)';
+$lang['i_allowreg']            = 'Permitir aos utilizadores registarem-se por si próprios';
+$lang['i_retry']               = 'Repetir';
+$lang['i_license']             = 'Por favor escolha a licença sob a qual quer colocar o seu conteúdo:';
+$lang['i_license_none']        = 'Não mostrar nenhuma informação de licença';
+$lang['i_pop_field']           = 'Por favor ajude-nos a melhorar a experiência Dokuwiki:';
+$lang['i_pop_label']           = 'Uma vez por mês, enviar dados anónimos de uso para os desenvolvedores DokuWiki';
+$lang['recent_global']         = 'Você está a observar as alterações dentro do espaço de nomes <b>%s</b>. Também é possível ver as <a href="%s">modificações recentes no wiki inteiro</a>.';
+$lang['years']                 = '%d anos atrás';
+$lang['months']                = '%d meses atrás';
+$lang['weeks']                 = '%d semanas atrás';
+$lang['days']                  = '%d dias atrás';
+$lang['hours']                 = '%d horas atrás';
+$lang['minutes']               = '%d minutos atrás';
+$lang['seconds']               = '%d segundos atrás';
+$lang['wordblock']             = 'A sua alteração não foi guardada porque contém texto bloqueado (spam).';
+$lang['media_uploadtab']       = 'Enviar';
+$lang['media_searchtab']       = 'Procurar';
+$lang['media_file']            = 'Ficheiro';
+$lang['media_viewtab']         = 'Ver';
+$lang['media_edittab']         = 'Editar';
+$lang['media_historytab']      = 'Histórico';
+$lang['media_list_thumbs']     = 'Miniaturas';
+$lang['media_list_rows']       = 'Linhas';
+$lang['media_sort_name']       = 'Ordenar por nome';
+$lang['media_sort_date']       = 'Ordenar por data';
+$lang['media_namespaces']      = 'Escolha o namespace';
+$lang['media_files']           = 'Ficheiros em %s';
+$lang['media_upload']          = 'Enviar para o grupo <strong>%s</strong>.';
+$lang['media_search']          = 'Procurar no grupo <strong>%s</strong>.';
+$lang['media_view']            = '%s';
+$lang['media_viewold']         = '%s em %s';
+$lang['media_edit']            = 'Editar %s';
+$lang['media_history']         = 'Histórico do %s';
+$lang['media_meta_edited']     = 'metadata editada';
+$lang['media_perm_read']       = 'Perdão, não tem permissão para ler ficheiros.';
+$lang['media_perm_upload']     = 'Perdão, não tem permissão para enviar ficheiros.';
+$lang['media_update']          = 'enviar nova versão';
+$lang['media_restore']         = 'Restaurar esta versão';
+$lang['currentns']             = 'Namespace actual';
+$lang['searchresult']          = 'Resultado da pesquisa';
+$lang['plainhtml']             = 'HTML simples';
+$lang['wikimarkup']            = 'Markup de Wiki';
+$lang['page_nonexist_rev']     = 'Página não existia no %s. Posteriormente, foi criado em <a href="%s">%s</a>.';
+$lang['unable_to_parse_date']  = 'Não é possível analisar o parâmetro "%s".';
+$lang['email_signature_text']  = 'Este email foi gerado por DokuWiki em
+@DOKUWIKIURL@';
diff --git a/wiki/inc/lang/pt/locked.txt b/wiki/inc/lang/pt/locked.txt
new file mode 100644
index 0000000..a4bb4d6
--- /dev/null
+++ b/wiki/inc/lang/pt/locked.txt
@@ -0,0 +1,3 @@
+====== Página em Edição ======
+
+Esta página está bloqueada por outro utilizador, que se encontra a editá-la neste momento. Terá que aguardar que o utilizador termine a edição ou que o bloqueio expire.
\ No newline at end of file
diff --git a/wiki/inc/lang/pt/login.txt b/wiki/inc/lang/pt/login.txt
new file mode 100644
index 0000000..42c2a98
--- /dev/null
+++ b/wiki/inc/lang/pt/login.txt
@@ -0,0 +1,3 @@
+====== Entrar ======
+
+Não está actualmente em sessão! Introduza as suas credenciais de autenticação abaixo para para entrar em sessão. Precisa de ter cookies activos no seu navegador.
\ No newline at end of file
diff --git a/wiki/inc/lang/pt/mailtext.txt b/wiki/inc/lang/pt/mailtext.txt
new file mode 100644
index 0000000..844f246
--- /dev/null
+++ b/wiki/inc/lang/pt/mailtext.txt
@@ -0,0 +1,14 @@
+Um documento no site Wiki @DOKUWIKIURL@ foi criado ou modificado.
+
+Aqui estão os detalhes:
+
+Data          : @DATE@
+Browser       : @BROWSER@
+Endereço IP   : @IPADDRESS@
+Hostname      : @HOSTNAME@
+Documento Ant.: @OLDPAGE@
+Documento Novo: @NEWPAGE@
+Edit Summary  : @SUMMARY@
+User          : @USER@
+
+@DIFF@
diff --git a/wiki/inc/lang/pt/newpage.txt b/wiki/inc/lang/pt/newpage.txt
new file mode 100644
index 0000000..2d9c955
--- /dev/null
+++ b/wiki/inc/lang/pt/newpage.txt
@@ -0,0 +1,3 @@
+====== Documento Inexistente ======
+
+Seguiu uma ligação para um documento que ainda não existe. Pode criá-lo usando o botão "Criar página", se as permissões lho permitirem.
\ No newline at end of file
diff --git a/wiki/inc/lang/pt/norev.txt b/wiki/inc/lang/pt/norev.txt
new file mode 100644
index 0000000..6dd8dfb
--- /dev/null
+++ b/wiki/inc/lang/pt/norev.txt
@@ -0,0 +1,7 @@
+====== Revisão Inexistente ======
+
+A revisão especificada não existe.
+
+Clique no botão <Revisões> para aceder à lista de revisões deste documento.
+
+----
diff --git a/wiki/inc/lang/pt/password.txt b/wiki/inc/lang/pt/password.txt
new file mode 100644
index 0000000..cfd81f3
--- /dev/null
+++ b/wiki/inc/lang/pt/password.txt
@@ -0,0 +1,6 @@
+Olá, @FULLNAME@!
+
+Aqui estão as suas credenciais de autenticação para @TITLE@, em @DOKUWIKIURL@
+
+Utilizador : @LOGIN@
+Senha      : @PASSWORD@
diff --git a/wiki/inc/lang/pt/preview.txt b/wiki/inc/lang/pt/preview.txt
new file mode 100644
index 0000000..1a8dab0
--- /dev/null
+++ b/wiki/inc/lang/pt/preview.txt
@@ -0,0 +1,3 @@
+====== Previsão ======
+
+Esta é uma previsão de como ficará o conteúdo. Lembre-se: ainda **não está gravado**!
\ No newline at end of file
diff --git a/wiki/inc/lang/pt/pwconfirm.txt b/wiki/inc/lang/pt/pwconfirm.txt
new file mode 100644
index 0000000..00fee3e
--- /dev/null
+++ b/wiki/inc/lang/pt/pwconfirm.txt
@@ -0,0 +1,9 @@
+Olá @FULLNAME@!
+
+Alguém efectuou um pedido para uma nova senha para o seu perfil @TITLE@ em @DOKUWIKIURL@
+
+Se não foi você que efectuou o pedido então por favor ignore esta mensagem.
+
+Senão, para confirmar o pedido, por favor siga este link:
+
+@CONFIRM@
diff --git a/wiki/inc/lang/pt/read.txt b/wiki/inc/lang/pt/read.txt
new file mode 100644
index 0000000..177b1e8
--- /dev/null
+++ b/wiki/inc/lang/pt/read.txt
@@ -0,0 +1 @@
+Esta página é apenas de leitura. Pode ver a fonte, mas não alterá-la. Informe-se com o administrador deste Wiki se achar que isto não está correcto.
\ No newline at end of file
diff --git a/wiki/inc/lang/pt/recent.txt b/wiki/inc/lang/pt/recent.txt
new file mode 100644
index 0000000..3957df4
--- /dev/null
+++ b/wiki/inc/lang/pt/recent.txt
@@ -0,0 +1,3 @@
+====== Alterações Recentes ======
+
+Os seguintes documentos foram alterados recentemente.
\ No newline at end of file
diff --git a/wiki/inc/lang/pt/register.txt b/wiki/inc/lang/pt/register.txt
new file mode 100644
index 0000000..228cb99
--- /dev/null
+++ b/wiki/inc/lang/pt/register.txt
@@ -0,0 +1,3 @@
+====== Inscrição como novo utilizador ======
+
+Preencha toda a informação abaixo para criar uma nova conta nesta wiki. Assegure que providencia um **endereço de email válido** - se não lhe for pedido que introduza uma nova palavra chave aqui, ser-lhe-á enviada uma para esse endereço. O nome de utilizador deve ser um [[doku>pagename|nome de página]] válido.
\ No newline at end of file
diff --git a/wiki/inc/lang/pt/registermail.txt b/wiki/inc/lang/pt/registermail.txt
new file mode 100644
index 0000000..7f5333d
--- /dev/null
+++ b/wiki/inc/lang/pt/registermail.txt
@@ -0,0 +1,10 @@
+Inscrição de um novo utilizador. Aqui estão os detalhes:
+
+Username : @NEWUSER@
+Nome Completo : @NEWNAME@
+E-mail : @NEWEMAIL@
+
+Data : @DATE@
+Browser : @BROWSER@
+Endereço IP : @IPADDRESS@
+Hostname : @HOSTNAME@
diff --git a/wiki/inc/lang/pt/resendpwd.txt b/wiki/inc/lang/pt/resendpwd.txt
new file mode 100644
index 0000000..9a54ace
--- /dev/null
+++ b/wiki/inc/lang/pt/resendpwd.txt
@@ -0,0 +1,3 @@
+====== Enviar nova senha ======
+
+Por favor, insira o seu nome de utilizador neste formulário para requerer uma nova senha para esta conta/perfil. Um link de confirmação será enviado para o endereço de e-mail associado.
\ No newline at end of file
diff --git a/wiki/inc/lang/pt/resetpwd.txt b/wiki/inc/lang/pt/resetpwd.txt
new file mode 100644
index 0000000..898772a
--- /dev/null
+++ b/wiki/inc/lang/pt/resetpwd.txt
@@ -0,0 +1,3 @@
+====== Definir nova senha ======
+
+Digite uma nova senha para a sua conta nesta wiki.
\ No newline at end of file
diff --git a/wiki/inc/lang/pt/revisions.txt b/wiki/inc/lang/pt/revisions.txt
new file mode 100644
index 0000000..0a0d359
--- /dev/null
+++ b/wiki/inc/lang/pt/revisions.txt
@@ -0,0 +1,3 @@
+====== Revisões antigas ======
+
+Estas são as revisões antigas do documento corrente. Para reverter para uma destas revisões, escolha-a abaixo, clique no botão "Editar página" e grave.
\ No newline at end of file
diff --git a/wiki/inc/lang/pt/searchpage.txt b/wiki/inc/lang/pt/searchpage.txt
new file mode 100644
index 0000000..27a6baa
--- /dev/null
+++ b/wiki/inc/lang/pt/searchpage.txt
@@ -0,0 +1,4 @@
+====== Pesquisa ======
+
+Pode encontrar os resultados da sua pesquisa abaixo. @CREATEPAGEINFO@
+
diff --git a/wiki/inc/lang/pt/showrev.txt b/wiki/inc/lang/pt/showrev.txt
new file mode 100644
index 0000000..25d617f
--- /dev/null
+++ b/wiki/inc/lang/pt/showrev.txt
@@ -0,0 +1 @@
+**Esta é uma versão antiga do documento!**
\ No newline at end of file
diff --git a/wiki/inc/lang/pt/stopwords.txt b/wiki/inc/lang/pt/stopwords.txt
new file mode 100644
index 0000000..373e6ee
--- /dev/null
+++ b/wiki/inc/lang/pt/stopwords.txt
@@ -0,0 +1,141 @@
+# Esta é uma lista de plavaras que o indexador ignora, uma palavra por linha
+# Quando você edita esta lista certifique-se que usa fim de linha usado em sistemas UNIX
+# Não é necessário incluir palavras menores que 3 letras - estas são sempre ignoradas
+# Esta lista é baseada nas encontradas em http://www.ranks.nl/stopwords/
+último
+acerca
+agora
+algmas
+alguns
+ali
+ambos
+antes
+apontar
+aquela
+aquelas
+aquele
+aqueles
+aqui
+atrás
+bem
+bom
+cada
+caminho
+cima
+com
+como
+comprido
+conhecido
+corrente
+das
+debaixo
+dentro
+desde
+desligado
+deve
+devem
+deverá
+direita
+diz
+dizer
+dois
+dos
+ela
+ele
+eles
+enquanto
+então
+está
+estão
+estado
+estar
+estará
+este
+estes
+esteve
+estive
+estivemos
+estiveram
+fará
+faz
+fazer
+fazia
+fez
+fim
+foi
+fora
+horas
+iniciar
+inicio
+irá
+ista
+iste
+isto
+ligado
+maioria
+maiorias
+mais
+mas
+mesmo
+meu
+muito
+muitos
+nós
+não
+nome
+nosso
+novo
+onde
+outro
+para
+parte
+pegar
+pelo
+pessoas
+pode
+poderá
+podia
+por
+porque
+povo
+promeiro
+quê
+qual
+qualquer
+quando
+quem
+quieto
+são
+saber
+sem
+ser
+seu
+somente
+têm
+tal
+também
+tem
+tempo
+tenho
+tentar
+tentaram
+tente
+tentei
+teu
+teve
+tipo
+tive
+todos
+trabalhar
+trabalho
+uma
+umas
+uns
+usa
+usar
+valor
+veja
+ver
+verdade
+verdadeiro
+você
diff --git a/wiki/inc/lang/pt/subscr_digest.txt b/wiki/inc/lang/pt/subscr_digest.txt
new file mode 100644
index 0000000..943bba8
--- /dev/null
+++ b/wiki/inc/lang/pt/subscr_digest.txt
@@ -0,0 +1,16 @@
+Olá!
+
+A página @PAGE@ na wiki @TITLE@ mudou.
+Eis as mudanças:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Revisão Antiga: @OLDPAGE@
+Revisão Nova: @NEWPAGE@
+
+Para cancelar as notificações de página, inicie sessão na wiki em
+@DOKUWIKIURL@, visite
+@SUBSCRIBE@
+e des-subscreva as alterações à página e/ou nome espaço de nome.
diff --git a/wiki/inc/lang/pt/subscr_form.txt b/wiki/inc/lang/pt/subscr_form.txt
new file mode 100644
index 0000000..9bb7b6b
--- /dev/null
+++ b/wiki/inc/lang/pt/subscr_form.txt
@@ -0,0 +1,3 @@
+====== Gestão de Subscrição ======
+
+Esta página permite-lhe gerir as suas subscrições para a página e espaço de nomes correntes.
\ No newline at end of file
diff --git a/wiki/inc/lang/pt/subscr_list.txt b/wiki/inc/lang/pt/subscr_list.txt
new file mode 100644
index 0000000..fdaef5e
--- /dev/null
+++ b/wiki/inc/lang/pt/subscr_list.txt
@@ -0,0 +1,13 @@
+Olá!
+
+Páginas no espaço de nome  @PAGE@ da wiki @TITLE@ mudaram.
+Eis as páginas alteradas:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Para cancelar as notificações de páginas, inicie sessão na wiki em
+@DOKUWIKIURL@, visite
+@SUBSCRIBE@
+e des-subscreva às alterações da página e/ou espaço de nome.
diff --git a/wiki/inc/lang/pt/subscr_single.txt b/wiki/inc/lang/pt/subscr_single.txt
new file mode 100644
index 0000000..10674f7
--- /dev/null
+++ b/wiki/inc/lang/pt/subscr_single.txt
@@ -0,0 +1,19 @@
+Olá!
+
+A página @PAGE@ no wiki @TITLE@ mudou.
+Eis as alterações:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Data : @DATE@
+Utilizador : @USER@
+Sumário de Edição: @SUMMARY@
+Revisão Antiga: @OLDPAGE@
+Revisão Nova: @NEWPAGE@
+
+Para cancelar as notificações de página, inicie sessão no wiki em
+@DOKUWIKIURL@, visite
+@SUBSCRIBE@
+e des-subscreva às alterações de página e/ou espaço de nome.
diff --git a/wiki/inc/lang/pt/updateprofile.txt b/wiki/inc/lang/pt/updateprofile.txt
new file mode 100644
index 0000000..efacfe4
--- /dev/null
+++ b/wiki/inc/lang/pt/updateprofile.txt
@@ -0,0 +1,3 @@
+====== Actualize o seu perfil ======
+
+Apenas precisa de completar os campos que pretende alterar. Não é possível alterar o seu nome de utilizador.
\ No newline at end of file
diff --git a/wiki/inc/lang/pt/uploadmail.txt b/wiki/inc/lang/pt/uploadmail.txt
new file mode 100644
index 0000000..09787e1
--- /dev/null
+++ b/wiki/inc/lang/pt/uploadmail.txt
@@ -0,0 +1,11 @@
+Um ficheiro foi carregado. Aqui estão os detalhes:
+
+Ficheiro       : @MEDIA@
+Revisão antiga : @OLD@
+Data           : @DATE@
+Navegador      : @BROWSER@
+Endereço IP    : @IPADDRESS@
+Hostname       : @HOSTNAME@
+Tamanho        : @SIZE@
+MIME Type      : @MIME@
+Utilizador     : @USER@
diff --git a/wiki/inc/lang/ro/admin.txt b/wiki/inc/lang/ro/admin.txt
new file mode 100644
index 0000000..8c7b3d6
--- /dev/null
+++ b/wiki/inc/lang/ro/admin.txt
@@ -0,0 +1,3 @@
+====== Administrare ======
+
+Poți vedea mai jos o listă cu acțiunile administrative disponibile în DokuWiki.
diff --git a/wiki/inc/lang/ro/adminplugins.txt b/wiki/inc/lang/ro/adminplugins.txt
new file mode 100644
index 0000000..121a8fd
--- /dev/null
+++ b/wiki/inc/lang/ro/adminplugins.txt
@@ -0,0 +1 @@
+===== Plugin-uri suplimentare =====
diff --git a/wiki/inc/lang/ro/backlinks.txt b/wiki/inc/lang/ro/backlinks.txt
new file mode 100644
index 0000000..ae52a10
--- /dev/null
+++ b/wiki/inc/lang/ro/backlinks.txt
@@ -0,0 +1,3 @@
+====== Legături înapoi ======
+
+Aceasta e o listă de pagini care au legături către pagina curentă.
diff --git a/wiki/inc/lang/ro/conflict.txt b/wiki/inc/lang/ro/conflict.txt
new file mode 100644
index 0000000..dcac677
--- /dev/null
+++ b/wiki/inc/lang/ro/conflict.txt
@@ -0,0 +1,7 @@
+====== Există o nouă versiune ======
+
+Există o versiune nouă a paginii editate. Aceasta se întâmplă atunci când
+un alt utilizator a modificat pagina în timp ce editai.
+
+Examinează diferențele indicate mai jos, apoi ia decizia care versiune o vei
+reține. Dacă alegi ''Salvează'', versiunea paginii va fi salvată. Apasă ''Renunțare'' pentru a menține versiunea curentă.
diff --git a/wiki/inc/lang/ro/denied.txt b/wiki/inc/lang/ro/denied.txt
new file mode 100644
index 0000000..490233a
--- /dev/null
+++ b/wiki/inc/lang/ro/denied.txt
@@ -0,0 +1,4 @@
+====== Acces nepermis ======
+
+Din păcate nu ai destule drepturi pentru a continua.
+
diff --git a/wiki/inc/lang/ro/diff.txt b/wiki/inc/lang/ro/diff.txt
new file mode 100644
index 0000000..4bf6250
--- /dev/null
+++ b/wiki/inc/lang/ro/diff.txt
@@ -0,0 +1,3 @@
+====== Diferențe ======
+
+Aici sunt prezentate diferențele dintre versiunile selectate și versiunea curentă a paginii.
diff --git a/wiki/inc/lang/ro/draft.txt b/wiki/inc/lang/ro/draft.txt
new file mode 100644
index 0000000..550db52
--- /dev/null
+++ b/wiki/inc/lang/ro/draft.txt
@@ -0,0 +1,8 @@
+====== Fișierul schiță nu a fost găsit ======
+
+Ultima ta sesiune de editare nu s-a finalizat corect. În vreme ce lucrai,
+DokuWiki a salvat automat o schiță, pe care o poți utiliza acum pentru a
+continua editarea. Mai jos poți vedea informațiile care s-au salvat de la ultima sesiune.
+
+Decide dacă vrei să //recuperezi// sesiunea de editare pierdută, să //ștergi//
+schița salvată automat sau să //anulezi// procesul de editare.
diff --git a/wiki/inc/lang/ro/edit.txt b/wiki/inc/lang/ro/edit.txt
new file mode 100644
index 0000000..cd5aa2e
--- /dev/null
+++ b/wiki/inc/lang/ro/edit.txt
@@ -0,0 +1 @@
+Editează pagina și apasă ''Salvează''. Vezi [[wiki:syntax]] pentru sintaxă. Te rog editează pagina doar pentru a o **îmbunătați**. Dacă vrei să testezi câteva lucruri, învață sa faci primii pași în [[playground:playground]].
diff --git a/wiki/inc/lang/ro/editrev.txt b/wiki/inc/lang/ro/editrev.txt
new file mode 100644
index 0000000..983cd65
--- /dev/null
+++ b/wiki/inc/lang/ro/editrev.txt
@@ -0,0 +1,3 @@
+**Ai încărcat o versiune anterioră a paginii.** Dacă ai salvat-o, vei crea o
+versiune nouă cu aceast conținut.
+----
diff --git a/wiki/inc/lang/ro/index.txt b/wiki/inc/lang/ro/index.txt
new file mode 100644
index 0000000..1ae5b9c
--- /dev/null
+++ b/wiki/inc/lang/ro/index.txt
@@ -0,0 +1,4 @@
+====== Index ======
+
+Acesta e un index al tuturor paginilor ordonat după [[doku>namespaces|spații
+de nume]].
diff --git a/wiki/inc/lang/ro/install.html b/wiki/inc/lang/ro/install.html
new file mode 100644
index 0000000..222b86e
--- /dev/null
+++ b/wiki/inc/lang/ro/install.html
@@ -0,0 +1,10 @@
+<p>Această pagină oferă asistență la instalarea pentru prima dată a <a href="http://dokuwiki.org">Dokuwiki</a>. Mai multe informații privind această instalare găsești în <a href="http://dokuwiki.org/installer">pagina de documentație</a>.</p>
+
+<p>DokuWiki folosește fișiere obișnuite pentru stocarea paginilor wiki și a informaților asociate acestor pagini (de ex. imagini, indecși de căutare, versiuni vechi etc.). Pentru a putea fi folosit, DokuWiki <strong>trebuie</strong> să aibă drepturi de scriere în directoarele ce conțin aceste fișiere.
+Acest script de instalare nu poate configura drepturile directoarelor. De regulă, aceasta se face direct, în linie de comandă, sau în cazul unoi soluții de hosting, prin FTP sau prin panoul de control al gazdei (de ex. cPanel).</p>
+
+<p>Acest script de instalare va configura DokuWiki pentru <abbr title="access control list">ACL</abbr>, care permite autentificarea administratorului și accesul la meniul de administrare pentru instalarea plugin-urilor, gestiunea utilizatorilor, accesului la paginile wiki și modificarea configurației.
+Acest script nu este necesar pentru funcționarea DokuWiki, însă ușurează administrarea.
+
+<p>Utilizatorii experimentați sau utilizatorii care au nevoie de o configurație specială pot accesa paginile cu <a href="http://dokuwiki.org/install">instrucțiunile de instalare</a> și <a href="http://dokuwiki.org/config">opțiunile de configurare</a> a DokuWiki.</p>
+
diff --git a/wiki/inc/lang/ro/jquery.ui.datepicker.js b/wiki/inc/lang/ro/jquery.ui.datepicker.js
new file mode 100644
index 0000000..b26665c
--- /dev/null
+++ b/wiki/inc/lang/ro/jquery.ui.datepicker.js
@@ -0,0 +1,40 @@
+/* Romanian initialisation for the jQuery UI date picker plugin.
+ *
+ * Written by Edmond L. (ll_edmond@walla.com)
+ * and Ionut G. Stan (ionut.g.stan@gmail.com)
+ */
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "../widgets/datepicker" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery.datepicker );
+	}
+}( function( datepicker ) {
+
+datepicker.regional.ro = {
+	closeText: "Închide",
+	prevText: "&#xAB; Luna precedentă",
+	nextText: "Luna următoare &#xBB;",
+	currentText: "Azi",
+	monthNames: [ "Ianuarie","Februarie","Martie","Aprilie","Mai","Iunie",
+	"Iulie","August","Septembrie","Octombrie","Noiembrie","Decembrie" ],
+	monthNamesShort: [ "Ian", "Feb", "Mar", "Apr", "Mai", "Iun",
+	"Iul", "Aug", "Sep", "Oct", "Nov", "Dec" ],
+	dayNames: [ "Duminică", "Luni", "Marţi", "Miercuri", "Joi", "Vineri", "Sâmbătă" ],
+	dayNamesShort: [ "Dum", "Lun", "Mar", "Mie", "Joi", "Vin", "Sâm" ],
+	dayNamesMin: [ "Du","Lu","Ma","Mi","Jo","Vi","Sâ" ],
+	weekHeader: "Săpt",
+	dateFormat: "dd.mm.yy",
+	firstDay: 1,
+	isRTL: false,
+	showMonthAfterYear: false,
+	yearSuffix: "" };
+datepicker.setDefaults( datepicker.regional.ro );
+
+return datepicker.regional.ro;
+
+} ) );
diff --git a/wiki/inc/lang/ro/lang.php b/wiki/inc/lang/ro/lang.php
new file mode 100644
index 0000000..69d04ab
--- /dev/null
+++ b/wiki/inc/lang/ro/lang.php
@@ -0,0 +1,338 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Tiberiu Micu <tibimicu@gmx.net>
+ * @author Sergiu Baltariu <s_baltariu@yahoo.com>
+ * @author Emanuel-Emeric Andrași <n30@mandrivausers.ro>
+ * @author Emanuel-Emeric Andrași <em.andrasi@mandrivausers.ro>
+ * @author Marius OLAR <olarmariusalex@gmail.com>
+ * @author Marius Olar <olarmariusalex@yahoo.com>
+ * @author Marian Banica <banica.marian@gmail.com>
+ * @author Adrian Vesa <adrianvesa@dotwikis.com>
+ * @author valentina_prof <sadoveanu.inform@gmail.com>
+ */
+$lang['encoding']              = 'utf-8';
+$lang['direction']             = 'ltr';
+$lang['doublequoteopening']    = '„';
+$lang['doublequoteclosing']    = '“';
+$lang['singlequoteopening']    = '‚';
+$lang['singlequoteclosing']    = '‘';
+$lang['apostrophe']            = '’';
+$lang['btn_edit']              = 'Editează această pagină';
+$lang['btn_source']            = 'Arată sursa paginii';
+$lang['btn_show']              = 'Arată pagina';
+$lang['btn_create']            = 'Creează această pagină';
+$lang['btn_search']            = 'Caută';
+$lang['btn_save']              = 'Salvează';
+$lang['btn_preview']           = 'Previzualizează';
+$lang['btn_top']               = 'La început';
+$lang['btn_newer']             = '<< mai recent';
+$lang['btn_older']             = 'mai vechi>>';
+$lang['btn_revs']              = 'Versiuni anterioare';
+$lang['btn_recent']            = 'Modificări recente';
+$lang['btn_upload']            = 'Upload';
+$lang['btn_cancel']            = 'Renunțare';
+$lang['btn_index']             = 'Index';
+$lang['btn_secedit']           = 'Editează';
+$lang['btn_login']             = 'Autentificare';
+$lang['btn_logout']            = 'Deconectare';
+$lang['btn_admin']             = 'Administrativ';
+$lang['btn_update']            = 'Actualizează';
+$lang['btn_delete']            = 'Șterge';
+$lang['btn_back']              = 'Înapoi';
+$lang['btn_backlink']          = 'Legătură anterioară';
+$lang['btn_subscribe']         = 'Subscrie modificarea paginii';
+$lang['btn_profile']           = 'Actualizează profil';
+$lang['btn_reset']             = 'Resetează';
+$lang['btn_resendpwd']         = 'Configurează o parolă nouă';
+$lang['btn_draft']             = 'Editează schiță';
+$lang['btn_recover']           = 'Recuperează schiță';
+$lang['btn_draftdel']          = 'Șterge schiță';
+$lang['btn_revert']            = 'Revenire';
+$lang['btn_register']          = 'Înregistrează';
+$lang['btn_apply']             = 'Aplică';
+$lang['btn_media']             = 'Administrare media';
+$lang['btn_deleteuser']        = 'Sterge-mi contul';
+$lang['btn_img_backto']        = 'Înapoi la %s';
+$lang['btn_mediaManager']      = 'Vizualizează în administratorul media';
+$lang['loggedinas']            = 'Autentificat ca:';
+$lang['user']                  = 'Utilizator';
+$lang['pass']                  = 'Parola';
+$lang['newpass']               = 'Parola nouă';
+$lang['oldpass']               = 'Confirmă parola curentă';
+$lang['passchk']               = 'Încă o dată';
+$lang['remember']              = 'Ține-mă minte';
+$lang['fullname']              = 'Nume complet';
+$lang['email']                 = 'E-mail';
+$lang['profile']               = 'Profil utilizator';
+$lang['badlogin']              = 'Ne pare rău, utilizatorul și/sau parola au fost greșite.';
+$lang['badpassconfirm']        = 'Ne pare rau, parola este gresita';
+$lang['minoredit']             = 'Modificare minoră';
+$lang['draftdate']             = 'Schiță salvată automat la';
+$lang['nosecedit']             = 'Pagina s-a modificat între timp, secțiunea info a expirat, s-a încărcat pagina întreagă în loc.';
+$lang['regmissing']            = 'Ne pare rău, trebuie să completezi toate cîmpurile.';
+$lang['reguexists']            = 'Ne pare rău, un utilizator cu acest nume este deja autentificat.';
+$lang['regsuccess']            = 'Utilizatorul a fost creat. Parola a fost trimisă prin e-mail.';
+$lang['regsuccess2']           = 'Utilizatorul a fost creat.';
+$lang['regfail']               = 'Utilizatorul nu a putu fi creat.';
+$lang['regmailfail']           = 'Se pare că a fost o eroare la trimiterea parolei prin e-mail. Contactează administratorul!';
+$lang['regbadmail']            = 'Adresa de e-mail este nevalidă - dacă ești de părere că este o eroare contactează administratorul.';
+$lang['regbadpass']            = 'Cele două parole furnizate nu sunt identice; încearcă din nou.';
+$lang['regpwmail']             = 'Parola ta DokuWiki';
+$lang['reghere']               = 'Încă nu ai un cont? Creează unul!';
+$lang['profna']                = 'Acest wiki nu permite modificarea profilului';
+$lang['profnochange']          = 'Nici o modificare; nimic de făcut.';
+$lang['profnoempty']           = 'Nu sunt permise numele sau adresa de e-mail necompletate.';
+$lang['profchanged']           = 'Profilul de utilizator a fost actualizat cu succes.';
+$lang['profnodelete']          = 'Acest wiki nu accepta stergerea conturilor utilizatorilor';
+$lang['profdeleteuser']        = 'Sterge cont';
+$lang['profdeleted']           = 'Contul tau a fost sters de pe acest wiki';
+$lang['profconfdelete']        = 'As dori sa sterf contul meu de pe acest Wiki. <br/> Aceasta actiune nu poate fi anulata.';
+$lang['proffail']              = 'Profilul utilizatorului nu a fost actualizat.';
+$lang['pwdforget']             = 'Parolă uitată? Obține una nouă!';
+$lang['resendna']              = 'Acest wiki nu permite retrimiterea parolei.';
+$lang['resendpwd']             = 'Configurează o parolă nouă pentru';
+$lang['resendpwdmissing']      = 'Ne pare rău, trebuie completate toate câmpurile.';
+$lang['resendpwdnouser']       = 'Ne pare rău, acest utilizator nu poate fi găsit în baza de date.';
+$lang['resendpwdbadauth']      = 'Ne pare rău, acest cod de autorizare nu este corect. Verifică dacă ai folosit întreg link-ul de confirmare.';
+$lang['resendpwdconfirm']      = 'Un link de confirmare a fost trimis prin e-mail.';
+$lang['resendpwdsuccess']      = 'Noua parolă a fost trimisă prin e-mail.';
+$lang['license']               = 'Exceptând locurile unde este altfel specificat, conținutul acestui wiki este licențiat sub următoarea licență:';
+$lang['licenseok']             = 'Notă: Prin editarea acestei pagini ești de acord să publici conțintul sub următoarea licență:';
+$lang['searchmedia']           = 'Caută numele fișierului:';
+$lang['searchmedia_in']        = 'Caută în %s';
+$lang['txt_upload']            = 'Selectează fișierul de încărcat:';
+$lang['txt_filename']          = 'Încarcă fișierul ca (opțional):';
+$lang['txt_overwrt']           = 'Suprascrie fișierul existent';
+$lang['maxuploadsize']         = 'Incarcare maxima %s per fisier.';
+$lang['lockedby']              = 'Momentan blocat de:';
+$lang['lockexpire']            = 'Blocarea expiră la:';
+$lang['js']['willexpire']      = 'Blocarea pentru editarea paginii expiră intr-un minut.\nPentru a preveni conflictele folosește butonul de previzualizare pentru resetarea blocării.';
+$lang['js']['notsavedyet']     = 'Există modificări nesalvate care se vor pierde.
+Dorești să continui?';
+$lang['js']['searchmedia']     = 'Caută fișiere';
+$lang['js']['keepopen']        = 'Menține fereastra deschisă la selecție';
+$lang['js']['hidedetails']     = 'Ascunde detalii';
+$lang['js']['mediatitle']      = 'Configurare link';
+$lang['js']['mediadisplay']    = 'Tip de link';
+$lang['js']['mediaalign']      = 'Aliniere';
+$lang['js']['mediasize']       = 'Mărime imagine';
+$lang['js']['mediatarget']     = 'Țintă link';
+$lang['js']['mediaclose']      = 'Închide';
+$lang['js']['mediainsert']     = 'Inserează';
+$lang['js']['mediadisplayimg'] = 'Afișează imaginea';
+$lang['js']['mediadisplaylnk'] = 'Afișează doar link-ul';
+$lang['js']['mediasmall']      = 'Versiune mică';
+$lang['js']['mediamedium']     = 'Versiune medie';
+$lang['js']['medialarge']      = 'Versiune mare';
+$lang['js']['mediaoriginal']   = 'Versiune inițială';
+$lang['js']['medialnk']        = 'Link către pagina detaliilor';
+$lang['js']['mediadirect']     = 'Link direct către versiunea inițială';
+$lang['js']['medianolnk']      = 'Fără link';
+$lang['js']['medianolink']     = 'Nu crea link către imagine';
+$lang['js']['medialeft']       = 'Aliniază imaginea la stânga';
+$lang['js']['mediaright']      = 'Aliniază imaginea la dreapta';
+$lang['js']['mediacenter']     = 'Aliniază imaginea la centru';
+$lang['js']['medianoalign']    = 'Nu utiliza aliniere';
+$lang['js']['nosmblinks']      = 'Link-urile către sharing-uri Windows funcționeaza numai în Microsoft Internet Explorer.
+Poți însă copia și insera link-ul.';
+$lang['js']['linkwiz']         = 'Asistent legătură';
+$lang['js']['linkto']          = 'Legătură la:';
+$lang['js']['del_confirm']     = 'Ești sigur de ștergerea elementele selectate?';
+$lang['js']['restore_confirm'] = 'Ești sigur de restaurarea acestei versiuni?';
+$lang['js']['media_diff']      = 'Arată diferențele:';
+$lang['js']['media_diff_both'] = 'Unul lângă altul';
+$lang['js']['media_diff_opacity'] = 'Străveziu';
+$lang['js']['media_diff_portions'] = 'Glisează';
+$lang['js']['media_select']    = 'Selectează fișierele...';
+$lang['js']['media_upload_btn'] = 'Încarcă';
+$lang['js']['media_done_btn']  = 'Gata';
+$lang['js']['media_drop']      = 'Lasă fișierele aici pentru încărcarea lor';
+$lang['js']['media_cancel']    = 'Înlătură';
+$lang['js']['media_overwrt']   = 'Suprascrie fișierele deja existente';
+$lang['rssfailed']             = 'A apărut o eroare in timpul descărcării acestui câmp: ';
+$lang['nothingfound']          = 'Nu am găsit nimic.';
+$lang['mediaselect']           = 'Fișiere media';
+$lang['uploadsucc']            = 'Încărcare reușită';
+$lang['uploadfail']            = 'Încărcare eșuată. Poate din cauza permisiunilor?';
+$lang['uploadwrong']           = 'Încărcare nepermisă. Extensia fișierului e nepermisă';
+$lang['uploadexist']           = 'Fișierul există deja. Nimic nu a fost făcut.';
+$lang['uploadbadcontent']      = 'Conținutul încărcat nu corespunde extensiei fișierului %s.';
+$lang['uploadspam']            = 'Încărcarea a fost blocată din cauza listei negre de spam.';
+$lang['uploadxss']             = 'Încărcarea a fost blocată din cauza unui posibil conținut dăunător.';
+$lang['uploadsize']            = 'Fișierul uploadat a fost prea mare. (max %s)';
+$lang['deletesucc']            = 'Fișierul "%s" a fost șters.';
+$lang['deletefail']            = '"%s" nu a putut fi șters - verifică permisiunile.';
+$lang['mediainuse']            = 'Fișierul "%s" nu a fost șters - este încă în uz.';
+$lang['namespaces']            = 'Spații de nume';
+$lang['mediafiles']            = 'Fișiere disponibile în';
+$lang['accessdenied']          = 'Nu îți este permis să vizualizezi această pagină.';
+$lang['mediausage']            = 'Folosește următoarea sintaxă pentru a face referință la acest fișier:';
+$lang['mediaview']             = 'Vizualizează fișierul inițial';
+$lang['mediaroot']             = 'root';
+$lang['mediaupload']           = 'Încarcă un fișier in acest spațiu de nume. Pentru a crea sub-spații de nume, adaugă-le la fișierul de încărcat, separate de doua puncte (:).';
+$lang['mediaextchange']        = 'Extensia fișierului a fost modificată din .%s în .%s.';
+$lang['reference']             = 'Referință pentru';
+$lang['ref_inuse']             = 'Fișierul nu a putut fi șters întrucât este folosit de următoarele pagini:';
+$lang['ref_hidden']            = 'Nu ai permisiunea să citești o parte din referințele din pagină.';
+$lang['hits']                  = 'Accese';
+$lang['quickhits']             = 'Nume de pagini potrivite';
+$lang['toc']                   = 'Cuprins';
+$lang['current']               = 'curent';
+$lang['yours']                 = 'Versiunea ta';
+$lang['diff']                  = 'Arată diferențele față de versiunea curentă';
+$lang['diff2']                 = 'Arată diferențele dintre versiunile selectate';
+$lang['difflink']              = 'Link către această vizualizare comparativă';
+$lang['diff_type']             = 'Vezi diferențe:';
+$lang['diff_inline']           = 'Succesiv';
+$lang['diff_side']             = 'Alăturate';
+$lang['diffprevrev']           = 'Versiuni anterioare';
+$lang['diffnextrev']           = 'Urmatoarea versiune';
+$lang['difflastrev']           = 'Ultima versiune';
+$lang['line']                  = 'Linia';
+$lang['breadcrumb']            = 'Traseu:';
+$lang['youarehere']            = 'Ești aici:';
+$lang['lastmod']               = 'Ultima modificare:';
+$lang['by']                    = 'de către';
+$lang['deleted']               = 'șters';
+$lang['created']               = 'creat';
+$lang['restored']              = 'versiune veche restaurată (%s)';
+$lang['external_edit']         = 'editare externă';
+$lang['summary']               = 'Editează sumarul';
+$lang['noflash']               = 'Plugin-ul <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> este necesar pentru afișarea corectă a conținutului.';
+$lang['download']              = 'Bloc descărcări';
+$lang['tools']                 = 'Unelte';
+$lang['user_tools']            = 'Unelte utilizator';
+$lang['site_tools']            = 'Unelte site';
+$lang['page_tools']            = 'Unelte pagină';
+$lang['skip_to_content']       = 'mergi la conținut';
+$lang['mail_newpage']          = 'pagină adăugată:';
+$lang['mail_changed']          = 'pagină schimbată:';
+$lang['mail_subscribe_list']   = 'pagini modificate în spațiul de nume:';
+$lang['mail_new_user']         = 'utilizator nou';
+$lang['mail_upload']           = 'fișier încărcat:';
+$lang['changes_type']          = 'Vizualizare modificări';
+$lang['pages_changes']         = 'Pagini';
+$lang['media_changes']         = 'Fișiere media';
+$lang['both_changes']          = 'Ambele pagini și fișiere media';
+$lang['qb_bold']               = 'Text aldin';
+$lang['qb_italic']             = 'Text cursiv';
+$lang['qb_underl']             = 'Text subliniat';
+$lang['qb_code']               = 'Text cod';
+$lang['qb_strike']             = 'Text tăiat';
+$lang['qb_h1']                 = 'Titlu de nivel 1';
+$lang['qb_h2']                 = 'Titlu de nivel 2';
+$lang['qb_h3']                 = 'Titlu de nivel 3';
+$lang['qb_h4']                 = 'Titlu de nivel 4';
+$lang['qb_h5']                 = 'Titlu de nivel 5';
+$lang['qb_h']                  = 'Titlu';
+$lang['qb_hs']                 = 'Selectează titlul';
+$lang['qb_hplus']              = 'Titlu mai mare';
+$lang['qb_hminus']             = 'Titlu mai mic';
+$lang['qb_hequal']             = 'Titlu de același nivel';
+$lang['qb_link']               = 'Link intern';
+$lang['qb_extlink']            = 'Link extern';
+$lang['qb_hr']                 = 'Linie orizontală';
+$lang['qb_ol']                 = 'Listă ordonată';
+$lang['qb_ul']                 = 'Listă neordoată';
+$lang['qb_media']              = 'Adaugă imagini și alte fișiere';
+$lang['qb_sig']                = 'Inserează semnătură';
+$lang['qb_smileys']            = 'Smiley-uri';
+$lang['qb_chars']              = 'Caractere speciale';
+$lang['upperns']               = 'Accesează spațiul de nume părinte';
+$lang['metaedit']              = 'Editează metadata';
+$lang['metasaveerr']           = 'Scrierea metadatelor a eșuat';
+$lang['metasaveok']            = 'Metadatele au fost salvate';
+$lang['img_title']             = 'Titlu:';
+$lang['img_caption']           = 'Legendă:';
+$lang['img_date']              = 'Dată:';
+$lang['img_fname']             = 'Nume fișier:';
+$lang['img_fsize']             = 'Dimensiune:';
+$lang['img_artist']            = 'Fotograf:';
+$lang['img_copyr']             = 'Drept de autor:';
+$lang['img_format']            = 'Format:';
+$lang['img_camera']            = 'Camera:';
+$lang['img_keywords']          = 'Cuvinte cheie:';
+$lang['img_width']             = 'Lățime:';
+$lang['img_height']            = 'Înălțime:';
+$lang['subscr_subscribe_success'] = 'Adăugat %s la lista de abonare pentru %s';
+$lang['subscr_subscribe_error'] = 'Eroare la adăugarea %s la lista de abonare pentru %s';
+$lang['subscr_subscribe_noaddress'] = 'Nu există adresă de e-mail asociată autentificării curente, nu poți fi adăugat la lista de abonare';
+$lang['subscr_unsubscribe_success'] = 'Șters %s din lista de abonare pentru %s';
+$lang['subscr_unsubscribe_error'] = 'Eroare la ștergerea %s din lista de abonare pentru %s';
+$lang['subscr_already_subscribed'] = '%s este deja abonat la %s';
+$lang['subscr_not_subscribed'] = '%s nu este abonat la %s';
+$lang['subscr_m_not_subscribed'] = 'Momentan nu ești abonat la pagina curentă sau la spațiul de nume.';
+$lang['subscr_m_new_header']   = 'Adaugă abonare';
+$lang['subscr_m_current_header'] = 'Abonări curente';
+$lang['subscr_m_unsubscribe']  = 'Dezabonează-te';
+$lang['subscr_m_subscribe']    = 'Abonează-te';
+$lang['subscr_m_receive']      = 'Primește';
+$lang['subscr_style_every']    = 'e-mail la ficare schimbare';
+$lang['subscr_style_digest']   = 'e-mail cu sumar al modificărilor pentru fiecare pagină (la fiecare %.2f zile)';
+$lang['subscr_style_list']     = 'lista paginilor modificate de la ultimul e-mail (la fiecare %.2f zile)';
+$lang['authtempfail']          = 'Autentificarea utilizatorului este temporar indisponibilă. Contactează administratorul.';
+$lang['i_chooselang']          = 'Alege limba';
+$lang['i_installer']           = 'Installer DokuWiki';
+$lang['i_wikiname']            = 'Numele acestui wiki';
+$lang['i_enableacl']           = 'Activează ACL (liste de control a accesului) (recomandat)';
+$lang['i_superuser']           = 'Utilizator privilegiat';
+$lang['i_problems']            = 'Programul de instalare a găsit câteva probleme, indicate mai jos. Nu poți continua până nu le rezolvi.';
+$lang['i_modified']            = 'Din motive de securitate, acest script va funcționa doar cu o instalare nouă și nemodificată a DokuWiki.
+Poți fie să extragi din nou fișierele din arhiva descărcată fie să consulți instrucțiunile de instalare DokuWiki la <a href="http://dokuwiki.org/install">';
+$lang['i_funcna']              = 'Funcția PHP <code>%s</code> nu este disponibilă. Probabil provider-ul tău a dezactivat-o pentru un motiv anume.';
+$lang['i_phpver']              = 'Versiunea ta de PHP <code>%s</code> este mai veche decât cea necesară (<code>%s</code>). Trebuie să îți actualizezi instalarea PHP.';
+$lang['i_permfail']            = '<code>%s</code> nu poate fi scris de către DokuWiki. Trebuie să modifici permisiunile pe acest director.';
+$lang['i_confexists']          = '<code>%s</code> există deja';
+$lang['i_writeerr']            = 'Nu s-a putut crea <code>%s</code>. Trebuie să verifici permisiunile directorului/fișierului și să creezi fișierul manual.';
+$lang['i_badhash']             = 'dokuwiki.php nu a fost recunoscut sau a fost modificat (hash=<code>%s</code>)';
+$lang['i_badval']              = '<code>%s</code> - valoare nepemisă sau neintrodusă';
+$lang['i_success']             = 'Configurarea a fost finalizată cu succes. Acum poți sterge fișierul install.php. Poți accesa <a href="doku.php?id=wiki:welcome">noua ta instanță DokuWiki</a>.';
+$lang['i_failure']             = 'Au apărut erori la scrierea fișierelor de configurare. Va trebui să le corectezi manual înainte de a putea folosi <a href="doku.php?id=wiki:welcome">noua ta instanță DokuWiki</a>.';
+$lang['i_policy']              = 'Politica ACL (liste de control a accesului) inițială';
+$lang['i_pol0']                = 'Wiki deschis (oricine poate citi, scrie și încărca fișiere)';
+$lang['i_pol1']                = 'Wiki public (oricine poate citi, utilizatorii înregistrați pot scrie și încărca fișiere)';
+$lang['i_pol2']                = 'Wiki închis (doar utilizatorii înregistrați pot citi, scrie și încărca fișiere)';
+$lang['i_allowreg']            = 'Permite utilizatorilor sa se inregistreze singuri.';
+$lang['i_retry']               = 'Încearcă din nou';
+$lang['i_license']             = 'Te rugăm să alegi licența sub care dorești să publici conținutul:';
+$lang['i_license_none']        = 'Nu arata nici o informatie despre licenta.';
+$lang['i_pop_field']           = 'Te rog, ajuta-ne sa imbunatatim experienta DokuWiki.';
+$lang['i_pop_label']           = 'Odata pe luna, trimite date catre dezvoltatorii DokuWiki in mod anonim.';
+$lang['recent_global']         = 'În acest moment vizualizezi modificările în interiorul spațiului de nume <b>%s</b>. De asemenea poți <a href="%s">vizualiza modificările recente în întregului wiki-ul</a>.';
+$lang['years']                 = 'acum %d ani';
+$lang['months']                = 'acum %d luni';
+$lang['weeks']                 = 'acum %d săptămâni';
+$lang['days']                  = 'acum %d zile';
+$lang['hours']                 = 'acum %d ore';
+$lang['minutes']               = 'acum %d minute';
+$lang['seconds']               = 'acum %d secunde';
+$lang['wordblock']             = 'Modificarea ta nu a fost salvată deoarece conține text blocat (spam).';
+$lang['media_uploadtab']       = 'Încărcare fișier';
+$lang['media_searchtab']       = 'Căutare';
+$lang['media_file']            = 'Fișier';
+$lang['media_viewtab']         = 'Vizualizare';
+$lang['media_edittab']         = 'Editare';
+$lang['media_historytab']      = 'Istoric';
+$lang['media_list_thumbs']     = 'Miniaturi';
+$lang['media_list_rows']       = 'Linii';
+$lang['media_sort_name']       = 'Nume';
+$lang['media_sort_date']       = 'Dată';
+$lang['media_namespaces']      = 'Alege spațiul de nume';
+$lang['media_files']           = 'Fișiere în %s';
+$lang['media_upload']          = 'Încărcare în %s';
+$lang['media_search']          = 'Cautare în %s';
+$lang['media_view']            = '%s';
+$lang['media_viewold']         = '%s în %s';
+$lang['media_edit']            = 'Editare %s';
+$lang['media_history']         = 'Istoricul pentru %s';
+$lang['media_meta_edited']     = 'metadate editate';
+$lang['media_perm_read']       = 'Ne pare rău, dar nu ai suficiente permisiuni pentru a putea citi fișiere.';
+$lang['media_perm_upload']     = 'Ne pare rău, dar nu ai suficiente permisiuni pentru a putea încărca fișiere.';
+$lang['media_update']          = 'Încarcă noua versiune';
+$lang['media_restore']         = 'Restaurează această versiune';
+$lang['searchresult']          = 'Rezultatul cautarii';
+$lang['email_signature_text']  = 'Acest e-mail a fost generat de DokuWiki la
+@DOKUWIKIURL@';
diff --git a/wiki/inc/lang/ro/locked.txt b/wiki/inc/lang/ro/locked.txt
new file mode 100644
index 0000000..d1e80ad
--- /dev/null
+++ b/wiki/inc/lang/ro/locked.txt
@@ -0,0 +1,4 @@
+====== Pagină blocată ======
+
+Pagina este momentan blocată de alt utilizator. Trebuie să aștepți pînă când
+acest utilizator termină editarea sau până când expiră blocarea.
diff --git a/wiki/inc/lang/ro/login.txt b/wiki/inc/lang/ro/login.txt
new file mode 100644
index 0000000..7de38f6
--- /dev/null
+++ b/wiki/inc/lang/ro/login.txt
@@ -0,0 +1,4 @@
+====== Autentificare ======
+
+Nu ești autentificat! Introdu datele de autentificare. Pentru ca
+autentificarea să funcționeze trebuie să fie permise cookie-urile în browser.
diff --git a/wiki/inc/lang/ro/mailtext.txt b/wiki/inc/lang/ro/mailtext.txt
new file mode 100644
index 0000000..14a1538
--- /dev/null
+++ b/wiki/inc/lang/ro/mailtext.txt
@@ -0,0 +1,13 @@
+Salutare, @FULLNAME@!
+
+A fost adăugată sau modificată o pagină. Aici sunt detaliile:
+
+Dată        : @DATE@
+Browser   : @BROWSER@
+Adresă IP   : @IPADDRESS@
+Hostname  : @HOSTNAME@
+Versiune anterioară : @OLDPAGE@
+Versiune curentă  : @NEWPAGE@
+Sumar editare: @SUMMARY@
+
+@DIFF@
diff --git a/wiki/inc/lang/ro/newpage.txt b/wiki/inc/lang/ro/newpage.txt
new file mode 100644
index 0000000..2ef3513
--- /dev/null
+++ b/wiki/inc/lang/ro/newpage.txt
@@ -0,0 +1,3 @@
+====== Pagina nu există încă ======
+
+Ai urmat o legătură către o pagină care nu există. O poti crea prin apăsarea butonului ''Editează această pagină''.
diff --git a/wiki/inc/lang/ro/norev.txt b/wiki/inc/lang/ro/norev.txt
new file mode 100644
index 0000000..08bbb74
--- /dev/null
+++ b/wiki/inc/lang/ro/norev.txt
@@ -0,0 +1,4 @@
+====== Nu există versiunea paginii ======
+
+Versiunea indicată nu există. Folosește butonul ''Versiuni anterioare'' pentru
+o listă a versiunilor acestei pagini.
diff --git a/wiki/inc/lang/ro/password.txt b/wiki/inc/lang/ro/password.txt
new file mode 100644
index 0000000..3f8ae24
--- /dev/null
+++ b/wiki/inc/lang/ro/password.txt
@@ -0,0 +1,6 @@
+Salutare, @FULLNAME@!
+
+Aici se găsesc credențialele de utilizator pentru @TITLE@ la @DOKUWIKIURL@
+
+Login    : @LOGIN@
+Parola   : @PASSWORD@
diff --git a/wiki/inc/lang/ro/preview.txt b/wiki/inc/lang/ro/preview.txt
new file mode 100644
index 0000000..c89d197
--- /dev/null
+++ b/wiki/inc/lang/ro/preview.txt
@@ -0,0 +1,3 @@
+====== Previzualizare ======
+
+Acesta este modul în care va arăta textul. Ai în vedere: **Nu** e încă **salvat**!
diff --git a/wiki/inc/lang/ro/pwconfirm.txt b/wiki/inc/lang/ro/pwconfirm.txt
new file mode 100644
index 0000000..1123b8b
--- /dev/null
+++ b/wiki/inc/lang/ro/pwconfirm.txt
@@ -0,0 +1,10 @@
+Salutare, @FULLNAME@!
+
+Cineva a cerut o parolă nouă pentru @TITLE@ pentru conectarea la
+@DOKUWIKIURL@.
+
+Dacă nu ai solicitat o parolă nouă, ignoră acest e-mail.
+
+Pentru a confirma că cererea a fost într-adevăr trimisă de tine, folosește link-ul de mai jos.
+
+@CONFIRM@
diff --git a/wiki/inc/lang/ro/read.txt b/wiki/inc/lang/ro/read.txt
new file mode 100644
index 0000000..442188f
--- /dev/null
+++ b/wiki/inc/lang/ro/read.txt
@@ -0,0 +1,2 @@
+Această pagină poate fi doar citită. Poți vedea sursa, dar nu poți modifica
+pagina. Consultă administratorul dacă ești de părere că ceva este în neregulă.
diff --git a/wiki/inc/lang/ro/recent.txt b/wiki/inc/lang/ro/recent.txt
new file mode 100644
index 0000000..e92ca8f
--- /dev/null
+++ b/wiki/inc/lang/ro/recent.txt
@@ -0,0 +1,3 @@
+====== Modificări recente ======
+
+Următoarele pagini au fost modificate recent.
diff --git a/wiki/inc/lang/ro/register.txt b/wiki/inc/lang/ro/register.txt
new file mode 100644
index 0000000..1a6ef25
--- /dev/null
+++ b/wiki/inc/lang/ro/register.txt
@@ -0,0 +1,4 @@
+====== Înregistrează-te ca utilizator nou ======
+
+Pentru a crea un wiki nou completează mai jos toate informațiile. Asigură-te
+că ai introdus o adresă de e-mail **validă** unde va fi trimisă noua parolă. Numele de utilizator trebuie de asemenea să fie valid [[doku>pagename|pagename]].
diff --git a/wiki/inc/lang/ro/registermail.txt b/wiki/inc/lang/ro/registermail.txt
new file mode 100644
index 0000000..599deab
--- /dev/null
+++ b/wiki/inc/lang/ro/registermail.txt
@@ -0,0 +1,11 @@
+Salutare, @FULLNAME@!
+
+Un nou utilizator s-a înregistrat. Iată detaliile:
+
+Nume de utilizator : @NEWUSER@
+Nume complet : @NEWNAME@
+E-mail : @NEWEMAIL@
+Dată : @DATE@
+Browser : @BROWSER@
+Adresă IP : @IPADDRESS@
+Hostname : @HOSTNAME@
diff --git a/wiki/inc/lang/ro/resendpwd.txt b/wiki/inc/lang/ro/resendpwd.txt
new file mode 100644
index 0000000..24d995e
--- /dev/null
+++ b/wiki/inc/lang/ro/resendpwd.txt
@@ -0,0 +1,5 @@
+====== Trimite parolă nouă ======
+
+Introduc numele de utilizator în formularul de mai jos pentru a solicita o
+nouă parolă pentru aceast wiki. Un link de confirmare va fi trimis la adresa
+de e-mail înregistrată.
diff --git a/wiki/inc/lang/ro/resetpwd.txt b/wiki/inc/lang/ro/resetpwd.txt
new file mode 100644
index 0000000..9cea53c
--- /dev/null
+++ b/wiki/inc/lang/ro/resetpwd.txt
@@ -0,0 +1,3 @@
+====== Configurează o parolă nouă ======
+
+Te rog să introduci o parolă nouă pentru contul tău de pe acest wiki.
diff --git a/wiki/inc/lang/ro/revisions.txt b/wiki/inc/lang/ro/revisions.txt
new file mode 100644
index 0000000..7cafaf0
--- /dev/null
+++ b/wiki/inc/lang/ro/revisions.txt
@@ -0,0 +1,5 @@
+====== Versiune anterioară ======
+
+Acestea sunt versiunile anterioare ale paginii curente. Pentru revenirea la o
+versiune anteroară, selectează versiunea de mai jos, clic pe ''Editează
+această pagină'' și salvează versiunea.
diff --git a/wiki/inc/lang/ro/searchpage.txt b/wiki/inc/lang/ro/searchpage.txt
new file mode 100644
index 0000000..5b262fe
--- /dev/null
+++ b/wiki/inc/lang/ro/searchpage.txt
@@ -0,0 +1,4 @@
+====== Căutare ======
+
+Rezultatele căutării sunt afișate mai jos. @CREATEPAGEINFO@
+
diff --git a/wiki/inc/lang/ro/showrev.txt b/wiki/inc/lang/ro/showrev.txt
new file mode 100644
index 0000000..4c76fd4
--- /dev/null
+++ b/wiki/inc/lang/ro/showrev.txt
@@ -0,0 +1,2 @@
+**Aceasta e o versiune anterioară a paginii.**
+----
diff --git a/wiki/inc/lang/ro/stopwords.txt b/wiki/inc/lang/ro/stopwords.txt
new file mode 100644
index 0000000..adcd7ef
--- /dev/null
+++ b/wiki/inc/lang/ro/stopwords.txt
@@ -0,0 +1,31 @@
+# Aceasta este o listă de cuvinte ignorate la indexare, câte un cuvânt pe linie
+# Când editezi acest fișier, asigură-te că folosești sfârșituri de linie UNIX
+# (o singură linie nouă).
+# Nu e nevoie să incluzi cuvinte mai scurte de 3 caractere - acestea sunt,
+# oricum, ignorate.
+# Această listă se bazează pe cele ce pot fi găsite la http://www.ranks.nl/stopwords/
+about
+are
+and
+you
+your
+them
+their
+com
+for
+from
+into
+how
+that
+the
+this
+was
+what
+when
+where
+who
+will
+with
+und
+the
+www
diff --git a/wiki/inc/lang/ro/subscr_digest.txt b/wiki/inc/lang/ro/subscr_digest.txt
new file mode 100644
index 0000000..4e661b6
--- /dev/null
+++ b/wiki/inc/lang/ro/subscr_digest.txt
@@ -0,0 +1,16 @@
+Salutare, @FULLNAME@!
+
+Pagina @PAGE@ în @TITLE@ wiki a fost modificată.
+Acestea sunt modificările:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Versiune anterioară: @OLDPAGE@
+Versiune curentă: @NEWPAGE@
+
+Pentru a anula notificarea paginii, autentifică-te pe wiki la
+@DOKUWIKIURL@ apoi accesează
+@SUBSCRIBE@
+și dezabonează-te de la pagină și/sau modificările spațiului de nume.
diff --git a/wiki/inc/lang/ro/subscr_form.txt b/wiki/inc/lang/ro/subscr_form.txt
new file mode 100644
index 0000000..c198caf
--- /dev/null
+++ b/wiki/inc/lang/ro/subscr_form.txt
@@ -0,0 +1,4 @@
+====== Administrarea abonărilor ======
+
+Această pagină îți permite să îți administrăzi abonările pentru pagina curentă
+și pentru spațiul de nume.
diff --git a/wiki/inc/lang/ro/subscr_list.txt b/wiki/inc/lang/ro/subscr_list.txt
new file mode 100644
index 0000000..c561478
--- /dev/null
+++ b/wiki/inc/lang/ro/subscr_list.txt
@@ -0,0 +1,13 @@
+Salutare, @FULLNAME@!
+
+Paginile din spațiul de nume @PAGE@ al @TITLE@ wiki au fost modificate.
+Modificările sunt următoarele:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Pentru a anula notificarea paginii, autentificcă-te pe wiki la
+@DOKUWIKIURL@ apoi accesează
+@SUBSCRIBE@
+și dezabonează-te de la pagină și/sau modificările spațiului de nume.
diff --git a/wiki/inc/lang/ro/subscr_single.txt b/wiki/inc/lang/ro/subscr_single.txt
new file mode 100644
index 0000000..6f8b2f9
--- /dev/null
+++ b/wiki/inc/lang/ro/subscr_single.txt
@@ -0,0 +1,19 @@
+Salutare, @FULLNAME@!
+
+Pagina @PAGE@ în @TITLE@ wiki a fost modificată.
+Modificările sunt următoarele:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Dată: @DATE@
+Utilizator: @USER@
+Sumarul editării: @SUMMARY@
+Versiune anterioară: @OLDPAGE@
+Versiune curentă: @NEWPAGE@
+
+Pentru a anula notificarea paginii, autentificcă-te pe wiki la
+@DOKUWIKIURL@ apoi accesează
+@SUBSCRIBE@
+și dezabonează-te de la pagină și/sau modificările spațiului de nume.
diff --git a/wiki/inc/lang/ro/updateprofile.txt b/wiki/inc/lang/ro/updateprofile.txt
new file mode 100644
index 0000000..de43c69
--- /dev/null
+++ b/wiki/inc/lang/ro/updateprofile.txt
@@ -0,0 +1,4 @@
+====== Actualizare profil utilizator ======
+
+Trebuie să completezi doar câmpurile pe care dorești să le modifici. Nu poți
+modifica numele de utilizator.
diff --git a/wiki/inc/lang/ro/uploadmail.txt b/wiki/inc/lang/ro/uploadmail.txt
new file mode 100644
index 0000000..cf8e8e0
--- /dev/null
+++ b/wiki/inc/lang/ro/uploadmail.txt
@@ -0,0 +1,12 @@
+Salutare, @FULLNAME@!
+
+Un fișier a fost încărcat în DokuWiki. Iată detaliile:
+
+Fișier : @MEDIA@
+Dată : @DATE@
+Browser : @BROWSER@
+Adresă IP : @IPADDRESS@
+Hostname : @HOSTNAME@
+Dimensiune : @SIZE@
+MIME Type : @MIME@
+Utilizator : @USER@
diff --git a/wiki/inc/lang/ru/admin.txt b/wiki/inc/lang/ru/admin.txt
new file mode 100644
index 0000000..8a670d5
--- /dev/null
+++ b/wiki/inc/lang/ru/admin.txt
@@ -0,0 +1,4 @@
+====== Управление ======
+
+Ниже вы сможете найти список административных операций, доступных в «Докувики».
+
diff --git a/wiki/inc/lang/ru/adminplugins.txt b/wiki/inc/lang/ru/adminplugins.txt
new file mode 100644
index 0000000..6e3fc26
--- /dev/null
+++ b/wiki/inc/lang/ru/adminplugins.txt
@@ -0,0 +1 @@
+===== Дополнительные плагины =====
\ No newline at end of file
diff --git a/wiki/inc/lang/ru/backlinks.txt b/wiki/inc/lang/ru/backlinks.txt
new file mode 100644
index 0000000..a3b638d
--- /dev/null
+++ b/wiki/inc/lang/ru/backlinks.txt
@@ -0,0 +1,4 @@
+====== Обратные ссылки ======
+
+Это список страниц, которые ссылаются на текущую страницу.
+
diff --git a/wiki/inc/lang/ru/conflict.txt b/wiki/inc/lang/ru/conflict.txt
new file mode 100644
index 0000000..e813d8c
--- /dev/null
+++ b/wiki/inc/lang/ru/conflict.txt
@@ -0,0 +1,5 @@
+====== Существует более новая версия ======
+
+Существует более новая версия документа, который вы редактировали. Такое случается, когда другой пользователь изменил документ, пока вы делали то же самое.
+
+Внимательно изучите различия, приведенные ниже, и решите, какую версию оставить. Если вы выберете «Сохранить», то ваша версия будет сохранена. Нажав «Отменить», вы оставите текущую версию.
diff --git a/wiki/inc/lang/ru/denied.txt b/wiki/inc/lang/ru/denied.txt
new file mode 100644
index 0000000..791b30b
--- /dev/null
+++ b/wiki/inc/lang/ru/denied.txt
@@ -0,0 +1,4 @@
+====== Доступ запрещён ======
+
+Извините, у вас не хватает прав для этого действия.
+
diff --git a/wiki/inc/lang/ru/diff.txt b/wiki/inc/lang/ru/diff.txt
new file mode 100644
index 0000000..21b8a8e
--- /dev/null
+++ b/wiki/inc/lang/ru/diff.txt
@@ -0,0 +1,3 @@
+====== Различия ======
+
+Здесь показаны различия между двумя версиями данной страницы.
diff --git a/wiki/inc/lang/ru/draft.txt b/wiki/inc/lang/ru/draft.txt
new file mode 100644
index 0000000..a92aa34
--- /dev/null
+++ b/wiki/inc/lang/ru/draft.txt
@@ -0,0 +1,5 @@
+====== Найден черновик ======
+
+Последний раз редактирование этой страницы не было корректно завершено. Во время вашей работы был автоматически сохранён черновик, который вы теперь можете восстановить и продолжить прерванную правку. Ниже вы видите автоматически сохранённую версию.
+
+Пожалуйста, решите, хотите ли вы //восстановить// потерянную версию, //удалить// черновик, или //отменить// редактирование.
diff --git a/wiki/inc/lang/ru/edit.txt b/wiki/inc/lang/ru/edit.txt
new file mode 100644
index 0000000..25ded41
--- /dev/null
+++ b/wiki/inc/lang/ru/edit.txt
@@ -0,0 +1 @@
+Отредактируйте страницу и нажмите «Сохранить». Прочтите [[wiki:syntax|справочную страницу]] для ознакомления с синтаксисом вики. Пожалуйста, редактируйте только в том случае, если планируете **улучшить** содержимое. Если вы просто хотите потестировать что-либо, воспользуйтесь специальной страницей: [[playground:playground]].
diff --git a/wiki/inc/lang/ru/editrev.txt b/wiki/inc/lang/ru/editrev.txt
new file mode 100644
index 0000000..d46f07b
--- /dev/null
+++ b/wiki/inc/lang/ru/editrev.txt
@@ -0,0 +1,2 @@
+**Вы загрузили старую ревизию документа!** Сохранив её, вы создадите новую текущую версию с этим содержимым.
+----
diff --git a/wiki/inc/lang/ru/index.txt b/wiki/inc/lang/ru/index.txt
new file mode 100644
index 0000000..a059b28
--- /dev/null
+++ b/wiki/inc/lang/ru/index.txt
@@ -0,0 +1,4 @@
+====== Содержание ======
+
+Перед вами список доступных страниц, упорядоченный по [[doku>namespaces|пространствам имён]].
+
diff --git a/wiki/inc/lang/ru/install.html b/wiki/inc/lang/ru/install.html
new file mode 100644
index 0000000..c1c58fa
--- /dev/null
+++ b/wiki/inc/lang/ru/install.html
@@ -0,0 +1,7 @@
+<p>Эта страница предназначена помочь в первоначальной установке и конфигурации «<a href="http://www.dokuwiki.org/">ДокуВики</a>». Дополнительная информация о программе установки доступна на её <a href="http://www.dokuwiki.org/installer">странице документации</a>.</p>
+
+<p>«ДокуВики» использует обычные файлы для хранения страниц и дополнительной информации (например, изображений, поискового индекса, предыдущих версий страницы, и т. д.). Для успешной работы «ДокуВики» <strong>необходим</strong> доступ на запись к директориям с этими файлами. Данная программа установки не может самостоятельно изменять системные права доступа к директориям. Обычно это делается напрямую из командной строки (shell), или, если вы используете удалённый хостинг, через FTP или панель управления своего хостинга (например, cPanel).</p>
+
+<p>Программа установки включит использование списков контроля доступа (<abbr title="access control list">ACL</abbr>) в вашей «ДокуВики». Это позволит администратору, после авторизации в «ДокуВики», использовать специальное меню для установки плагинов, управления пользователями и доступом к страницам вики, а также для настройки конфигурационных параметров. Списки контроля доступа не обязательны для работы «ДокуВики», однако они позволяют упростить управление вашей «ДокуВики».</p>
+
+<p>Опытным пользователям и пользователям со специальными требованиями к установке рекомендуется обратиться по следующим ссылкам для уточнения подробностей <a href="http://www.dokuwiki.org/install">процесса установки</a> и <a href="http://www.dokuwiki.org/config">параметров конфигурации</a>.</p>
diff --git a/wiki/inc/lang/ru/jquery.ui.datepicker.js b/wiki/inc/lang/ru/jquery.ui.datepicker.js
new file mode 100644
index 0000000..223e776
--- /dev/null
+++ b/wiki/inc/lang/ru/jquery.ui.datepicker.js
@@ -0,0 +1,37 @@
+/* Russian (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Andrew Stromnov (stromnov@gmail.com). */
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "../widgets/datepicker" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery.datepicker );
+	}
+}( function( datepicker ) {
+
+datepicker.regional.ru = {
+	closeText: "Закрыть",
+	prevText: "&#x3C;Пред",
+	nextText: "След&#x3E;",
+	currentText: "Сегодня",
+	monthNames: [ "Январь","Февраль","Март","Апрель","Май","Июнь",
+	"Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь" ],
+	monthNamesShort: [ "Янв","Фев","Мар","Апр","Май","Июн",
+	"Июл","Авг","Сен","Окт","Ноя","Дек" ],
+	dayNames: [ "воскресенье","понедельник","вторник","среда","четверг","пятница","суббота" ],
+	dayNamesShort: [ "вск","пнд","втр","срд","чтв","птн","сбт" ],
+	dayNamesMin: [ "Вс","Пн","Вт","Ср","Чт","Пт","Сб" ],
+	weekHeader: "Нед",
+	dateFormat: "dd.mm.yy",
+	firstDay: 1,
+	isRTL: false,
+	showMonthAfterYear: false,
+	yearSuffix: "" };
+datepicker.setDefaults( datepicker.regional.ru );
+
+return datepicker.regional.ru;
+
+} ) );
diff --git a/wiki/inc/lang/ru/lang.php b/wiki/inc/lang/ru/lang.php
new file mode 100644
index 0000000..7eebd39
--- /dev/null
+++ b/wiki/inc/lang/ru/lang.php
@@ -0,0 +1,391 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Yuriy Skalko <yuriy.skalko@gmail.com>
+ * @author Zhassulan <zyesmukanov@gmail.com>
+ * @author Aleksandr Selivanov <alexgearbox@yandex.ru>
+ * @author Yuri Pimenov <up@ftpsearch.lv>
+ * @author Igor Tarasov <tigr@mail15.com>
+ * @author Denis Simakov <akinoame1@gmail.com>
+ * @author Kaens Bard <kaens@mail.ru>
+ * @author Andrew Pleshakov <beotiger@mail.ru>
+ * @author Змей Этерийский <evil_snake@eternion.ru>
+ * @author Hikaru Nakajima <jisatsu@mail.ru>
+ * @author Alexei Tereschenko <alexeitlex@yahoo.com>
+ * @author Irina Ponomareva <irinaponomareva@webperfectionist.com>
+ * @author Alexander Sorkin <kibizoid@gmail.com>
+ * @author Kirill Krasnov <krasnovforum@gmail.com>
+ * @author Vlad Tsybenko <vlad.development@gmail.com>
+ * @author Aleksey Osadchiy <rfc@nm.ru>
+ * @author Ladyko Andrey <fylh@succexy.spb.ru>
+ * @author Eugene <windy.wanderer@gmail.com>
+ * @author Johnny Utah <pcpa@cyberpunk.su>
+ * @author Ivan I. Udovichenko (sendtome@mymailbox.pp.ua)
+ * @author Pavel <ivanovtsk@mail.ru>
+ * @author Artur <ncuxxx@gmail.com>
+ * @author Erli Moen <evseev.jr@gmail.com>
+ * @author Владимир <id37736@yandex.ru>
+ * @author Igor Degraf <igordegraf@gmail.com>
+ * @author Type-kun <workwork-1@yandex.ru>
+ * @author Vitaly Filatenko <kot@hacktest.net>
+ * @author Alex P <alexander@lanos.co.uk>
+ * @author Nolf <m.kopachovets@gmail.com>
+ * @author Takumo <9206984@mail.ru>
+ * @author RainbowSpike <1@2.ru>
+ * @author dimsharav <dimsharav@gmail.com>
+ * @author Radimir <radimir.shevchenko@gmail.com>
+ * @author alexey <xeenych@gmail.com>
+ */
+$lang['encoding']              = 'utf-8';
+$lang['direction']             = 'ltr';
+$lang['doublequoteopening']    = '«';
+$lang['doublequoteclosing']    = '»';
+$lang['singlequoteopening']    = '„';
+$lang['singlequoteclosing']    = '“';
+$lang['apostrophe']            = '’';
+$lang['btn_edit']              = 'Править страницу';
+$lang['btn_source']            = 'Показать исходный текст';
+$lang['btn_show']              = 'Показать страницу';
+$lang['btn_create']            = 'Создать страницу';
+$lang['btn_search']            = 'Найти';
+$lang['btn_save']              = 'Сохранить';
+$lang['btn_preview']           = 'Просмотр';
+$lang['btn_top']               = 'Наверх';
+$lang['btn_newer']             = '<< более новые';
+$lang['btn_older']             = 'более старые >>';
+$lang['btn_revs']              = 'История страницы';
+$lang['btn_recent']            = 'Недавние изменения';
+$lang['btn_upload']            = 'Загрузить';
+$lang['btn_cancel']            = 'Отменить';
+$lang['btn_index']             = 'Все страницы';
+$lang['btn_secedit']           = 'Править';
+$lang['btn_login']             = 'Войти';
+$lang['btn_logout']            = 'Выйти';
+$lang['btn_admin']             = 'Управление';
+$lang['btn_update']            = 'Обновить';
+$lang['btn_delete']            = 'Удалить';
+$lang['btn_back']              = 'Назад';
+$lang['btn_backlink']          = 'Ссылки сюда';
+$lang['btn_subscribe']         = 'Управление подписками';
+$lang['btn_profile']           = 'Профиль';
+$lang['btn_reset']             = 'Вернуть';
+$lang['btn_resendpwd']         = 'Установить новый пароль';
+$lang['btn_draft']             = 'Править черновик';
+$lang['btn_recover']           = 'Восстановить черновик';
+$lang['btn_draftdel']          = 'Удалить черновик';
+$lang['btn_revert']            = 'Восстановить';
+$lang['btn_register']          = 'Зарегистрироваться';
+$lang['btn_apply']             = 'Применить';
+$lang['btn_media']             = 'Управление медиафайлами';
+$lang['btn_deleteuser']        = 'Удалить мой аккаунт';
+$lang['btn_img_backto']        = 'Вернуться к %s';
+$lang['btn_mediaManager']      = 'Просмотр в «управлении медиафайлами»';
+$lang['loggedinas']            = 'Зашли как';
+$lang['user']                  = 'Логин';
+$lang['pass']                  = 'Пароль';
+$lang['newpass']               = 'Новый пароль';
+$lang['oldpass']               = 'Введите текущий пароль';
+$lang['passchk']               = 'повторите';
+$lang['remember']              = 'Запомнить меня';
+$lang['fullname']              = 'Полное имя';
+$lang['email']                 = 'Эл. адрес';
+$lang['profile']               = 'Профиль пользователя';
+$lang['badlogin']              = 'Извините, неверное имя пользователя или пароль.';
+$lang['badpassconfirm']        = 'Простите, пароль неверный';
+$lang['minoredit']             = 'Незначительные изменения';
+$lang['draftdate']             = 'Черновик сохранён';
+$lang['nosecedit']             = 'За это время страница была изменена и информация о секции устарела. Загружена полная версия страницы.';
+$lang['searchcreatepage']      = 'Если вы не нашли то, что искали, то можете создать или изменить страницу %s, названную соответственно вашему запросу.';
+$lang['search_fullresults']    = 'Результаты полнотекстового поиска';
+$lang['js']['search_toggle_tools'] = 'Настройка поиска';
+$lang['js']['willexpire']      = 'Ваша блокировка этой страницы на редактирование истекает в течение минуты.\nЧтобы предотвратить конфликты используйте кнопку «Просмотр» для сброса таймера блокировки.';
+$lang['js']['notsavedyet']     = 'Несохранённые изменения будут потеряны. Вы действительно хотите продолжить?';
+$lang['js']['searchmedia']     = 'Поиск файлов';
+$lang['js']['keepopen']        = 'Не закрывать окно после выбора';
+$lang['js']['hidedetails']     = 'Скрыть детали';
+$lang['js']['mediatitle']      = 'Настройка ссылки';
+$lang['js']['mediadisplay']    = 'Тип ссылки';
+$lang['js']['mediaalign']      = 'Выравнивание';
+$lang['js']['mediasize']       = 'Размер';
+$lang['js']['mediatarget']     = 'Целевая ссылка';
+$lang['js']['mediaclose']      = 'Закрыть';
+$lang['js']['mediainsert']     = 'Вставить';
+$lang['js']['mediadisplayimg'] = 'Показывать изображение';
+$lang['js']['mediadisplaylnk'] = 'Показывать только ссылку';
+$lang['js']['mediasmall']      = 'Малая версия';
+$lang['js']['mediamedium']     = 'Средняя версия';
+$lang['js']['medialarge']      = 'Крупная версия';
+$lang['js']['mediaoriginal']   = 'Исходная версия';
+$lang['js']['medialnk']        = 'Ссылка на подробности';
+$lang['js']['mediadirect']     = 'Прямая ссылка на оригинал';
+$lang['js']['medianolnk']      = 'Без ссылки';
+$lang['js']['medianolink']     = 'Не давать ссылку на изображение';
+$lang['js']['medialeft']       = 'Выровнять изображение по левому краю';
+$lang['js']['mediaright']      = 'Выровнять изображение по правому краю';
+$lang['js']['mediacenter']     = 'Выровнять изображение по центру';
+$lang['js']['medianoalign']    = 'Не выравнивать';
+$lang['js']['nosmblinks']      = 'Ссылка на сетевые каталоги Windows работает только из MS Internet Explorer, но вы можете скопировать ссылку.';
+$lang['js']['linkwiz']         = 'Мастер ссылок';
+$lang['js']['linkto']          = 'Ссылка на:';
+$lang['js']['del_confirm']     = 'Вы на самом деле желаете удалить выбранное?';
+$lang['js']['restore_confirm'] = 'Действительно восстановить эту версию?';
+$lang['js']['media_diff']      = 'Просмотр отличий:';
+$lang['js']['media_diff_both'] = 'рядом';
+$lang['js']['media_diff_opacity'] = 'наложением';
+$lang['js']['media_diff_portions'] = 'частями';
+$lang['js']['media_select']    = 'Выбрать файлы…';
+$lang['js']['media_upload_btn'] = 'Загрузить';
+$lang['js']['media_done_btn']  = 'Готово';
+$lang['js']['media_drop']      = 'Переместите файлы сюда для загрузки';
+$lang['js']['media_cancel']    = 'убрать';
+$lang['js']['media_overwrt']   = 'Перезаписать существующие файлы';
+$lang['search_exact_match']    = 'Точное соответствие';
+$lang['search_starts_with']    = 'Начинается на';
+$lang['search_ends_with']      = 'Заканчивается';
+$lang['search_contains']       = 'Содержит';
+$lang['search_custom_match']   = 'Задано пользователем';
+$lang['search_any_ns']         = 'Любое пространство имен';
+$lang['search_any_time']       = 'Любое время';
+$lang['search_past_7_days']    = 'Прошлая неделя';
+$lang['search_past_month']     = 'Прошлый месяц';
+$lang['search_past_year']      = 'Прошлый год';
+$lang['search_sort_by_hits']   = 'Сортировать по хитам';
+$lang['search_sort_by_mtime']  = 'Сортировать по последнему изменению';
+$lang['regmissing']            = 'Извините, вам следует заполнить все поля.';
+$lang['reguexists']            = 'Извините, пользователь с таким логином уже существует.';
+$lang['regsuccess']            = 'Пользователь создан; пароль выслан на адрес электронной почты.';
+$lang['regsuccess2']           = 'Пользователь создан.';
+$lang['regfail']               = 'Пользователь не может быть создан.';
+$lang['regmailfail']           = 'Похоже есть проблема с отправкой пароля по почте. Пожалуйста, сообщите об этом администратору!';
+$lang['regbadmail']            = 'Данный вами адрес электронной почты выглядит неправильным. Если вы считаете это ошибкой, сообщите администратору.';
+$lang['regbadpass']            = 'Два введённых пароля не совпадают. Пожалуйста, попробуйте ещё раз.';
+$lang['regpwmail']             = 'Ваш пароль для системы «Докувики»';
+$lang['reghere']               = 'У вас ещё нет аккаунта? Зарегистрируйтесь';
+$lang['profna']                = 'Данная вики не поддерживает изменение профиля';
+$lang['profnochange']          = 'Изменений не было внесено, профиль не обновлён.';
+$lang['profnoempty']           = 'Логин и адрес электронной почты не могут быть пустыми.';
+$lang['profchanged']           = 'Профиль пользователя успешно обновлён.';
+$lang['profnodelete']          = 'Данная вики не поддерживает удаление пользователей.';
+$lang['profdeleteuser']        = 'Удалить аккаунт';
+$lang['profdeleted']           = 'Ваш аккаунт был удалён из этой вики';
+$lang['profconfdelete']        = 'Я хочу удалить свой аккаунт из этой вики. <br />
+Это действие необратимо.';
+$lang['profconfdeletemissing'] = 'Флажок подтверждения не установлен';
+$lang['proffail']              = 'Профиль пользователя не был обновлен.';
+$lang['pwdforget']             = 'Забыли пароль? Получите новый';
+$lang['resendna']              = 'Данная вики не поддерживает повторную отправку пароля.';
+$lang['resendpwd']             = 'Установить новый пароль для';
+$lang['resendpwdmissing']      = 'Вы должны заполнить все поля формы.';
+$lang['resendpwdnouser']       = 'Пользователь с таким логином не обнаружен в нашей базе данных.';
+$lang['resendpwdbadauth']      = 'Извините, неверный код авторизации. Убедитесь, что вы полностью скопировали ссылку.';
+$lang['resendpwdconfirm']      = 'Ссылка для подтверждения пароля была выслана по электронной почте.';
+$lang['resendpwdsuccess']      = 'Ваш новый пароль был выслан по электронной почте.';
+$lang['license']               = 'Если не указано иное, содержимое этой вики предоставляется на условиях следующей лицензии:';
+$lang['licenseok']             = 'Примечание: редактируя эту страницу, вы соглашаетесь на использование своего вклада на условиях следующей лицензии:';
+$lang['searchmedia']           = 'Поиск по имени файла:';
+$lang['searchmedia_in']        = 'Поиск в %s';
+$lang['txt_upload']            = 'Выберите файл для загрузки:';
+$lang['txt_filename']          = 'Введите имя файла в вики (необязательно):';
+$lang['txt_overwrt']           = 'Перезаписать существующий файл';
+$lang['maxuploadsize']         = 'Макс. размер загружаемого файла %s.';
+$lang['lockedby']              = 'В данный момент заблокировано пользователем';
+$lang['lockexpire']            = 'Блокировка истекает в';
+$lang['rssfailed']             = 'Произошла ошибка при получении следующей новостной ленты: ';
+$lang['nothingfound']          = 'Ничего не найдено.';
+$lang['mediaselect']           = 'Выбор медиафайла';
+$lang['uploadsucc']            = 'Загрузка произведена успешно';
+$lang['uploadfail']            = 'Загрузка не удалась. Возможно, проблемы с правами доступа?';
+$lang['uploadwrong']           = 'В загрузке отказано. Файлы с таким расширением запрещены!';
+$lang['uploadexist']           = 'Файл с таким именем существует. Загрузка не произведена.';
+$lang['uploadbadcontent']      = 'Содержание файла не соответствует расширению %s.';
+$lang['uploadspam']            = 'Загрузка заблокирована спам-фильтром.';
+$lang['uploadxss']             = 'Загрузка заблокирована по соображениям безопасности.';
+$lang['uploadsize']            = 'Загруженный файл был слишком большой (макс. %s).';
+$lang['deletesucc']            = 'Файл "%s" был удалён.';
+$lang['deletefail']            = 'Невозможно удалить файл "%s" — проверьте права доступа к нему.';
+$lang['mediainuse']            = 'Файл "%s" не был удалён — он всё ещё используется.';
+$lang['namespaces']            = 'Пространства имён';
+$lang['mediafiles']            = 'Доступные файлы';
+$lang['accessdenied']          = 'Вы не можете просмотреть эту страницу.';
+$lang['mediausage']            = 'Для ссылки на этот файл используйте следующий синтаксис:';
+$lang['mediaview']             = 'Посмотреть исходный файл';
+$lang['mediaroot']             = 'корень';
+$lang['mediaupload']           = 'Здесь можно загрузить файл в текущий каталог («пространство имён»). Чтобы создать подкаталоги, добавьте их к началу имени файла («Загрузить как»). Имена подкаталогов разделяются двоеточиями.';
+$lang['mediaextchange']        = 'Расширение изменилось с .%s на .%s!';
+$lang['reference']             = 'Ссылки для';
+$lang['ref_inuse']             = 'Этот файл не может быть удалён, так как он используется на следующих страницах:';
+$lang['ref_hidden']            = 'Некоторые ссылки находятся на страницах, на чтение которых у вас нет прав доступа';
+$lang['hits']                  = 'соответствий';
+$lang['quickhits']             = 'Подходящие страницы';
+$lang['toc']                   = 'Содержание';
+$lang['current']               = 'текущий';
+$lang['yours']                 = 'Ваша версия';
+$lang['diff']                  = 'Показать отличия от текущей версии';
+$lang['diff2']                 = 'Показать различия между выбранными версиями';
+$lang['difflink']              = 'Ссылка на это сравнение';
+$lang['diff_type']             = 'Посмотреть различия';
+$lang['diff_inline']           = 'внутри текста';
+$lang['diff_side']             = 'двумя колонками';
+$lang['diffprevrev']           = 'Предыдущая версия';
+$lang['diffnextrev']           = 'Следующая версия';
+$lang['difflastrev']           = 'Последняя версия';
+$lang['diffbothprevrev']       = 'Предыдущая версия справа и слева';
+$lang['diffbothnextrev']       = 'Следующая версия справа и слева';
+$lang['line']                  = 'Строка';
+$lang['breadcrumb']            = 'Вы посетили:';
+$lang['youarehere']            = 'Вы находитесь здесь:';
+$lang['lastmod']               = 'Последние изменения:';
+$lang['by']                    = ' —';
+$lang['deleted']               = 'удалено';
+$lang['created']               = 'создано';
+$lang['restored']              = 'старая версия восстановлена (%s)';
+$lang['external_edit']         = 'внешнее изменение';
+$lang['summary']               = 'Сводка изменений';
+$lang['noflash']               = 'Для просмотра этого содержимого требуется <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a>.';
+$lang['download']              = 'Скачать фрагмент кода';
+$lang['tools']                 = 'Инструменты';
+$lang['user_tools']            = 'Инструменты пользователя';
+$lang['site_tools']            = 'Инструменты сайта';
+$lang['page_tools']            = 'Инструменты страницы';
+$lang['skip_to_content']       = 'Перейти к содержанию';
+$lang['sidebar']               = 'Боковая панель';
+$lang['mail_newpage']          = 'страница добавлена:';
+$lang['mail_changed']          = 'страница изменена:';
+$lang['mail_subscribe_list']   = 'изменились страницы в пространстве имён:';
+$lang['mail_new_user']         = 'новый пользователь:';
+$lang['mail_upload']           = 'файл закачан:';
+$lang['changes_type']          = 'Посмотреть изменения';
+$lang['pages_changes']         = 'страниц';
+$lang['media_changes']         = 'медиафайлов';
+$lang['both_changes']          = 'и страниц, и медиафайлов';
+$lang['qb_bold']               = 'Полужирный';
+$lang['qb_italic']             = 'Курсив';
+$lang['qb_underl']             = 'Подчёркнутый';
+$lang['qb_code']               = 'Текст кода';
+$lang['qb_strike']             = 'Зачёркнутый';
+$lang['qb_h1']                 = 'Заголовок 1-го уровня';
+$lang['qb_h2']                 = 'Заголовок 2-го уровня';
+$lang['qb_h3']                 = 'Заголовок 3-го уровня';
+$lang['qb_h4']                 = 'Заголовок 4-го уровня';
+$lang['qb_h5']                 = 'Заголовок 5-го уровня';
+$lang['qb_h']                  = 'Заголовок';
+$lang['qb_hs']                 = 'Выбор заголовка';
+$lang['qb_hplus']              = 'Заголовок более высокого уровня';
+$lang['qb_hminus']             = 'Заголовок более низкого уровня (подзаголовок)';
+$lang['qb_hequal']             = 'Заголовок текущего уровня';
+$lang['qb_link']               = 'Внутренняя ссылка';
+$lang['qb_extlink']            = 'Внешняя ссылка';
+$lang['qb_hr']                 = 'Горизонтальная линия';
+$lang['qb_ol']                 = 'Элемент нумерованного списка';
+$lang['qb_ul']                 = 'Элемент ненумерованного списка';
+$lang['qb_media']              = 'Добавить изображения или другие файлы (откроется в новом окне)';
+$lang['qb_sig']                = 'Вставить подпись';
+$lang['qb_smileys']            = 'Смайлики';
+$lang['qb_chars']              = 'Специальные символы';
+$lang['upperns']               = 'Перейти в родительское пространство имён';
+$lang['metaedit']              = 'Править метаданные';
+$lang['metasaveerr']           = 'Ошибка записи метаданных';
+$lang['metasaveok']            = 'Метаданные сохранены';
+$lang['img_title']             = 'Название:';
+$lang['img_caption']           = 'Подпись:';
+$lang['img_date']              = 'Дата:';
+$lang['img_fname']             = 'Имя файла:';
+$lang['img_fsize']             = 'Размер:';
+$lang['img_artist']            = 'Фотограф:';
+$lang['img_copyr']             = 'Авторские права:';
+$lang['img_format']            = 'Формат:';
+$lang['img_camera']            = 'Модель камеры:';
+$lang['img_keywords']          = 'Ключевые слова:';
+$lang['img_width']             = 'Ширина:';
+$lang['img_height']            = 'Высота:';
+$lang['subscr_subscribe_success'] = 'Добавлен %s в подписку на %s';
+$lang['subscr_subscribe_error'] = 'Невозможно добавить %s в подписку на %s';
+$lang['subscr_subscribe_noaddress'] = 'Нет адреса электронной почты, сопоставленного с вашей учётной записью. Вы не можете подписаться на рассылку';
+$lang['subscr_unsubscribe_success'] = 'Удалён %s из подписки на %s';
+$lang['subscr_unsubscribe_error'] = 'Ошибка удаления %s из подписки на %s';
+$lang['subscr_already_subscribed'] = '%s уже подписан на %s';
+$lang['subscr_not_subscribed'] = '%s не подписан на %s';
+$lang['subscr_m_not_subscribed'] = 'Вы не подписаны на текущую страницу или пространство имён.';
+$lang['subscr_m_new_header']   = 'Добавить подписку';
+$lang['subscr_m_current_header'] = 'Текущие подписки';
+$lang['subscr_m_unsubscribe']  = 'Отменить подписку';
+$lang['subscr_m_subscribe']    = 'Подписаться';
+$lang['subscr_m_receive']      = 'Получить';
+$lang['subscr_style_every']    = 'уведомлять о каждом изменении';
+$lang['subscr_style_digest']   = 'информационное электронное письмо со списком изменений для каждой страницы (каждые %.2f дн.)';
+$lang['subscr_style_list']     = 'список изменённых страниц со времени последнего отправленного электронного письма (каждые %.2f дн.)';
+$lang['authtempfail']          = 'Аутентификация пользователей временно недоступна. Если проблема продолжается какое-то время, пожалуйста, сообщите об этом администратору вики.';
+$lang['i_chooselang']          = 'Выберите свой язык / Choose your language';
+$lang['i_installer']           = 'Установка «Докувики»';
+$lang['i_wikiname']            = 'Название вики';
+$lang['i_enableacl']           = 'Разрешить ограничение прав доступа (рекомендуется)';
+$lang['i_superuser']           = 'Суперпользователь';
+$lang['i_problems']            = 'Программа установки столкнулась с проблемами, перечисленными ниже. Чтобы продолжить, вам необходимо их устранить. ';
+$lang['i_modified']            = 'Из соображений безопасности эта программа запускается только на новой, неизменённой установке «Докувики».
+                                  Вам нужно либо заново распаковать скачанный пакет установки, либо обратиться к полной
+                                  <a href="http://www.dokuwiki.org/install">инструкции по установке «Докувики»</a>';
+$lang['i_funcna']              = 'Функция PHP <code>%s</code> недоступна. Может быть, она по какой-то причине заблокирована вашим хостером?';
+$lang['i_phpver']              = 'Ваша версия PHP (<code>%s</code>) ниже требуемой (<code>%s</code>). Вам необходимо обновить установленную версию PHP.';
+$lang['i_mbfuncoverload']      = 'Для запуска «Докувики» необходимо отключить параметр mbstring.func_overload в php.ini';
+$lang['i_permfail']            = '<code>%s</code> недоступна для записи «Докувики». Вам необходимо исправить системные права доступа для этой директории!';
+$lang['i_confexists']          = '<code>%s</code> уже существует';
+$lang['i_writeerr']            = 'Не удалось создать <code>%s</code>. Вам необходимо проверить системные права доступа к файлу и директориям, и создать файл вручную. ';
+$lang['i_badhash']             = 'dokuwiki.php не распознан или изменён (hash=<code>%s</code>)';
+$lang['i_badval']              = '<code>%s</code> — недопустимое или пустое значение';
+$lang['i_success']             = 'Конфигурация прошла успешно. Теперь вы можете удалить файл install.php. Переходите к
+                                 <a href="doku.php?id=wiki:welcome">своей новой «Докувики»</a>.';
+$lang['i_failure']             = 'При записи в файлы конфигурации были обнаружены ошибки. Возможно, вам придётся исправить их вручную, прежде чем вы сможете использовать <a href="doku.php?id=wiki:welcome">свою новую «Докувики»</a>.';
+$lang['i_policy']              = 'Исходная политика прав доступа';
+$lang['i_pol0']                = 'Открытая вики (чтение, запись, загрузка файлов для всех)';
+$lang['i_pol1']                = 'Общедоступная вики (чтение для всех, запись и загрузка файлов для зарегистрированных пользователей)';
+$lang['i_pol2']                = 'Закрытая вики (чтение, запись и загрузка файлов только для зарегистрированных пользователей)';
+$lang['i_allowreg']            = 'Разрешить пользователям самостоятельно регистрироваться';
+$lang['i_retry']               = 'Повторить попытку';
+$lang['i_license']             = 'Пожалуйста, выберите тип лицензии для своей вики';
+$lang['i_license_none']        = 'Не отображать информацию о лицензии';
+$lang['i_pop_field']           = 'Пожалуйста, помогите нам улучшить «Докувики»:';
+$lang['i_pop_label']           = 'Отправлять раз в месяц анонимную пользовательскую информацию разработчикам «Докувики»';
+$lang['recent_global']         = 'Вы просматриваете изменения в пространстве имён <b>%s</b>. Вы можете также <a href="%s">просмотреть недавние изменения во всей вики</a>.';
+$lang['years']                 = '%d лет назад';
+$lang['months']                = '%d месяц (-ев) назад';
+$lang['weeks']                 = '%d недель назад';
+$lang['days']                  = '%d дней назад';
+$lang['hours']                 = '%d час (-ов) назад';
+$lang['minutes']               = '%d минут назад';
+$lang['seconds']               = '%d секунд назад';
+$lang['wordblock']             = 'Ваши изменения не сохранены, поскольку они содержат блокируемые слова (спам).';
+$lang['media_uploadtab']       = 'Загрузка';
+$lang['media_searchtab']       = 'Найти';
+$lang['media_file']            = 'Файл';
+$lang['media_viewtab']         = 'Просмотр';
+$lang['media_edittab']         = 'Правка';
+$lang['media_historytab']      = 'История';
+$lang['media_list_thumbs']     = 'Миниатюры';
+$lang['media_list_rows']       = 'Строки';
+$lang['media_sort_name']       = 'Сортировка по имени';
+$lang['media_sort_date']       = 'Сортировка по дате';
+$lang['media_namespaces']      = 'Выберите пространство имён';
+$lang['media_files']           = 'Файлы в %s';
+$lang['media_upload']          = 'Загрузка в пространство имён %s';
+$lang['media_search']          = 'Поиск в пространстве имён %s';
+$lang['media_view']            = '%s';
+$lang['media_viewold']         = '%s в %s
+';
+$lang['media_edit']            = 'Правка %s';
+$lang['media_history']         = 'История %s';
+$lang['media_meta_edited']     = 'метаданные изменены';
+$lang['media_perm_read']       = 'Извините, у вас недостаточно прав для чтения файлов.';
+$lang['media_perm_upload']     = 'Извините, у вас недостаточно прав для загрузки файлов.';
+$lang['media_update']          = 'Загрузить новую версию';
+$lang['media_restore']         = 'Восстановить эту версию';
+$lang['media_acl_warning']     = 'Этот список может быть неполным из-за ограничений списков контроля доступа (ACL) и скрытых страниц.';
+$lang['currentns']             = 'Текущее пространство имён';
+$lang['searchresult']          = 'Результаты поиска';
+$lang['plainhtml']             = 'Простой HTML';
+$lang['wikimarkup']            = 'вики-разметка';
+$lang['page_nonexist_rev']     = 'Эта страница ещё не существовала %s. Она была создана <a href="%s">%s</a>.';
+$lang['unable_to_parse_date']  = 'Невозможно обработать параметр "%s".';
+$lang['email_signature_text']  = 'Это письмо создано «Докувики» с сайта
+@DOKUWIKIURL@';
diff --git a/wiki/inc/lang/ru/locked.txt b/wiki/inc/lang/ru/locked.txt
new file mode 100644
index 0000000..3e868ba
--- /dev/null
+++ b/wiki/inc/lang/ru/locked.txt
@@ -0,0 +1,3 @@
+====== Страница заблокирована ======
+
+Эта страница в данный момент заблокирована для редактирования другим пользователем. Вам придётся подождать, пока этот пользователь закончит редактирование или истечёт время блокировки.
diff --git a/wiki/inc/lang/ru/login.txt b/wiki/inc/lang/ru/login.txt
new file mode 100644
index 0000000..0a94a0b
--- /dev/null
+++ b/wiki/inc/lang/ru/login.txt
@@ -0,0 +1,4 @@
+====== Авторизация ======
+
+В данный момент вы не в системе. Авторизируйтесь при помощи следующей формы. //Замечание:// для работы у вас должны быть включены куки (cookies).
+
diff --git a/wiki/inc/lang/ru/mailtext.txt b/wiki/inc/lang/ru/mailtext.txt
new file mode 100644
index 0000000..0eb31a1
--- /dev/null
+++ b/wiki/inc/lang/ru/mailtext.txt
@@ -0,0 +1,12 @@
+В вашей вики была добавлена или изменена страница. Подробности:
+
+Дата: @DATE@
+Браузер: @BROWSER@
+IP-адрес: @IPADDRESS@
+Хост: @HOSTNAME@
+Старая версия: @OLDPAGE@
+Новая версия: @NEWPAGE@
+Сводка изменений: @SUMMARY@
+Пользователь: @USER@
+
+@DIFF@
diff --git a/wiki/inc/lang/ru/newpage.txt b/wiki/inc/lang/ru/newpage.txt
new file mode 100644
index 0000000..ea8e35b
--- /dev/null
+++ b/wiki/inc/lang/ru/newpage.txt
@@ -0,0 +1,3 @@
+====== Эта страница ещё не существует ======
+
+Вы перешли по ссылке на тему, для которой ещё не создана страница. Если позволяют ваши права доступа, вы можете создать её, нажав на кнопку «Создать страницу».
diff --git a/wiki/inc/lang/ru/norev.txt b/wiki/inc/lang/ru/norev.txt
new file mode 100644
index 0000000..c088d0d
--- /dev/null
+++ b/wiki/inc/lang/ru/norev.txt
@@ -0,0 +1,3 @@
+====== Такой версии не существует ======
+
+Указанная версия страницы не существует. Нажмите на кнопку «История страницы», чтобы получить список доступных предыдущих версий этого документа.
diff --git a/wiki/inc/lang/ru/password.txt b/wiki/inc/lang/ru/password.txt
new file mode 100644
index 0000000..52ed4b5
--- /dev/null
+++ b/wiki/inc/lang/ru/password.txt
@@ -0,0 +1,6 @@
+Здравствуйте, @FULLNAME@.
+
+Ваши данные для @TITLE@ (@DOKUWIKIURL@)
+
+Логин: @LOGIN@
+Пароль: @PASSWORD@
diff --git a/wiki/inc/lang/ru/preview.txt b/wiki/inc/lang/ru/preview.txt
new file mode 100644
index 0000000..2bc383e
--- /dev/null
+++ b/wiki/inc/lang/ru/preview.txt
@@ -0,0 +1,4 @@
+====== Просмотр ======
+
+Здесь показано, как ваш текст будет выглядеть. Внимание: текст ещё **не сохранён!**
+
diff --git a/wiki/inc/lang/ru/pwconfirm.txt b/wiki/inc/lang/ru/pwconfirm.txt
new file mode 100644
index 0000000..fff6694
--- /dev/null
+++ b/wiki/inc/lang/ru/pwconfirm.txt
@@ -0,0 +1,9 @@
+Здравствуйте, @FULLNAME@.
+
+Кто-то запросил новый пароль для входа в @TITLE@ по адресу @DOKUWIKIURL@
+
+Если вы не запрашивали новый пароль, просто проигнорируйте это письмо.
+
+Для подтверждения, что запрос был действительно сделан вами, пожалуйста, перейдите по следующей ссылке.
+
+@CONFIRM@
diff --git a/wiki/inc/lang/ru/read.txt b/wiki/inc/lang/ru/read.txt
new file mode 100644
index 0000000..08c3afa
--- /dev/null
+++ b/wiki/inc/lang/ru/read.txt
@@ -0,0 +1,2 @@
+Эта страница только для чтения. Вы можете посмотреть её исходный текст, но не можете его изменить. Сообщите администратору, если считаете, что это неправильно.
+
diff --git a/wiki/inc/lang/ru/recent.txt b/wiki/inc/lang/ru/recent.txt
new file mode 100644
index 0000000..0d4d328
--- /dev/null
+++ b/wiki/inc/lang/ru/recent.txt
@@ -0,0 +1,5 @@
+====== Недавние изменения ======
+
+Следующие страницы были недавно изменены
+
+
diff --git a/wiki/inc/lang/ru/register.txt b/wiki/inc/lang/ru/register.txt
new file mode 100644
index 0000000..2d5d987
--- /dev/null
+++ b/wiki/inc/lang/ru/register.txt
@@ -0,0 +1,3 @@
+====== Регистрация нового пользователя ======
+
+Для регистрации в вики заполните все поля ниже. Обратите внимание на **правильность адреса электронной почты** — туда будет выслан пароль в том случае, если вас не просят самостоятельно ввести его здесь. Логин должен удовлетворять ограничениям для [[doku>pagename|идентификатора страницы]].
diff --git a/wiki/inc/lang/ru/registermail.txt b/wiki/inc/lang/ru/registermail.txt
new file mode 100644
index 0000000..8e420aa
--- /dev/null
+++ b/wiki/inc/lang/ru/registermail.txt
@@ -0,0 +1,10 @@
+Был зарегистрирован новый пользователь. Подробности:
+
+Логин: @NEWUSER@
+Полное имя: @NEWNAME@
+Эл. адрес: @NEWEMAIL@
+
+Дата: @DATE@
+Браузер: @BROWSER@
+Адрес IP: @IPADDRESS@
+Хост: @HOSTNAME@
diff --git a/wiki/inc/lang/ru/resendpwd.txt b/wiki/inc/lang/ru/resendpwd.txt
new file mode 100644
index 0000000..bc24c49
--- /dev/null
+++ b/wiki/inc/lang/ru/resendpwd.txt
@@ -0,0 +1,3 @@
+====== Выслать новый пароль ======
+
+Для получения нового пароля введите ваш логин. Ваш новый пароль будет отправлен по адресу электронной почты, зарегистрированному на ваше имя.
\ No newline at end of file
diff --git a/wiki/inc/lang/ru/resetpwd.txt b/wiki/inc/lang/ru/resetpwd.txt
new file mode 100644
index 0000000..f7c9d35
--- /dev/null
+++ b/wiki/inc/lang/ru/resetpwd.txt
@@ -0,0 +1,3 @@
+====== Установка нового пароля ======
+
+Пожалуйста введите новый пароль для вашей учетной записи в этой вики.
diff --git a/wiki/inc/lang/ru/revisions.txt b/wiki/inc/lang/ru/revisions.txt
new file mode 100644
index 0000000..d5faf3d
--- /dev/null
+++ b/wiki/inc/lang/ru/revisions.txt
@@ -0,0 +1,3 @@
+====== История страницы ======
+
+Перед вами история правок текущего документа. Чтобы вернуться к одной из предыдущих версий, выберите нужную, нажмите «Править страницу» и сохраните её.
\ No newline at end of file
diff --git a/wiki/inc/lang/ru/searchpage.txt b/wiki/inc/lang/ru/searchpage.txt
new file mode 100644
index 0000000..deea577
--- /dev/null
+++ b/wiki/inc/lang/ru/searchpage.txt
@@ -0,0 +1,4 @@
+====== Поиск ======
+
+Перед вами результаты поиска. @CREATEPAGEINFO@
+
diff --git a/wiki/inc/lang/ru/showrev.txt b/wiki/inc/lang/ru/showrev.txt
new file mode 100644
index 0000000..b3f3852
--- /dev/null
+++ b/wiki/inc/lang/ru/showrev.txt
@@ -0,0 +1,2 @@
+**Это старая версия документа!**
+----
diff --git a/wiki/inc/lang/ru/stopwords.txt b/wiki/inc/lang/ru/stopwords.txt
new file mode 100644
index 0000000..826a89e
--- /dev/null
+++ b/wiki/inc/lang/ru/stopwords.txt
@@ -0,0 +1,93 @@
+# Это список слов, которые индексатор игнорирует, по одному слову в строке
+# При редактировании этого файла обязательно используйте окончания строк UNIX (только newline)
+# Не нужно включать слова короче 3 символов - они игнорируются в любом случае
+более
+больше
+будет
+будто
+была
+было
+быть
+вдруг
+ведь
+впрочем
+всегда
+всех
+всего
+говорил
+говорила
+даже
+другой
+другая
+если
+есть
+жизнь
+жизня
+зачем
+здесь
+иногда
+кажется
+какая
+какой
+какое
+когда
+конечно
+лучше
+между
+менее
+меньше
+меня
+много
+может
+можно
+надо
+наконец
+него
+нельзя
+нибудь
+никогда
+ничего
+нужно
+один
+одна
+опять
+перед
+после
+потом
+потому
+почти
+разве
+свое
+своё
+свой
+свою
+своя
+себе
+себя
+сегодня
+сейчас
+сказал
+сказала
+сказать
+совсем
+такая
+такое
+такой
+тебя
+теперь
+тогда
+того
+тоже
+только
+тому
+хорошо
+хоть
+чего
+через
+чтоб
+чтобы
+чуть
+этого
+этой
+этим
+этот
diff --git a/wiki/inc/lang/ru/subscr_digest.txt b/wiki/inc/lang/ru/subscr_digest.txt
new file mode 100644
index 0000000..afc34ef
--- /dev/null
+++ b/wiki/inc/lang/ru/subscr_digest.txt
@@ -0,0 +1,15 @@
+Привет!
+
+Страница @PAGE@ в вики @TITLE@ изменилась.
+Список изменений:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Старая версия: @OLDPAGE@
+Новая версия: @NEWPAGE@
+
+Чтобы отписаться от уведомлений об изменениях, войдите в вики
+@DOKUWIKIURL@ в раздел @SUBSCRIBE@
+и отмените подписку на страницу и/или пространство имён.
diff --git a/wiki/inc/lang/ru/subscr_form.txt b/wiki/inc/lang/ru/subscr_form.txt
new file mode 100644
index 0000000..2a775c5
--- /dev/null
+++ b/wiki/inc/lang/ru/subscr_form.txt
@@ -0,0 +1,3 @@
+====== Управление подписками ======
+
+Здесь вы можете управлять подписками для текущей страницы и пространства имён.
\ No newline at end of file
diff --git a/wiki/inc/lang/ru/subscr_list.txt b/wiki/inc/lang/ru/subscr_list.txt
new file mode 100644
index 0000000..cf3ef5d
--- /dev/null
+++ b/wiki/inc/lang/ru/subscr_list.txt
@@ -0,0 +1,13 @@
+Привет!
+
+Страницы в пространстве имён @PAGE@ в вики @TITLE@ были изменены.
+
+Список изменившихся страниц:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Чтобы отписаться от уведомлений об изменениях, войдите в вики
+@DOKUWIKIURL@ в раздел @SUBSCRIBE@
+и отмените подписку на страницу и/или пространство имён.
diff --git a/wiki/inc/lang/ru/subscr_single.txt b/wiki/inc/lang/ru/subscr_single.txt
new file mode 100644
index 0000000..9b7d907
--- /dev/null
+++ b/wiki/inc/lang/ru/subscr_single.txt
@@ -0,0 +1,19 @@
+Привет!
+
+Страница @PAGE@ в вики @TITLE@ изменилась.
+Список изменений:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Дата: @DATE@
+Автор: @USER@
+
+Примечание: @SUMMARY@
+Старая версия: @OLDPAGE@
+Новая версия: @NEWPAGE@
+
+Чтобы отписаться от уведомлений об изменениях, войдите в вики
+@DOKUWIKIURL@ в раздел @SUBSCRIBE@
+и отмените подписку на страницу и/или пространство имён.
diff --git a/wiki/inc/lang/ru/updateprofile.txt b/wiki/inc/lang/ru/updateprofile.txt
new file mode 100644
index 0000000..824916c
--- /dev/null
+++ b/wiki/inc/lang/ru/updateprofile.txt
@@ -0,0 +1,5 @@
+====== Обновить профиль ======
+
+Необходимо заполнить только те поля, которые вы хотите изменить. Ваш логин не может быть изменён.
+
+
diff --git a/wiki/inc/lang/ru/uploadmail.txt b/wiki/inc/lang/ru/uploadmail.txt
new file mode 100644
index 0000000..a92d855
--- /dev/null
+++ b/wiki/inc/lang/ru/uploadmail.txt
@@ -0,0 +1,11 @@
+В вашу вики был закачан файл. Подробная информация:
+
+Файл: @MEDIA@
+Старая версия: @OLD@
+Дата: @DATE@
+Браузер: @BROWSER@
+Адрес IP: @IPADDRESS@
+Хост: @HOSTNAME@
+Размер: @SIZE@
+Тип MIME: @MIME@
+Пользователь: @USER@
diff --git a/wiki/inc/lang/ru/wordblock.txt b/wiki/inc/lang/ru/wordblock.txt
new file mode 100644
index 0000000..09c663f
--- /dev/null
+++ b/wiki/inc/lang/ru/wordblock.txt
@@ -0,0 +1,3 @@
+====== СПАМ заблокирован ======
+
+Ваши изменения **не были** сохранены, так как они содержат одно или более запрещенных слов. Если Вы пытались добавить спам в Вики -- ай-яй-яй!  Если Вы считаете, что это какая-то ошибка, обратитесь к администратору вики.
diff --git a/wiki/inc/lang/sk/admin.txt b/wiki/inc/lang/sk/admin.txt
new file mode 100644
index 0000000..510eeb9
--- /dev/null
+++ b/wiki/inc/lang/sk/admin.txt
@@ -0,0 +1,5 @@
+====== Administrácia ======
+
+Nižšie môžete nájsť zoznam administratívnych úloh dostupných v DokuWiki.
+
+
diff --git a/wiki/inc/lang/sk/adminplugins.txt b/wiki/inc/lang/sk/adminplugins.txt
new file mode 100644
index 0000000..64d2ca7
--- /dev/null
+++ b/wiki/inc/lang/sk/adminplugins.txt
@@ -0,0 +1 @@
+===== Ďalšie pluginy =====
\ No newline at end of file
diff --git a/wiki/inc/lang/sk/backlinks.txt b/wiki/inc/lang/sk/backlinks.txt
new file mode 100644
index 0000000..b3217d5
--- /dev/null
+++ b/wiki/inc/lang/sk/backlinks.txt
@@ -0,0 +1,3 @@
+====== Spätné odkazy ======
+
+Tu je zoznam stránok, ktoré pravdepodobne odkazujú na aktuálnu stránku.
diff --git a/wiki/inc/lang/sk/conflict.txt b/wiki/inc/lang/sk/conflict.txt
new file mode 100644
index 0000000..5dab2db
--- /dev/null
+++ b/wiki/inc/lang/sk/conflict.txt
@@ -0,0 +1,5 @@
+====== Existuje novšia verzia ======
+
+Existuje novšia verzia práve upravovaného dokumentu. To sa stáva, keď niekto iný zmenil dokument, ktorý práve upravujete.
+
+Prehliadnite si nižšie uvedené rozdiely, prípadne rozdiely z obidvoch verzií ručne spojte dohromady a rozhodnite sa, ktorú verziu uchovať. Ak zvolíte ''Uložiť', bude uložená vaša verzia. V opačnom prípade stlačte ''Storno'' pre uchovanie pôvodnej verzie.
diff --git a/wiki/inc/lang/sk/denied.txt b/wiki/inc/lang/sk/denied.txt
new file mode 100644
index 0000000..aa6f7b8
--- /dev/null
+++ b/wiki/inc/lang/sk/denied.txt
@@ -0,0 +1,4 @@
+====== Nepovolená akcia ======
+
+Prepáčte, ale nemáte dostatočné oprávnenie k tejto činnosti.
+
diff --git a/wiki/inc/lang/sk/diff.txt b/wiki/inc/lang/sk/diff.txt
new file mode 100644
index 0000000..0548ea5
--- /dev/null
+++ b/wiki/inc/lang/sk/diff.txt
@@ -0,0 +1,4 @@
+====== Rozdiely ======
+
+Tu môžete vidieť rozdiely medzi vybranou verziou a aktuálnou verziou danej stránky.
+
diff --git a/wiki/inc/lang/sk/draft.txt b/wiki/inc/lang/sk/draft.txt
new file mode 100644
index 0000000..96a4e91
--- /dev/null
+++ b/wiki/inc/lang/sk/draft.txt
@@ -0,0 +1,6 @@
+====== Nájdený súbor konceptu ======
+
+Vaša posledná editácia tejto stránky nebola ukončená korektne. Dokuwiki automaticky uložila počas vašej práce koncept a ten môžete teraz použiť pre pokračovanie editácie. Nižšie môžete vidieť dáta, ktoré boli uložené.
+
+Prosím, rozhodnite sa, či chcete //obnoviť// vašu poslednú editáciu, //zmazať// automaticky uložený koncept alebo //stornovať// proces editácie.
+
diff --git a/wiki/inc/lang/sk/edit.txt b/wiki/inc/lang/sk/edit.txt
new file mode 100644
index 0000000..b8d63fb
--- /dev/null
+++ b/wiki/inc/lang/sk/edit.txt
@@ -0,0 +1 @@
+Upravte stránku a stlačte ''Uložiť''. Na stránke [[wiki:syntax]] sa môžete dozvedieť viac o Wiki syntaxi. Prosím upravujte stránky, len pokiaľ ich môžete **zdokonaliť**. Pokiaľ si chcete niečo len vyskúšať, použite [[playground:playground| pieskovisko]].
diff --git a/wiki/inc/lang/sk/editrev.txt b/wiki/inc/lang/sk/editrev.txt
new file mode 100644
index 0000000..ed15e79
--- /dev/null
+++ b/wiki/inc/lang/sk/editrev.txt
@@ -0,0 +1 @@
+**Máte načítanú staršiu verziu dokumentu!** Pokiaľ ju uložíte, vytvoríte tým novú aktuálnu verziu.
diff --git a/wiki/inc/lang/sk/index.txt b/wiki/inc/lang/sk/index.txt
new file mode 100644
index 0000000..b4189f2
--- /dev/null
+++ b/wiki/inc/lang/sk/index.txt
@@ -0,0 +1,3 @@
+====== Index ======
+
+Tu je k dispozícii index všetkých dostupných stránok zoradených podľa [[doku>namespaces|menných priestorov]].
diff --git a/wiki/inc/lang/sk/install.html b/wiki/inc/lang/sk/install.html
new file mode 100644
index 0000000..86cc6cc
--- /dev/null
+++ b/wiki/inc/lang/sk/install.html
@@ -0,0 +1,23 @@
+<p>Táto stránka sprevádza prvou inštaláciou a konfiguráciou
+<a href="http://dokuwiki.org">Dokuwiki</a>. Viac informácií o tomto inštalátore je dostupných na jeho
+<a href="http://dokuwiki.org/installer">dokumentačnej stránke</a>.</p>
+
+<p>DokuWiki používa bežné súbory pre ukladanie wiki stránok a iných informácií
+priradených k týmto stránkam (napr. obrázkov, vyhľadávacích indexov, starých
+revízií). Ak chcete úspešne narábať s DokuWiki, <strong>musí</strong>
+mať práva pre zápis do adresárov, kde sa ukladajú tieto súbory. Tento inštalátor
+nie je schopný nastaviť prístupové práva pre adresáre. Je potrebné to urobiť
+priamo cez príkazový riadok alebo, ak využívate webhosting, cez FTP alebo vaše
+webhostingové administračné rozhranie.</p>
+
+<p>Tento inštalátor nastaví <abbr title="access control list - zoznam prístupových práv">ACL</abbr>
+konfiguráciu vašej Dokuwiki. Umožňuje vytvoriť administrátorské konto
+s prístupom do administračného menu s možnosťou inštalácie pluginov, správy
+užívateľov, správy prístupových práv k wiki stránkam a zmeny konfiguračných
+nastavení. Nie je nevyhnutné pre používanie Dokuwiki, ale umožňuje to ľahšie
+spravovať Dokuwiki.</p>
+
+<p>Skúsení užívatelia alebo užívatelia so špeciálnymi požiadavkami môžu použiť
+tieto odkazy pre bližšie informácie týkajúce sa
+<a href="http://dokuwiki.org/install">inštalačných pokynov</a>
+a <a href="http://dokuwiki.org/config">konfiguračných nastavení</a>.</p>
diff --git a/wiki/inc/lang/sk/jquery.ui.datepicker.js b/wiki/inc/lang/sk/jquery.ui.datepicker.js
new file mode 100644
index 0000000..16d8bdf
--- /dev/null
+++ b/wiki/inc/lang/sk/jquery.ui.datepicker.js
@@ -0,0 +1,37 @@
+/* Slovak initialisation for the jQuery UI date picker plugin. */
+/* Written by Vojtech Rinik (vojto@hmm.sk). */
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "../widgets/datepicker" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery.datepicker );
+	}
+}( function( datepicker ) {
+
+datepicker.regional.sk = {
+	closeText: "Zavrieť",
+	prevText: "&#x3C;Predchádzajúci",
+	nextText: "Nasledujúci&#x3E;",
+	currentText: "Dnes",
+	monthNames: [ "január","február","marec","apríl","máj","jún",
+	"júl","august","september","október","november","december" ],
+	monthNamesShort: [ "Jan","Feb","Mar","Apr","Máj","Jún",
+	"Júl","Aug","Sep","Okt","Nov","Dec" ],
+	dayNames: [ "nedeľa","pondelok","utorok","streda","štvrtok","piatok","sobota" ],
+	dayNamesShort: [ "Ned","Pon","Uto","Str","Štv","Pia","Sob" ],
+	dayNamesMin: [ "Ne","Po","Ut","St","Št","Pia","So" ],
+	weekHeader: "Ty",
+	dateFormat: "dd.mm.yy",
+	firstDay: 1,
+	isRTL: false,
+	showMonthAfterYear: false,
+	yearSuffix: "" };
+datepicker.setDefaults( datepicker.regional.sk );
+
+return datepicker.regional.sk;
+
+} ) );
diff --git a/wiki/inc/lang/sk/lang.php b/wiki/inc/lang/sk/lang.php
new file mode 100644
index 0000000..bd8d1c9
--- /dev/null
+++ b/wiki/inc/lang/sk/lang.php
@@ -0,0 +1,340 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Martin Michalek <michalek.dev@gmail.com>
+ * @author Ondrej Vegh <ov@vsieti.sk> with help of the scholars from Zdruzena stredna skola polygraficka in Bratislava
+ * @author Michal Mesko <michal.mesko@gmail.com>
+ * @author exusik <exusik@gmail.com>
+ */
+$lang['encoding']              = 'utf-8';
+$lang['direction']             = 'ltr';
+$lang['doublequoteopening']    = '„';
+$lang['doublequoteclosing']    = '“';
+$lang['singlequoteopening']    = '‚';
+$lang['singlequoteclosing']    = '‘';
+$lang['apostrophe']            = '’';
+$lang['btn_edit']              = 'Upraviť stránku';
+$lang['btn_source']            = 'Zobraziť zdroj stránky';
+$lang['btn_show']              = 'Zobraziť stránku';
+$lang['btn_create']            = 'Vytvoriť stránku';
+$lang['btn_search']            = 'Hľadať';
+$lang['btn_save']              = 'Uložiť';
+$lang['btn_preview']           = 'Náhľad';
+$lang['btn_top']               = 'Hore';
+$lang['btn_newer']             = '<< novšie';
+$lang['btn_older']             = 'staršie >>';
+$lang['btn_revs']              = 'Staršie verzie';
+$lang['btn_recent']            = 'Posledné úpravy';
+$lang['btn_upload']            = 'Nahrať';
+$lang['btn_cancel']            = 'Storno';
+$lang['btn_index']             = 'Index';
+$lang['btn_secedit']           = 'Upraviť';
+$lang['btn_login']             = 'Prihlásiť sa';
+$lang['btn_logout']            = 'Odhlásiť sa';
+$lang['btn_admin']             = 'Admin';
+$lang['btn_update']            = 'Aktualizovať';
+$lang['btn_delete']            = 'Zmazať';
+$lang['btn_back']              = 'Späť';
+$lang['btn_backlink']          = 'Spätné odkazy';
+$lang['btn_subscribe']         = 'Sledovať zmeny';
+$lang['btn_profile']           = 'Aktualizovať profil';
+$lang['btn_reset']             = 'Zrušiť';
+$lang['btn_resendpwd']         = 'Nastaviť nové heslo';
+$lang['btn_draft']             = 'Upraviť koncept';
+$lang['btn_recover']           = 'Obnoviť koncept';
+$lang['btn_draftdel']          = 'Zmazať koncept';
+$lang['btn_revert']            = 'Obnoviť';
+$lang['btn_register']          = 'Registrovať';
+$lang['btn_apply']             = 'Použiť';
+$lang['btn_media']             = 'Správa médií';
+$lang['btn_deleteuser']        = 'Zrušiť môj účet';
+$lang['btn_img_backto']        = 'Späť na %s';
+$lang['btn_mediaManager']      = 'Prezrieť v správcovi médií';
+$lang['loggedinas']            = 'Prihlásený(á) ako:';
+$lang['user']                  = 'Používateľské meno';
+$lang['pass']                  = 'Heslo';
+$lang['newpass']               = 'Nové heslo';
+$lang['oldpass']               = 'Potvrď aktuálne heslo';
+$lang['passchk']               = 'Ešte raz znovu';
+$lang['remember']              = 'Zapamätaj si ma';
+$lang['fullname']              = 'Celé meno';
+$lang['email']                 = 'E-Mail';
+$lang['profile']               = 'Používateľský profil';
+$lang['badlogin']              = 'Zadané používateľské meno a heslo nie je správne.';
+$lang['badpassconfirm']        = 'Ľutujem, heslo bolo nesprávne.';
+$lang['minoredit']             = 'Menšie zmeny';
+$lang['draftdate']             = 'Koncept automaticky uložený';
+$lang['nosecedit']             = 'Stránka bola medzičasom zmenená, informácie o sekcii sú zastaralé a z tohto dôvodu bola nahraná celá stránka.';
+$lang['regmissing']            = 'Musíte vyplniť všetky údaje.';
+$lang['reguexists']            = 'Používateľ s rovnakým menom je už zaregistrovaný.';
+$lang['regsuccess']            = 'Používateľský účet bol vytvorený a heslo zaslané emailom.';
+$lang['regsuccess2']           = 'Používateľský účet bol vytvorený.';
+$lang['regfail']               = 'Používateľský účet nemôže byť vytvorený.';
+$lang['regmailfail']           = 'Zdá sa, že nastala chyba pri posielaní mailu s heslom. Skúste kontaktovať správcu.';
+$lang['regbadmail']            = 'Zadaná emailová adresa nie je platná. Pokiaľ si myslíte, že to je zle, skúste kontaktovať správcu.';
+$lang['regbadpass']            = 'Zadané heslá nie sú rovnaké, zadajte ich prosím znovu.';
+$lang['regpwmail']             = 'Vaše heslo do systému DokuWiki';
+$lang['reghere']               = 'Nemáte používateľský účet? Vytvorte si ho';
+$lang['profna']                = 'Táto wiki nepodporuje zmenu profilu';
+$lang['profnochange']          = 'Žiadne zmeny, nie je čo robiť.';
+$lang['profnoempty']           = 'Prázdne meno alebo mailová adresa nie sú povolené.';
+$lang['profchanged']           = 'Profil požívateľa bol úspešne zmenený.';
+$lang['profnodelete']          = 'Táto wiki neumožňuje zrušenie používateľov.';
+$lang['profdeleteuser']        = 'Zrušiť účet';
+$lang['profdeleted']           = 'Váš účet bol zrušený v tejto wiki.';
+$lang['profconfdelete']        = 'Chcem odstrániť môj účet z tejto wiki. <br/> Táto operácia je nevratná.';
+$lang['profconfdeletemissing'] = 'Nebolo zavolené potvrdzovacie políčko';
+$lang['proffail']              = 'Profil používateľa nebol aktualizovaný.';
+$lang['pwdforget']             = 'Zabudli ste heslo? Získajte nové!';
+$lang['resendna']              = 'Táto wiki nepodporuje opätovné zasielanie hesla.';
+$lang['resendpwd']             = 'Nastaviť nové heslo pre';
+$lang['resendpwdmissing']      = 'Prepáčte, musíte vyplniť všetky polia.';
+$lang['resendpwdnouser']       = 'Prepáčte, nemôžeme nájsť zadaného používateľa v databáze.';
+$lang['resendpwdbadauth']      = 'Prepáčte, tento autorizačný kód nie je platný. Uistite sa, či ste použili celý autorizačný odkaz.';
+$lang['resendpwdconfirm']      = 'Autorizačný odkaz bol zaslaný na e-mail.';
+$lang['resendpwdsuccess']      = 'Vaše nové heslo bolo zaslané na e-mail.';
+$lang['license']               = 'Ak nie je uvedené inak, obsah tejto wiki je uverejnený pod nasledujúcou licenciou:';
+$lang['licenseok']             = 'Poznámka: Zmenou tejto stránky súhlasíte s uverejnením obsahu pod nasledujúcou licenciou:';
+$lang['searchmedia']           = 'Hľadať meno súboru:';
+$lang['searchmedia_in']        = 'Hľadať v %s';
+$lang['txt_upload']            = 'Vyberte súbor ako prílohu:';
+$lang['txt_filename']          = 'Uložiť ako (voliteľné):';
+$lang['txt_overwrt']           = 'Prepísať existujúci súbor';
+$lang['maxuploadsize']         = 'Obmedzenie max. %s na súbor.';
+$lang['lockedby']              = 'Práve zamknuté:';
+$lang['lockexpire']            = 'Zámok stratí platnosť:';
+$lang['js']['willexpire']      = 'Váš zámok pre editáciu za chvíľu stratí platnosť.\nAby ste predišli konfliktom, stlačte tlačítko Náhľad a zámok sa predĺži.';
+$lang['js']['notsavedyet']     = 'Neuložené zmeny budú stratené.
+Chcete naozaj pokračovať?';
+$lang['js']['searchmedia']     = 'Hľadať súbory';
+$lang['js']['keepopen']        = 'Po vybraní súboru ponechať okno otvorené';
+$lang['js']['hidedetails']     = 'Skryť detaily';
+$lang['js']['mediatitle']      = 'Nastavenia odkazu';
+$lang['js']['mediadisplay']    = 'Typ odkazu';
+$lang['js']['mediaalign']      = 'Zarovnanie';
+$lang['js']['mediasize']       = 'Veľkosť obrázka';
+$lang['js']['mediatarget']     = 'Cieľ odkazu';
+$lang['js']['mediaclose']      = 'Zatvoriť';
+$lang['js']['mediainsert']     = 'Vložiť';
+$lang['js']['mediadisplayimg'] = 'Zobraziť obrázok.';
+$lang['js']['mediadisplaylnk'] = 'Zobraziť iba odkaz.';
+$lang['js']['mediasmall']      = 'Malý';
+$lang['js']['mediamedium']     = 'Stredný';
+$lang['js']['medialarge']      = 'Veľký';
+$lang['js']['mediaoriginal']   = 'Originál';
+$lang['js']['medialnk']        = 'Odkaz na stránku s detailným popisom';
+$lang['js']['mediadirect']     = 'Priamy odkaz na originál';
+$lang['js']['medianolnk']      = 'Žiadny odkaz';
+$lang['js']['medianolink']     = 'Bez odkazu na obrázok';
+$lang['js']['medialeft']       = 'Zarovnať obrázok vľavo.';
+$lang['js']['mediaright']      = 'Zarovnať obrázok vpravo.';
+$lang['js']['mediacenter']     = 'Zarovnať obrázok na stred.';
+$lang['js']['medianoalign']    = 'Nepoužívať zarovnanie.';
+$lang['js']['nosmblinks']      = 'Odkazovanie na zdieľané prostriedky Windows funguje len v Internet Exploreri.
+Aj napriek tomu tento odkaz môžete skopírovať a vložiť inde.';
+$lang['js']['linkwiz']         = 'Sprievodca odkazmi';
+$lang['js']['linkto']          = 'Odkaz na:';
+$lang['js']['del_confirm']     = 'Zmazať túto položku?';
+$lang['js']['restore_confirm'] = 'Skutočne obnoviť túto verziu?';
+$lang['js']['media_diff']      = 'Zobraziť rozdiely:';
+$lang['js']['media_diff_both'] = 'Vedľa seba';
+$lang['js']['media_diff_opacity'] = 'Presvitaním';
+$lang['js']['media_diff_portions'] = 'Potiahnutím';
+$lang['js']['media_select']    = 'Vybrať súbory...';
+$lang['js']['media_upload_btn'] = 'Nahrať';
+$lang['js']['media_done_btn']  = 'Hotovo';
+$lang['js']['media_drop']      = 'Pridajte súbory potiahnutím myšou';
+$lang['js']['media_cancel']    = 'odstrániť';
+$lang['js']['media_overwrt']   = 'Prepísať existujúce súbory';
+$lang['rssfailed']             = 'Nastala chyba pri vytváraní tohto RSS: ';
+$lang['nothingfound']          = 'Nič nenájdené.';
+$lang['mediaselect']           = 'Výber súboru';
+$lang['uploadsucc']            = 'Prenos prebehol v poriadku';
+$lang['uploadfail']            = 'Chyba pri nahrávaní. Možno kvôli zle nastaveným právam?';
+$lang['uploadwrong']           = 'Prenos súboru s takouto príponou nie je dovolený.';
+$lang['uploadexist']           = 'Súbor už existuje. Žiadna akcia.';
+$lang['uploadbadcontent']      = 'Nahraný obsah sa nezhoduje s príponou súboru %s.';
+$lang['uploadspam']            = 'Nahrávanie bolo zablokované spamovým blacklistom.';
+$lang['uploadxss']             = 'Nahrávanie bolo zablokované kvôli potenciálnemu škodlivému obsahu.';
+$lang['uploadsize']            = 'Nahraný súbor bol príliš veľký. (max %s)';
+$lang['deletesucc']            = 'Súbor "%s" bol zmazaný.';
+$lang['deletefail']            = '"%s" nie je možné zmazať - skontrolujte oprávnenia.';
+$lang['mediainuse']            = 'Súbor "%s" nebol zmazaný - je stále používaný.';
+$lang['namespaces']            = 'Menné priestory';
+$lang['mediafiles']            = 'Dostupné súbory';
+$lang['accessdenied']          = 'Nemáte oprávnenie na zobrazenie požadovanej stránky.';
+$lang['mediausage']            = 'Pre odkázanie na súbor použite nasledujúcu syntax:';
+$lang['mediaview']             = 'Zobraziť pôvodný súbor';
+$lang['mediaroot']             = 'root';
+$lang['mediaupload']           = 'Nahrať súbor do aktuálneho menného priestoru. Pre vytvorenie menného podpriestoru, pridajte jeho názov na začiatok mena súboru (oddelený dvojbodkou)';
+$lang['mediaextchange']        = 'Prípona súboru bola zmenená z .%s na .%s!';
+$lang['reference']             = 'Referencie pre';
+$lang['ref_inuse']             = 'Súbor nemôže byť zmazaný, pretože je stále používaný nasledujúcimi stránkami:';
+$lang['ref_hidden']            = 'Niektoré referencie sú na stránky, pre ktoré nemáte právo na čítanie';
+$lang['hits']                  = '- počet výskytov';
+$lang['quickhits']             = 'Zodpovedajúce stránky';
+$lang['toc']                   = 'Obsah';
+$lang['current']               = 'aktuálne';
+$lang['yours']                 = 'Vaša verzia';
+$lang['diff']                  = 'Zobraziť rozdiely voči aktuálnej verzii';
+$lang['diff2']                 = 'Zobraziť rozdiely medzi vybranými verziami';
+$lang['difflink']              = 'Odkaz na tento prehľad zmien';
+$lang['diff_type']             = 'Prehľad zmien:';
+$lang['diff_inline']           = 'Vnorený';
+$lang['diff_side']             = 'Vedľa seba';
+$lang['diffprevrev']           = 'Predchádzajúca revízia';
+$lang['diffnextrev']           = 'Nasledujúca revízia';
+$lang['difflastrev']           = 'Posledná revízia';
+$lang['line']                  = 'Riadok';
+$lang['breadcrumb']            = 'História:';
+$lang['youarehere']            = 'Nachádzate sa:';
+$lang['lastmod']               = 'Posledná úprava:';
+$lang['by']                    = 'od';
+$lang['deleted']               = 'odstránené';
+$lang['created']               = 'vytvorené';
+$lang['restored']              = 'stará verzia bola obnovená (%s)';
+$lang['external_edit']         = 'externá úprava';
+$lang['summary']               = 'Komentár k úpravám';
+$lang['noflash']               = 'Pre zobrazenie tohto obsahu potrebujete <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a>.';
+$lang['download']              = 'Stiahnuť';
+$lang['tools']                 = 'Nástroje';
+$lang['user_tools']            = 'Nástroje používateľa';
+$lang['site_tools']            = 'Nástoje správy stránok';
+$lang['page_tools']            = 'Nástoje stránky';
+$lang['skip_to_content']       = 'skok na obsah';
+$lang['sidebar']               = 'Bočný panel';
+$lang['mail_newpage']          = 'stránka pridaná:';
+$lang['mail_changed']          = 'stránka zmenená:';
+$lang['mail_subscribe_list']   = 'stránky zmenené v mennom priestore:';
+$lang['mail_new_user']         = 'nový používateľ:';
+$lang['mail_upload']           = 'nahraný súbor:';
+$lang['changes_type']          = 'Prehľad zmien';
+$lang['pages_changes']         = 'Stránok';
+$lang['media_changes']         = 'Súbory';
+$lang['both_changes']          = 'Stránok spolu s média súbormi';
+$lang['qb_bold']               = 'Tučné';
+$lang['qb_italic']             = 'Kurzíva';
+$lang['qb_underl']             = 'Podčiarknutie';
+$lang['qb_code']               = 'Neformátovať (zdrojový kód)';
+$lang['qb_strike']             = 'Prečiarknutie';
+$lang['qb_h1']                 = 'Nadpis 1. úrovne';
+$lang['qb_h2']                 = 'Nadpis 2. úrovne';
+$lang['qb_h3']                 = 'Nadpis 3. úrovne';
+$lang['qb_h4']                 = 'Nadpis 4. úrovne';
+$lang['qb_h5']                 = 'Nadpis 5. úrovne';
+$lang['qb_h']                  = 'Nadpis';
+$lang['qb_hs']                 = 'Zvoliť nadpis';
+$lang['qb_hplus']              = 'Nadpis vyššej úrovne';
+$lang['qb_hminus']             = 'Nadpis nižšej úrovne';
+$lang['qb_hequal']             = 'Nadpis predchádzajúcej úrovne';
+$lang['qb_link']               = 'Interný odkaz';
+$lang['qb_extlink']            = 'Externý odkaz';
+$lang['qb_hr']                 = 'Horizontálna linka';
+$lang['qb_ol']                 = 'Číslovaný zoznam';
+$lang['qb_ul']                 = 'Nečíslovaný zoznam';
+$lang['qb_media']              = 'Vložiť obrázky alebo iné súbory';
+$lang['qb_sig']                = 'Vložiť podpis';
+$lang['qb_smileys']            = 'Smajlíky';
+$lang['qb_chars']              = 'Špeciálne znaky';
+$lang['upperns']               = 'návrat do nadradeného menného priestoru';
+$lang['metaedit']              = 'Upraviť metainformácie';
+$lang['metasaveerr']           = 'Zápis metainformácií zlyhal';
+$lang['metasaveok']            = 'Metainformácie uložené';
+$lang['img_title']             = 'Titul:';
+$lang['img_caption']           = 'Popis:';
+$lang['img_date']              = 'Dátum:';
+$lang['img_fname']             = 'Názov súboru:';
+$lang['img_fsize']             = 'Veľkosť:';
+$lang['img_artist']            = 'Fotograf:';
+$lang['img_copyr']             = 'Kopírovacie práva:';
+$lang['img_format']            = 'Formát:';
+$lang['img_camera']            = 'Fotoaparát:';
+$lang['img_keywords']          = 'Kľúčové slová:';
+$lang['img_width']             = 'Šírka:';
+$lang['img_height']            = 'Výška:';
+$lang['subscr_subscribe_success'] = 'Používateľ %s bol pridaný do zoznamu hlásení o zmenách %s';
+$lang['subscr_subscribe_error'] = 'Chyba pri pridaní používateľa %s do zoznamu hlásení o zmenách %s';
+$lang['subscr_subscribe_noaddress'] = 'Vaše prihlasovacie meno nemá priradenú žiadnu email adresu, nemôžete byť pridaný do zoznamu hlásení o zmenách';
+$lang['subscr_unsubscribe_success'] = 'Používateľ %s bol odstránený zo zoznamu hlásení o zmenách %s';
+$lang['subscr_unsubscribe_error'] = 'Chyba pri odstránení používateľa %s zo zoznamu hlásení o zmenách %s';
+$lang['subscr_already_subscribed'] = 'Používateľ %s už je v zozname hlásení o zmenách %s';
+$lang['subscr_not_subscribed'] = 'Používateľ %s nie je v zozname hlásení o zmenách %s';
+$lang['subscr_m_not_subscribed'] = 'Momentálne nesledujete zmeny aktuálnej stránky alebo menného priestoru.';
+$lang['subscr_m_new_header']   = 'Pridať sledovanie zmien';
+$lang['subscr_m_current_header'] = 'Aktuálne sledované zmeny';
+$lang['subscr_m_unsubscribe']  = 'Nesledovať zmeny';
+$lang['subscr_m_subscribe']    = 'Sledovať zmeny';
+$lang['subscr_m_receive']      = 'Dostávať';
+$lang['subscr_style_every']    = 'email pri každej zmene';
+$lang['subscr_style_digest']   = 'email so zhrnutím zmien pre každú stránku (perióda %.2f dňa)';
+$lang['subscr_style_list']     = 'zoznam zmenených stránok od posledného emailu (perióda %.2f dňa)';
+$lang['authtempfail']          = 'Používateľská autentifikácia je dočasne nedostupná. Ak táto situácia pretrváva, prosím informujte správcu systému.';
+$lang['i_chooselang']          = 'Zvoľte váš jazyk';
+$lang['i_installer']           = 'DokuWiki inštalátor';
+$lang['i_wikiname']            = 'Názov Wiki';
+$lang['i_enableacl']           = 'Aktivovať ACL (doporučené)';
+$lang['i_superuser']           = 'Správca';
+$lang['i_problems']            = 'Inštalátor narazil na nižšie uvedené problémy. Nemôžete pokračovať, pokiaľ ich neodstránite.';
+$lang['i_modified']            = 'Z bezpečnostných dôvodov bude tento skript fungovať iba s novou, neupravenou inštaláciou Dokuwiki. Môžete buď znovu rozbaliť stiahnutý inštalačný balík alebo preštudovať <a href="http://dokuwiki.org/install"> inštalačné inštrukcie Dokuwiki</a>';
+$lang['i_funcna']              = 'PHP funkcia <code>%s</code> nie je dostupná. Je možné, že ju z určitých dôvodov zablokoval váš poskytovateľ webhostingu?';
+$lang['i_phpver']              = 'Vaša verzia PHP <code>%s</code> je nižšia ako požadovaná <code>%s</code>. Potrebujete aktualizovať Vašu inštaláciu PHP.';
+$lang['i_mbfuncoverload']      = 'mbstring.func_overload musí byt zakázaná v php.ini pre bezproblémový chod DokuWiki.';
+$lang['i_permfail']            = '<code>%s</code> nie je zapisovateľný pre DokuWiki. Musíte zmeniť prístupové práva pre tento adresár!';
+$lang['i_confexists']          = '<code>%s</code> už existuje';
+$lang['i_writeerr']            = 'Nie je možné vytvoriť <code>%s</code>. Potrebujete skontrolovať prístupové práva pre adresár/súbor a vytvoriť ho manuálne.';
+$lang['i_badhash']             = 'neznámy alebo zmenený súbor dokuwiki.php (hash=<code>%s</code>)';
+$lang['i_badval']              = '<code>%s</code> - nesprávna alebo žiadna hodnota';
+$lang['i_success']             = 'Konfigurácia bola úspešne ukončená. Teraz môžete zmazať súbor install.php. Pokračujte vo <a href="doku.php?id=wiki:welcome">vašej novej DokuWiki</a>.';
+$lang['i_failure']             = 'Pri zápise konfiguračného súboru nastali nejaké chyby. Potrebujete ich opraviť manuálne pred tým, ako budete môcť používať <a href="doku.php?id=wiki:welcome">vašu novú DokuWiki</a>.';
+$lang['i_policy']              = 'Počiatočná ACL politika';
+$lang['i_pol0']                = 'Otvorená Wiki (čítanie, zápis a nahrávanie pre každého)';
+$lang['i_pol1']                = 'Verejná Wiki (čítanie pre každého, zápis a nahrávanie pre registrovaných používateľov)';
+$lang['i_pol2']                = 'Uzatvorená Wiki (čítanie, zápis a nahrávanie len pre registrovaných používateľov)';
+$lang['i_allowreg']            = 'Povolenie samostanej registrácie používateľov';
+$lang['i_retry']               = 'Skúsiť znovu';
+$lang['i_license']             = 'Vyberte licenciu, pod ktorou chcete uložiť váš obsah:';
+$lang['i_license_none']        = 'Nezobrazovať žiadne licenčné informácie';
+$lang['i_pop_field']           = 'Prosím pomôžte nám zlepšiť prácu s DokuWiki:';
+$lang['i_pop_label']           = 'Raz mesačne zaslať anonymné údaje vývojárom DokuWiki';
+$lang['recent_global']         = 'Práve prehliadate zmeny v mennom priestore <b>%s</b>. Môžete si tiež pozrieť <a href="%s">aktuálne zmeny celej wiki</a>.';
+$lang['years']                 = 'pred %d rokmi';
+$lang['months']                = 'pred %d mesiacmi';
+$lang['weeks']                 = 'pred %d týždňami';
+$lang['days']                  = 'pred %d dňami';
+$lang['hours']                 = 'pred %d hodinami';
+$lang['minutes']               = 'pred %d minútami';
+$lang['seconds']               = 'pred %d sekundami';
+$lang['wordblock']             = 'Vaše zmeny neboli uložené, pretože obsahovali nepovolený text (spam).';
+$lang['media_uploadtab']       = 'Nahrať';
+$lang['media_searchtab']       = 'Hľadať';
+$lang['media_file']            = 'Súbor';
+$lang['media_viewtab']         = 'Náhľad';
+$lang['media_edittab']         = 'Upraviť';
+$lang['media_historytab']      = 'História';
+$lang['media_list_thumbs']     = 'Miniatúry';
+$lang['media_list_rows']       = 'Zoznam';
+$lang['media_sort_name']       = 'Meno';
+$lang['media_sort_date']       = 'Dátum';
+$lang['media_namespaces']      = 'Vybrať priestor';
+$lang['media_files']           = 'Súbory v %s';
+$lang['media_upload']          = 'Nahrať do %s';
+$lang['media_search']          = 'Hľadať v %s';
+$lang['media_view']            = '%s';
+$lang['media_viewold']         = '%s v %s';
+$lang['media_edit']            = 'Upraviť %s';
+$lang['media_history']         = 'História %s';
+$lang['media_meta_edited']     = 'metadáta upravené';
+$lang['media_perm_read']       = 'Prepáčte, ale nemáte dostatočné oprávnenie na čítanie súborov.';
+$lang['media_perm_upload']     = 'Prepáčte, ale nemáte dostatočné oprávnenie na nahrávanie súborov.';
+$lang['media_update']          = 'Nahrať novú verziu';
+$lang['media_restore']         = 'Obnoviť túto verziu';
+$lang['media_acl_warning']     = 'Tento zoznam nemusí byť úplný z dôvodu ACL obmedzení alebo skratých stránok.';
+$lang['currentns']             = 'Aktuálny menný priestor';
+$lang['searchresult']          = 'Výsledky hľadania';
+$lang['plainhtml']             = 'Jednoduché HTML';
+$lang['wikimarkup']            = 'Wiki formát';
+$lang['unable_to_parse_date']  = 'Nie je možné spracovať parameter "%s".';
+$lang['email_signature_text']  = 'Táto správa bola zaslaná DokuWiki
+@DOKUWIKIURL@';
diff --git a/wiki/inc/lang/sk/locked.txt b/wiki/inc/lang/sk/locked.txt
new file mode 100644
index 0000000..fae400b
--- /dev/null
+++ b/wiki/inc/lang/sk/locked.txt
@@ -0,0 +1,3 @@
+====== Stránka je uzamknutá ======
+
+Tato stránka je práve uzamknutá pre úpravy iným používateľom. Musíte počkať dovtedy, pokiaľ daný používateľ dokončí svoje úpravy alebo pokiaľ tento zámok stratí platnosť.
diff --git a/wiki/inc/lang/sk/login.txt b/wiki/inc/lang/sk/login.txt
new file mode 100644
index 0000000..3bfc910
--- /dev/null
+++ b/wiki/inc/lang/sk/login.txt
@@ -0,0 +1,3 @@
+====== Prihlásenie ======
+
+Momentálne nie ste prihlásený(á)! Prosím vložte svoje identifikačné údaje. Pre prihlásenie musíte mať zapnuté cookies.
diff --git a/wiki/inc/lang/sk/mailtext.txt b/wiki/inc/lang/sk/mailtext.txt
new file mode 100644
index 0000000..da2f441
--- /dev/null
+++ b/wiki/inc/lang/sk/mailtext.txt
@@ -0,0 +1,12 @@
+Stránka vo vašej DokuWiki bola zmenená. Tu sú podrobnosti:
+
+Dátum : @DATE@
+Prehliadač : @BROWSER@
+IP adresa : @IPADDRESS@
+Adresa : @HOSTNAME@
+Stará verzia : @OLDPAGE@
+Nová verzia : @NEWPAGE@
+Komentár : @SUMMARY@
+User : @USER@
+
+@DIFF@
diff --git a/wiki/inc/lang/sk/mailwrap.html b/wiki/inc/lang/sk/mailwrap.html
new file mode 100644
index 0000000..d257190
--- /dev/null
+++ b/wiki/inc/lang/sk/mailwrap.html
@@ -0,0 +1,13 @@
+<html>
+<head>
+<title>@TITLE@</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+</head>
+<body>
+
+@HTMLBODY@
+
+<br /><hr />
+<small>@EMAILSIGNATURE@</small>
+</body>
+</html>
\ No newline at end of file
diff --git a/wiki/inc/lang/sk/newpage.txt b/wiki/inc/lang/sk/newpage.txt
new file mode 100644
index 0000000..180d80e
--- /dev/null
+++ b/wiki/inc/lang/sk/newpage.txt
@@ -0,0 +1,3 @@
+====== Stránka s týmto názvom ešte neexistuje ======
+
+Odkaz vás zaviedol na stránku, ktorá ešte neexistuje. Môžete ju vytvoriť stlačením tlačítka ''Vytvoriť stránku''.
diff --git a/wiki/inc/lang/sk/norev.txt b/wiki/inc/lang/sk/norev.txt
new file mode 100644
index 0000000..f664ae4
--- /dev/null
+++ b/wiki/inc/lang/sk/norev.txt
@@ -0,0 +1,3 @@
+====== Takáto verzia neexistuje ======
+
+Zadaná verzia neexistuje. Stlačte tlačítko ''Staršie verzie'' pre zoznam starších verzií tohoto dokumentu.
diff --git a/wiki/inc/lang/sk/password.txt b/wiki/inc/lang/sk/password.txt
new file mode 100644
index 0000000..8d0907e
--- /dev/null
+++ b/wiki/inc/lang/sk/password.txt
@@ -0,0 +1,7 @@
+Dobrý deň,
+
+Tu sú prihlasovacie informácie pre @TITLE@ (@DOKUWIKIURL@)
+
+Meno : @FULLNAME@
+Používateľské meno : @LOGIN@
+Heslo : @PASSWORD@
diff --git a/wiki/inc/lang/sk/preview.txt b/wiki/inc/lang/sk/preview.txt
new file mode 100644
index 0000000..871bca3
--- /dev/null
+++ b/wiki/inc/lang/sk/preview.txt
@@ -0,0 +1,3 @@
+====== Náhľad ======
+
+Tu je náhľad, ako bude dokument vyzerať. Pozor: Súbor zatiaľ **nie je uložený**!
diff --git a/wiki/inc/lang/sk/pwconfirm.txt b/wiki/inc/lang/sk/pwconfirm.txt
new file mode 100644
index 0000000..f8ba97a
--- /dev/null
+++ b/wiki/inc/lang/sk/pwconfirm.txt
@@ -0,0 +1,11 @@
+Ahoj @FULLNAME@!
+
+Niekto žiadal o nové heslo pre vaše @TITLE@
+konto na @DOKUWIKIURL@
+
+Ak ste nežiadali o nové heslo, potom iba ignorujte tento mail.
+
+Pre potvrdenie, že požiadavka bola skutočne odoslaná vami,
+použite prosím nasledujúci odkaz.
+
+@CONFIRM@
diff --git a/wiki/inc/lang/sk/read.txt b/wiki/inc/lang/sk/read.txt
new file mode 100644
index 0000000..64b7ed2
--- /dev/null
+++ b/wiki/inc/lang/sk/read.txt
@@ -0,0 +1,2 @@
+Táto stránka je iba na čítanie. Môžete si prehliadnuť zdrojový kód, ale nemôžete ho meniť. Opýtajte sa správcu, ak si myslíte, že niečo nie je v poriadku.
+
diff --git a/wiki/inc/lang/sk/recent.txt b/wiki/inc/lang/sk/recent.txt
new file mode 100644
index 0000000..d9f7c3b
--- /dev/null
+++ b/wiki/inc/lang/sk/recent.txt
@@ -0,0 +1,3 @@
+====== Posledné úpravy ======
+
+Nasledujúce stránky boli nedávno zmenené.
diff --git a/wiki/inc/lang/sk/register.txt b/wiki/inc/lang/sk/register.txt
new file mode 100644
index 0000000..b939dcc
--- /dev/null
+++ b/wiki/inc/lang/sk/register.txt
@@ -0,0 +1,3 @@
+====== Zaregistrujte sa ako nový užívateľ ======
+
+Aby ste získali používateľský účet, vyplňte prosím všetky informácie v nasledujúcom formulári. Zadajte **platnú** mailovú adresu, na ktorú bude zaslané heslo. Používateľské meno musí byť v platnom [[doku>pagename|formáte]] (ktorý je rovnaký ako formát názvu stránky).
diff --git a/wiki/inc/lang/sk/registermail.txt b/wiki/inc/lang/sk/registermail.txt
new file mode 100644
index 0000000..2be1ac3
--- /dev/null
+++ b/wiki/inc/lang/sk/registermail.txt
@@ -0,0 +1,10 @@
+Nový používateľ bol registrovaný. Tu sú detaily:
+
+Používateľské meno : @NEWUSER@
+Celé meno        : @NEWNAME@
+E-Mail           : @NEWEMAIL@
+
+Dátum            : @DATE@
+Prehliadač       : @BROWSER@
+IP adresa        : @IPADDRESS@
+Meno servera     : @HOSTNAME@
diff --git a/wiki/inc/lang/sk/resendpwd.txt b/wiki/inc/lang/sk/resendpwd.txt
new file mode 100644
index 0000000..143706b
--- /dev/null
+++ b/wiki/inc/lang/sk/resendpwd.txt
@@ -0,0 +1,3 @@
+====== Poslať nové heslo ======
+
+Zadajte prosím vaše prihlasovacie meno do formulára za účelom vygenerovania nového hesla. Autorizačný odkaz bude zaslaný na vašu zaregistrovanú email adresu.
\ No newline at end of file
diff --git a/wiki/inc/lang/sk/resetpwd.txt b/wiki/inc/lang/sk/resetpwd.txt
new file mode 100644
index 0000000..a4df4a5
--- /dev/null
+++ b/wiki/inc/lang/sk/resetpwd.txt
@@ -0,0 +1,3 @@
+====== Nastavenie nového hesla ======
+
+Prosím zadajte nové heslo vášho účtu v tejto wiki.
diff --git a/wiki/inc/lang/sk/revisions.txt b/wiki/inc/lang/sk/revisions.txt
new file mode 100644
index 0000000..ad99e72
--- /dev/null
+++ b/wiki/inc/lang/sk/revisions.txt
@@ -0,0 +1,3 @@
+====== Staršie verzie ======
+
+Tu sú staršie verzie daného dokumentu. Pre návrat ku staršej verzii si ju zvoľte zo zoznamu nižšie, stlačte tlačidlo ''Upraviť stránku'' a uložte ju.
diff --git a/wiki/inc/lang/sk/searchpage.txt b/wiki/inc/lang/sk/searchpage.txt
new file mode 100644
index 0000000..5905db6
--- /dev/null
+++ b/wiki/inc/lang/sk/searchpage.txt
@@ -0,0 +1,4 @@
+====== Vyhľadávanie ======
+
+Výsledky hľadania môžete vidieť nižšie. @CREATEPAGEINFO@
+
diff --git a/wiki/inc/lang/sk/showrev.txt b/wiki/inc/lang/sk/showrev.txt
new file mode 100644
index 0000000..b694c23
--- /dev/null
+++ b/wiki/inc/lang/sk/showrev.txt
@@ -0,0 +1,2 @@
+**Toto je staršia verzia dokumentu!**
+----
diff --git a/wiki/inc/lang/sk/stopwords.txt b/wiki/inc/lang/sk/stopwords.txt
new file mode 100644
index 0000000..060ee49
--- /dev/null
+++ b/wiki/inc/lang/sk/stopwords.txt
@@ -0,0 +1,28 @@
+#Toto je zoznam slov ignorovaných indexáciou, jedno slovo na riadok
+# Keď editujete tento súbor, uistite sa, či používate UNIXové konce riadkov (jednoduchý nový riadok)
+# Nie je potrebné vkladať slová kratšie ako 3 znaky - tie sú ignorované vždy.
+# Tento zoznam je založený na inom nájdenom na http://www.ranks.nl/stopwords/
+okolo
+tvoj
+ale
+ako
+aký
+aká
+aké
+kde
+kým
+kom
+komu
+ich
+jeho
+jej
+tvoj
+môj
+moja
+moje
+moji
+náš
+váš
+www
+
+
diff --git a/wiki/inc/lang/sk/subscr_digest.txt b/wiki/inc/lang/sk/subscr_digest.txt
new file mode 100644
index 0000000..6d336cb
--- /dev/null
+++ b/wiki/inc/lang/sk/subscr_digest.txt
@@ -0,0 +1,16 @@
+Dobrý deň!
+
+Stránka @PAGE@ wiki @TITLE@ bola zmenená.
+Zoznam zmien:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Stará verzia: @OLDPAGE@
+Nová verzia: @NEWPAGE@
+
+Ak si neprajete zasielať tieto správy, prihláste sa do wiki
+@DOKUWIKIURL@, potom prejdite na
+@SUBSCRIBE@
+a odhláste sa z informovania o zmenách stránky alebo menného priestoru.
diff --git a/wiki/inc/lang/sk/subscr_form.txt b/wiki/inc/lang/sk/subscr_form.txt
new file mode 100644
index 0000000..1f12e9a
--- /dev/null
+++ b/wiki/inc/lang/sk/subscr_form.txt
@@ -0,0 +1,3 @@
+====== Sledovanie zmien ======
+
+Táto stánka umožňuje sledovať zmeny aktuálnej stránky a menného priestoru.
\ No newline at end of file
diff --git a/wiki/inc/lang/sk/subscr_list.txt b/wiki/inc/lang/sk/subscr_list.txt
new file mode 100644
index 0000000..7332e77
--- /dev/null
+++ b/wiki/inc/lang/sk/subscr_list.txt
@@ -0,0 +1,13 @@
+Dobrý deň!
+
+Stránky v mennom priestore @PAGE@ wiki @TITLE@ boli zmenené.
+Zoznam zmenených stránok:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Ak si neprajete zasielať tieto správy, prihláste sa do wiki
+@DOKUWIKIURL@, potom prejdite na
+@SUBSCRIBE@
+a odhláste sa z informovania o zmenách stránky alebo menného priestoru.
diff --git a/wiki/inc/lang/sk/subscr_single.txt b/wiki/inc/lang/sk/subscr_single.txt
new file mode 100644
index 0000000..48825a4
--- /dev/null
+++ b/wiki/inc/lang/sk/subscr_single.txt
@@ -0,0 +1,19 @@
+Dobrý deň!
+
+Stránka @PAGE@ wiki @TITLE@ bola zmenená.
+Zoznam zmien:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Dátum : @DATE@
+Používateľ : @USER@
+Komentár: @SUMMARY@
+Stará verzia: @OLDPAGE@
+Nová verzia: @NEWPAGE@
+
+Ak si neprajete zasielať tieto správy, prihláste sa do wiki
+@DOKUWIKIURL@, potom prejdite na
+@SUBSCRIBE@
+a odhláste sa z informovania o zmenách stránky alebo menného priestoru.
diff --git a/wiki/inc/lang/sk/updateprofile.txt b/wiki/inc/lang/sk/updateprofile.txt
new file mode 100644
index 0000000..33b5e5b
--- /dev/null
+++ b/wiki/inc/lang/sk/updateprofile.txt
@@ -0,0 +1,6 @@
+====== Zmena vášho používateľského profilu ======
+
+Potrebujete vyplniť len tie polia, ktoré chcete zmeniť. Nemôžete zmeniť prihlasovacie meno.
+
+
+
diff --git a/wiki/inc/lang/sk/uploadmail.txt b/wiki/inc/lang/sk/uploadmail.txt
new file mode 100644
index 0000000..df40967
--- /dev/null
+++ b/wiki/inc/lang/sk/uploadmail.txt
@@ -0,0 +1,10 @@
+Súbor bol nahraný do DokuWiki. Tu sú podrobnosti:
+
+Súbor : @MEDIA@
+Dátum : @DATE@
+Prehliadač : @BROWSER@
+IP adresa : @IPADDRESS@
+Názov hostiteľa : @HOSTNAME@
+Veľkosť : @SIZE@
+MIME Typ : @MIME@
+Užívateľ : @USER@
diff --git a/wiki/inc/lang/sl/admin.txt b/wiki/inc/lang/sl/admin.txt
new file mode 100644
index 0000000..cee19de
--- /dev/null
+++ b/wiki/inc/lang/sl/admin.txt
@@ -0,0 +1,3 @@
+===== Skrbništvo =====
+
+Navedene možnosti omogočajo skrbniško prilagajanje nastavitev sistema DokuWiki.
diff --git a/wiki/inc/lang/sl/adminplugins.txt b/wiki/inc/lang/sl/adminplugins.txt
new file mode 100644
index 0000000..899c854
--- /dev/null
+++ b/wiki/inc/lang/sl/adminplugins.txt
@@ -0,0 +1 @@
+===== Dodatni vstavki =====
\ No newline at end of file
diff --git a/wiki/inc/lang/sl/backlinks.txt b/wiki/inc/lang/sl/backlinks.txt
new file mode 100644
index 0000000..5e4d8ff
--- /dev/null
+++ b/wiki/inc/lang/sl/backlinks.txt
@@ -0,0 +1,3 @@
+====== Povratne povezave ======
+
+Spodaj je naveden seznam strani, ki so povezane na trenutno stran. EnoBesedne povezave niso zaznane kot povratne povezave.
diff --git a/wiki/inc/lang/sl/conflict.txt b/wiki/inc/lang/sl/conflict.txt
new file mode 100644
index 0000000..ec5b370
--- /dev/null
+++ b/wiki/inc/lang/sl/conflict.txt
@@ -0,0 +1,5 @@
+====== Obstaja novejša različica dokumenta ======
+
+Obstaja novejša različica dokumenta, ki ga trenutno urejate. Do zapleta pride, ko drug uporabnik spremeni dokument med vašim urejanjem in ga pred vami shrani.
+
+Temeljito preglejte spodaj izpisane razlike med dokumentoma in izberite različico, ki jo želite ohraniti. V kolikor je izbrana možnost ''shrani'', bo shranjena vaša zadnja različica. Z izbiro možnosti ''prekliči'', pa bo ohranjena trenutno shranjena različica.
diff --git a/wiki/inc/lang/sl/denied.txt b/wiki/inc/lang/sl/denied.txt
new file mode 100644
index 0000000..206e167
--- /dev/null
+++ b/wiki/inc/lang/sl/denied.txt
@@ -0,0 +1,4 @@
+====== Ni ustreznih dovoljenj ======
+
+Za nadaljevanje opravila je treba imeti ustrezna dovoljenja.
+
diff --git a/wiki/inc/lang/sl/diff.txt b/wiki/inc/lang/sl/diff.txt
new file mode 100644
index 0000000..5cb2e3a
--- /dev/null
+++ b/wiki/inc/lang/sl/diff.txt
@@ -0,0 +1,3 @@
+====== Primerjava izbranih različic ======
+
+Prikazane so razlike med izbrano in trenutno različico strani.
diff --git a/wiki/inc/lang/sl/draft.txt b/wiki/inc/lang/sl/draft.txt
new file mode 100644
index 0000000..b3fe4de
--- /dev/null
+++ b/wiki/inc/lang/sl/draft.txt
@@ -0,0 +1,5 @@
+===== Zaznan je shranjen osnutek strani =====
+
+Zadnja seja te strani ni bila pravilno zaključena. Sistem DokuWiki je samodejno shranil osnutek strani, ki ga je mogoče naprej urejati. Spodaj so navedeni podatki samodejnega shranjevanja zadnje seje.
+
+Vsebino osnutka je mogoče //obnoviti// na zadnjo sejo, //izbrisati// samodejno shranjen osnutek ali pa //prekiniti// urejanje.
\ No newline at end of file
diff --git a/wiki/inc/lang/sl/edit.txt b/wiki/inc/lang/sl/edit.txt
new file mode 100644
index 0000000..71d5fb0
--- /dev/null
+++ b/wiki/inc/lang/sl/edit.txt
@@ -0,0 +1 @@
+Po koncu urejanja strani, je stran treba ''shraniti''. Navodila in podrobnosti za urejanje je mogoče najti na strani [[wiki:syntax|skladnje]]. Možnosti urejanja in pravila skladnje je mogoče varno preizkusiti v [[playground:playground|peskovniku]].
diff --git a/wiki/inc/lang/sl/editrev.txt b/wiki/inc/lang/sl/editrev.txt
new file mode 100644
index 0000000..baaacd2
--- /dev/null
+++ b/wiki/inc/lang/sl/editrev.txt
@@ -0,0 +1,2 @@
+**Naložena je stara različica dokumenta!** V kolikor staro različico shranite, bo shranjena kot najnovejša različica.
+----
\ No newline at end of file
diff --git a/wiki/inc/lang/sl/index.txt b/wiki/inc/lang/sl/index.txt
new file mode 100644
index 0000000..dd54d2b
--- /dev/null
+++ b/wiki/inc/lang/sl/index.txt
@@ -0,0 +1,4 @@
+====== Kazalo ======
+
+Na spodnjem seznamu so izpisane vse wiki strani, ki so na voljo, razvrščene pa so po posameznih [[doku>namespaces|imenskih prostorih]].
+
diff --git a/wiki/inc/lang/sl/install.html b/wiki/inc/lang/sl/install.html
new file mode 100644
index 0000000..a008334
--- /dev/null
+++ b/wiki/inc/lang/sl/install.html
@@ -0,0 +1,20 @@
+<p>Stran je namenjena pomoči pri prvi namestitvi in nastavitvi spletišča
+<a href="http://dokuwiki.org">Dokuwiki</a>. Več podrobnosti o tem je mogoče najti na straneh dokumentacije
+<a href="http://dokuwiki.org/installer">namestitve</a>.</p>
+
+<p>Sistem DokuWiki uporablja običajne besedilne datoteke za shranjevanje
+wiki strani in drugih podrobnosti o teh straneh (npr. slike, kazalo, stare
+različice in drugo). Za pravilno delovanje <strong>mora</strong> imeti sistem DokuWiki prost
+dostop do map in datotek, zato je ključno, da so dovoljenja določena pravilno.
+Z namestilnikom ni mogoče spreminjanje dovoljenj map. To je običajno najlažje
+narediti v ukazni lupini ali pa, če spletišče Wiki gostuje na zunanjih
+strežnikih, preko nadzornika FTP povezave (npr. cPanel).</p>
+
+<p>Z namestilnikom lahko spremenite nastavitve dostopa sistema Dokuwiki
+<abbr title="access control list">ACL</abbr>, ki omogoča skrbniško prijavo in dostop do upravljanja z vstavki,
+uporabniki, dovoljenji dostopa uporabnikov do določenih strani in do nekaterih
+nastavitev. Za delovanje sistema ACL ni bistven, vendar pa močno vpliva na
+enostavnost upravljanja strani in nastavitev.</p>
+
+<p>Zahtevnejši uporabniki ali skrbniki s posebnimi zahtevami namestitve sistema
+si lahko več podrobnosti ogledajo na straneh <a href="http://dokuwiki.org/install">navodil namestitve</a> in <a href="http://dokuwiki.org/config">nastavitve</a>.</p>
\ No newline at end of file
diff --git a/wiki/inc/lang/sl/jquery.ui.datepicker.js b/wiki/inc/lang/sl/jquery.ui.datepicker.js
new file mode 100644
index 0000000..6891624
--- /dev/null
+++ b/wiki/inc/lang/sl/jquery.ui.datepicker.js
@@ -0,0 +1,38 @@
+/* Slovenian initialisation for the jQuery UI date picker plugin. */
+/* Written by Jaka Jancar (jaka@kubje.org). */
+/* c = č, s = š z = ž C = Č S = Š Z = Ž */
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "../widgets/datepicker" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery.datepicker );
+	}
+}( function( datepicker ) {
+
+datepicker.regional.sl = {
+	closeText: "Zapri",
+	prevText: "&#x3C;Prejšnji",
+	nextText: "Naslednji&#x3E;",
+	currentText: "Trenutni",
+	monthNames: [ "Januar","Februar","Marec","April","Maj","Junij",
+	"Julij","Avgust","September","Oktober","November","December" ],
+	monthNamesShort: [ "Jan","Feb","Mar","Apr","Maj","Jun",
+	"Jul","Avg","Sep","Okt","Nov","Dec" ],
+	dayNames: [ "Nedelja","Ponedeljek","Torek","Sreda","Četrtek","Petek","Sobota" ],
+	dayNamesShort: [ "Ned","Pon","Tor","Sre","Čet","Pet","Sob" ],
+	dayNamesMin: [ "Ne","Po","To","Sr","Če","Pe","So" ],
+	weekHeader: "Teden",
+	dateFormat: "dd.mm.yy",
+	firstDay: 1,
+	isRTL: false,
+	showMonthAfterYear: false,
+	yearSuffix: "" };
+datepicker.setDefaults( datepicker.regional.sl );
+
+return datepicker.regional.sl;
+
+} ) );
diff --git a/wiki/inc/lang/sl/lang.php b/wiki/inc/lang/sl/lang.php
new file mode 100644
index 0000000..213e0f8
--- /dev/null
+++ b/wiki/inc/lang/sl/lang.php
@@ -0,0 +1,334 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Simon <sbx@protonmail.ch>
+ * @author Jaka Kranjc <lynxlupodian@hotmail.com>
+ * @author Boštjan Seničar <senicar@gmail.com>
+ * @author Dejan Levec <webphp@gmail.com>
+ * @author Gregor Skumavc (grega.skumavc@gmail.com)
+ * @author Matej Urbančič (mateju@svn.gnome.org)
+ * @author Matej Urbančič <mateju@svn.gnome.org>
+ * @author Jernej Vidmar <jernej.vidmar@vidmarboehm.com>
+ */
+$lang['encoding']              = 'utf-8';
+$lang['direction']             = 'ltr';
+$lang['doublequoteopening']    = '„';
+$lang['doublequoteclosing']    = '“';
+$lang['singlequoteopening']    = '‚';
+$lang['singlequoteclosing']    = '‘';
+$lang['apostrophe']            = '’';
+$lang['btn_edit']              = 'Uredi stran';
+$lang['btn_source']            = 'Pokaži izvorno kodo strani';
+$lang['btn_show']              = 'Pokaži stran';
+$lang['btn_create']            = 'Ustvari stran';
+$lang['btn_search']            = 'Poišči';
+$lang['btn_save']              = 'Shrani';
+$lang['btn_preview']           = 'Predogled';
+$lang['btn_top']               = 'Nazaj na vrh';
+$lang['btn_newer']             = '<< novejši';
+$lang['btn_older']             = 'starejši >>';
+$lang['btn_revs']              = 'Stare različice';
+$lang['btn_recent']            = 'Nedavne spremembe';
+$lang['btn_upload']            = 'Pošlji';
+$lang['btn_cancel']            = 'Prekliči';
+$lang['btn_index']             = 'Kazalo';
+$lang['btn_secedit']           = 'Uredi';
+$lang['btn_login']             = 'Prijava';
+$lang['btn_logout']            = 'Odjava';
+$lang['btn_admin']             = 'Skrbništvo';
+$lang['btn_update']            = 'Posodobi';
+$lang['btn_delete']            = 'Izbriši';
+$lang['btn_back']              = 'Nazaj';
+$lang['btn_backlink']          = 'Povratne povezave';
+$lang['btn_subscribe']         = 'Urejanje naročnin';
+$lang['btn_profile']           = 'Posodobi profil';
+$lang['btn_reset']             = 'Ponastavi';
+$lang['btn_resendpwd']         = 'Nastavi novo geslo';
+$lang['btn_draft']             = 'Uredi osnutek';
+$lang['btn_recover']           = 'Obnovi osnutek';
+$lang['btn_draftdel']          = 'Izbriši osnutek';
+$lang['btn_revert']            = 'Povrni';
+$lang['btn_register']          = 'Registracija';
+$lang['btn_apply']             = 'Uveljavi';
+$lang['btn_media']             = 'Urejevalnik predstavnih vsebin';
+$lang['btn_deleteuser']        = 'Odstrani račun';
+$lang['btn_img_backto']        = 'Nazaj na %s';
+$lang['btn_mediaManager']      = 'Poglej v urejevalniku predstavnih vsebin';
+$lang['loggedinas']            = 'Prijava kot:';
+$lang['user']                  = 'Uporabniško ime';
+$lang['pass']                  = 'Geslo';
+$lang['newpass']               = 'Novo geslo';
+$lang['oldpass']               = 'Potrdi trenutno geslo';
+$lang['passchk']               = 'Ponovi novo geslo';
+$lang['remember']              = 'Zapomni si me';
+$lang['fullname']              = 'Pravo ime';
+$lang['email']                 = 'Elektronski naslov';
+$lang['profile']               = 'Uporabniški profil';
+$lang['badlogin']              = 'Uporabniško ime ali geslo je napačno.';
+$lang['badpassconfirm']        = 'Napaka! Geslo ni pravo.';
+$lang['minoredit']             = 'Manjše spremembe';
+$lang['draftdate']             = 'Samodejno shranjevanje osnutka je omogočeno';
+$lang['nosecedit']             = 'Stran je bila v vmesnem času spremenjena. Podatki strani so bili zastareli, zato se je celotna vsebina naložila znova.';
+$lang['regmissing']            = 'Izpolniti je treba vsa polja.';
+$lang['reguexists']            = 'Uporabnik s tem imenom že obstaja.';
+$lang['regsuccess']            = 'Uporabniški račun je uspešno ustvarjen. Geslo je bilo poslano na naveden elektronski naslov.';
+$lang['regsuccess2']           = 'Uporabniški račun je uspešno ustvarjen.';
+$lang['regmailfail']           = 'Videti je, da je prišlo do napake med pošiljanjem gesla. Stopite v stik s skrbnikom sistema!';
+$lang['regbadmail']            = 'Videti je, da je naveden elektronski naslov neveljaven - v kolikor je to napaka, stopite v stik s skrbnikom sistema.';
+$lang['regbadpass']            = 'Gesli nista enaki. Poskusite znova.';
+$lang['regpwmail']             = 'Geslo za DokuWiki';
+$lang['reghere']               = 'Nimate še računa? Vpišite se za nov račun.';
+$lang['profna']                = 'DokuWiki ne podpira spreminjanja profila.';
+$lang['profnochange']          = 'Brez sprememb.';
+$lang['profnoempty']           = 'Prazno polje elektronskega naslova ali imena ni dovoljeno.';
+$lang['profchanged']           = 'Uporabniški profil je uspešno posodobljen.';
+$lang['profnodelete']          = 'Ni omogočena podpora za brisanje uporabnikov.';
+$lang['profdeleteuser']        = 'Izbriši račun';
+$lang['profdeleted']           = 'Uporabniški račun je izbrisan.';
+$lang['profconfdeletemissing'] = 'Potrditveno okno ni označeno';
+$lang['pwdforget']             = 'Ali ste pozabili geslo? Pridobite si novo geslo.';
+$lang['resendna']              = 'DokuWiki ne podpira možnosti ponovnega pošiljanja gesel.';
+$lang['resendpwd']             = 'Nastavi novo geslo za';
+$lang['resendpwdmissing']      = 'Izpolniti je treba vsa polja.';
+$lang['resendpwdnouser']       = 'Podanega uporabniškega imena v podatkovni zbirki ni mogoče najti.';
+$lang['resendpwdbadauth']      = 'Koda za overitev ni prava. Prepričajte se, da ste uporabili celotno povezavo za potrditev.';
+$lang['resendpwdconfirm']      = 'Povezava za potrditev računa je bila poslana na elektronski naslov.';
+$lang['resendpwdsuccess']      = 'Novo geslo je bilo poslano na elektronski naslov.';
+$lang['license']               = 'V kolikor ni posebej določeno, je vsebina Wiki strani objavljena pod pogoji dovoljenja:';
+$lang['licenseok']             = 'Opomba: z urejanjem vsebine strani, se strinjate z objavo pod pogoji dovoljenja:';
+$lang['searchmedia']           = 'Poišči ime datoteke:';
+$lang['searchmedia_in']        = 'Poišči v %s';
+$lang['txt_upload']            = 'Izberite datoteko za pošiljanje:';
+$lang['txt_filename']          = 'Pošlji z imenom (izborno):';
+$lang['txt_overwrt']           = 'Prepiši obstoječo datoteko';
+$lang['lockedby']              = 'Trenutno je zaklenjeno s strani:';
+$lang['lockexpire']            = 'Zaklep preteče ob:';
+$lang['js']['willexpire']      = 'Zaklep za urejevanje bo pretekel čez eno minuto.\nV izogib sporom, uporabite predogled, da se merilnik časa za zaklep ponastavi.';
+$lang['js']['notsavedyet']     = 'Neshranjene spremembe bodo izgubljene.';
+$lang['js']['searchmedia']     = 'Poišči datoteke';
+$lang['js']['keepopen']        = 'Od izbiri ohrani okno odprto';
+$lang['js']['hidedetails']     = 'Skrij podrobnosti';
+$lang['js']['mediatitle']      = 'Nastavitve povezave';
+$lang['js']['mediadisplay']    = 'Vrsta povezave';
+$lang['js']['mediaalign']      = 'Poravnava';
+$lang['js']['mediasize']       = 'Velikost slike';
+$lang['js']['mediatarget']     = 'Mesto povezave';
+$lang['js']['mediaclose']      = 'Zapri';
+$lang['js']['mediainsert']     = 'Vstavi';
+$lang['js']['mediadisplayimg'] = 'Pokaži sliko.';
+$lang['js']['mediadisplaylnk'] = 'Pokaži le povezavo.';
+$lang['js']['mediasmall']      = 'Majhna različica';
+$lang['js']['mediamedium']     = 'Srednja različica';
+$lang['js']['medialarge']      = 'Velika različica';
+$lang['js']['mediaoriginal']   = 'Izvorna različica';
+$lang['js']['medialnk']        = 'Povezava na strani podrobnosti';
+$lang['js']['mediadirect']     = 'Neposredna povezava do izvorne različice';
+$lang['js']['medianolnk']      = 'Brez povezave';
+$lang['js']['medianolink']     = 'Ne poveži s sliko';
+$lang['js']['medialeft']       = 'Poravnaj sliko na levo.';
+$lang['js']['mediaright']      = 'Poravnaj sliko na desno.';
+$lang['js']['mediacenter']     = 'Poravnaj sliko na sredini.';
+$lang['js']['medianoalign']    = 'Ne uporabi poravnave.';
+$lang['js']['nosmblinks']      = 'Povezovanje do souporabnih datotek sistema Windows deluje le pri uporabi brskalnika Microsoft Internet Explorer. Povezavo je mogoče kopirati ročno.';
+$lang['js']['linkwiz']         = 'Čarovnik za povezave';
+$lang['js']['linkto']          = 'Poveži na:';
+$lang['js']['del_confirm']     = 'Ali naj se res izbrišejo izbrani predmeti?';
+$lang['js']['restore_confirm'] = 'Ali naj se koda obnovi na to različico?';
+$lang['js']['media_diff']      = 'Razlike:';
+$lang['js']['media_diff_both'] = 'Eno ob drugem';
+$lang['js']['media_diff_opacity'] = 'Prosojno';
+$lang['js']['media_select']    = 'Izbor datotek ...';
+$lang['js']['media_upload_btn'] = 'Naloži';
+$lang['js']['media_done_btn']  = 'Končano';
+$lang['js']['media_drop']      = 'Spusti datoteke za nalaganje.';
+$lang['js']['media_cancel']    = 'odstrani';
+$lang['js']['media_overwrt']   = 'Prepiši obstoječe datoteke';
+$lang['rssfailed']             = 'Prišlo je do napake med pridobivanjem vira: ';
+$lang['nothingfound']          = 'Ni najdenih predmetov.';
+$lang['mediaselect']           = 'Predstavne datoteke';
+$lang['uploadsucc']            = 'Pošiljanje je bilo uspešno končano.';
+$lang['uploadfail']            = 'Pošiljanje je spodletelo. Morda so uporabljena neustrezna dovoljenja.';
+$lang['uploadwrong']           = 'Pošiljanje je zavrnjeno. Uporabljena pripona datoteke je prepovedana.';
+$lang['uploadexist']           = 'Datoteka že obstaja. Ni sprememb.';
+$lang['uploadbadcontent']      = 'Poslana datoteka se ne sklada s pripono (%s) datoteke.';
+$lang['uploadspam']            = 'Pošiljanje je bilo ustavljeno na podlagi zapisa na črnem seznamu neželenih datotek.';
+$lang['uploadxss']             = 'Pošiljanje je zaustavljeno zaradi morebitne zlonamerne vsebine.';
+$lang['uploadsize']            = 'poslana datoteka prevelika (največja dovoljena velikost je %s).';
+$lang['deletesucc']            = 'Datoteka "%s" je izbrisana.';
+$lang['deletefail']            = 'Datoteke "%s" ni mogoče izbrisati - preverite uporabniška dovoljenja.';
+$lang['mediainuse']            = 'Datoteka "%s" ni izbrisana - datoteka je še vedno v uporabi.';
+$lang['namespaces']            = 'Imenski prostori';
+$lang['mediafiles']            = 'Datoteke, ki so na voljo v';
+$lang['accessdenied']          = 'Za ogled te strani so zahtevana posebna dovoljenja.';
+$lang['mediausage']            = 'Za navajanje datoteke je treba uporabiti navedeno skladnjo:';
+$lang['mediaview']             = 'Pogled izvorne datoteke';
+$lang['mediaroot']             = 'koren';
+$lang['mediaupload']           = 'Pošiljanje datoteke v trenutni imenski prostor. Za ustvarjanje novih imenskih prostorov, jih pripnite k imenu datoteke navedene pri vnosnem polju "Naloži kot" in jih ločite z dvopičjem.';
+$lang['mediaextchange']        = 'Pripona datoteke je spremenjena iz .%s v .%s!';
+$lang['reference']             = 'Sklic za';
+$lang['ref_inuse']             = 'Datoteke ni mogoče izbrisati, saj je še vedno povezana s stranmi:';
+$lang['ref_hidden']            = 'Nekaj sklicev je navedenih na straneh, do katerih s trenutnimi dovoljenji ni mogoč dostop.';
+$lang['hits']                  = 'Zadetki';
+$lang['quickhits']             = 'Ujemanje imen strani';
+$lang['toc']                   = 'Kazalo';
+$lang['current']               = 'Trenutna';
+$lang['yours']                 = 'Vaša različica';
+$lang['diff']                  = 'Pokaži razlike s trenutno različico';
+$lang['diff2']                 = 'Pokaži razlike med izbranimi različicami.';
+$lang['difflink']              = 'Poveži s tem pogledom primerjave.';
+$lang['diff_type']             = 'Razlike:';
+$lang['diff_inline']           = 'V besedilu';
+$lang['diff_side']             = 'Eno ob drugem';
+$lang['diffprevrev']           = 'Prejšnja revizija';
+$lang['diffnextrev']           = 'Naslednja revizija';
+$lang['difflastrev']           = 'Zadnja revizija';
+$lang['line']                  = 'Vrstica';
+$lang['breadcrumb']            = 'Sled:';
+$lang['youarehere']            = 'Trenutno dejavna stran:';
+$lang['lastmod']               = 'Zadnja sprememba:';
+$lang['by']                    = 'uporabnika';
+$lang['deleted']               = 'odstranjena';
+$lang['created']               = 'ustvarjena';
+$lang['restored']              = 'povrnjena stara različica (%s)';
+$lang['external_edit']         = 'urejanje v zunanjem urejevalniku';
+$lang['summary']               = 'Povzetek urejanja';
+$lang['noflash']               = 'Za prikaz vsebine je treba namestiti <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a>';
+$lang['download']              = 'Naloži izrezek';
+$lang['tools']                 = 'Orodja';
+$lang['user_tools']            = 'Uporabniška orodja';
+$lang['site_tools']            = 'Orodja spletišča';
+$lang['page_tools']            = 'Orodja strani';
+$lang['skip_to_content']       = 'preskoči na vsebino';
+$lang['sidebar']               = 'Stranska vrstica';
+$lang['mail_newpage']          = '[DokuWiki] stran dodana:';
+$lang['mail_changed']          = '[DokuWiki] stran spremenjena:';
+$lang['mail_subscribe_list']   = 'strani s spremenjenim imenom:';
+$lang['mail_new_user']         = 'nov uporabnik:';
+$lang['mail_upload']           = 'naložena datoteka:';
+$lang['changes_type']          = 'Poglej spremembe';
+$lang['pages_changes']         = 'Strani';
+$lang['media_changes']         = 'Predstavne datoteke';
+$lang['both_changes']          = 'Strani in predstavne datoteke';
+$lang['qb_bold']               = 'Krepko besedilo';
+$lang['qb_italic']             = 'Ležeče besedilo';
+$lang['qb_underl']             = 'Podčrtano besedilo';
+$lang['qb_code']               = 'Oznaka kode';
+$lang['qb_strike']             = 'Prečrtano besedilo';
+$lang['qb_h1']                 = 'Naslov prve ravni';
+$lang['qb_h2']                 = 'Naslov druge ravni';
+$lang['qb_h3']                 = 'Naslov tretje ravni';
+$lang['qb_h4']                 = 'Naslov četrte ravni';
+$lang['qb_h5']                 = 'Naslov pete ravni';
+$lang['qb_h']                  = 'Naslov';
+$lang['qb_hs']                 = 'Izberi naslov';
+$lang['qb_hplus']              = 'Naslov na višji ravni';
+$lang['qb_hminus']             = 'Naslov na nižji ravni';
+$lang['qb_hequal']             = 'Naslov na isti ravni';
+$lang['qb_link']               = 'Notranja povezava';
+$lang['qb_extlink']            = 'Zunanja povezava';
+$lang['qb_hr']                 = 'Vodoravna črta';
+$lang['qb_ol']                 = 'Številčna oznaka predmeta';
+$lang['qb_ul']                 = 'Vrstična oznaka predmeta';
+$lang['qb_media']              = 'Dodajanje slik in drugih datotek';
+$lang['qb_sig']                = 'Vstavi podpis';
+$lang['qb_smileys']            = 'Smeški';
+$lang['qb_chars']              = 'Posebni znaki';
+$lang['upperns']               = 'skoči na nadrejeni imenski prostor';
+$lang['metaedit']              = 'Uredi metapodatke';
+$lang['metasaveerr']           = 'Zapisovanje metapodatkov je spodletelo';
+$lang['metasaveok']            = 'Metapodatki so shranjeni';
+$lang['img_title']             = 'Naslov:';
+$lang['img_caption']           = 'Opis:';
+$lang['img_date']              = 'Datum:';
+$lang['img_fname']             = 'Ime datoteke:';
+$lang['img_fsize']             = 'Velikost:';
+$lang['img_artist']            = 'Fotograf:';
+$lang['img_copyr']             = 'Avtorska pravica:';
+$lang['img_format']            = 'Zapis:';
+$lang['img_camera']            = 'Fotoaparat:';
+$lang['img_keywords']          = 'Ključne besede:';
+$lang['img_width']             = 'Širina:';
+$lang['img_height']            = 'Višina:';
+$lang['subscr_subscribe_success'] = 'Uporabniški račun %s je dodan na seznam naročnin na %s';
+$lang['subscr_subscribe_error'] = 'Napaka med dodajanjem %s na seznam naročnin na %s';
+$lang['subscr_subscribe_noaddress'] = 'S trenutnimi prijavnimi podatki ni povezanega elektronskega naslova, zato uporabniškega računa ni mogoče dodati na seznam naročnikov.';
+$lang['subscr_unsubscribe_success'] = 'Uporabniški račun %s je odstranjen s seznama naročnin na %s';
+$lang['subscr_unsubscribe_error'] = 'Napaka med odstranjevanjem %s s seznama naročnin na %s';
+$lang['subscr_already_subscribed'] = '%s je že naročen na %s';
+$lang['subscr_not_subscribed'] = '%s ni naročen na %s';
+$lang['subscr_m_not_subscribed'] = 'Trenutni uporabniški račun nima prijavljene naročnine na trenutno stran ali imenski prostor.';
+$lang['subscr_m_new_header']   = 'Naročanje';
+$lang['subscr_m_current_header'] = 'Trenutne naročnine';
+$lang['subscr_m_unsubscribe']  = 'Prekliči naročnino';
+$lang['subscr_m_subscribe']    = 'Prijavi naročnino';
+$lang['subscr_m_receive']      = 'Prejmi';
+$lang['subscr_style_every']    = 'elektronsko sporočilo ob vsaki spremembi';
+$lang['subscr_style_digest']   = 'strnjeno elektronsko sporočilo sprememb za vsako stran (vsakih %.2f dni)';
+$lang['subscr_style_list']     = 'seznam spremenjenih strani od zadnjega elektronskega sporočila (vsakih %.2f dni)';
+$lang['authtempfail']          = 'Potrditev uporabnika je trenutno nedostopna. Stopite v stik s skrbnikom sistema wiki.';
+$lang['i_chooselang']          = 'Izberite jezik';
+$lang['i_installer']           = 'DokuWiki namestitev';
+$lang['i_wikiname']            = 'Ime Wiki spletišča';
+$lang['i_enableacl']           = 'Omogoči ACL (priporočeno)';
+$lang['i_superuser']           = 'Skrbnik';
+$lang['i_problems']            = 'Namestilnik je naletel na težave, ki so izpisane spodaj. Namestitve ni mogoče nadaljevati, dokler težave ne bodo odpravljene.';
+$lang['i_modified']            = 'Iz varnostnih razlogov skript deluje le v novi in neprilagojeni namestitvi sistema DokuWiki. Postopek namestitve je treba začeti znova ali pa sistem namestiti ročno s pomočjo <a href="http://dokuwiki.org/install">navodil nameščanja Dokuwiki</a>.';
+$lang['i_funcna']              = 'Funkcija PHP <code>%s</code> ni na voljo. Morda je možnost na strežniku zaradi varnostnih razlogov onemogočena.';
+$lang['i_phpver']              = 'Različica PHP <code>%s</code> je nižja od zahtevane različice <code>%s</code>. Pred nadaljevanjem je treba posodobiti namestitev PHP.';
+$lang['i_permfail']            = 'Predmet <code>%s</code> ni zapisljiv. Zahtevana je sprememba dovoljenj za to mapo.';
+$lang['i_confexists']          = 'Predmet <code>%s</code> že obstaja.';
+$lang['i_writeerr']            = 'Ni mogoče ustvariti predmeta <code>%s</code>. Preveriti je treba dovoljenja datotek in map in nato ustvariti datoteko ročno.';
+$lang['i_badhash']             = 'nepoznana ali spremenjena datoteka dokuwiki.php (razpršilo=<code>%s</code>)';
+$lang['i_badval']              = '<code>%s</code> - neveljavna ali prazna vrednost';
+$lang['i_success']             = 'Nastavitev je uspešno končana. Datoteko install.php lahko sedaj izbrišete. Nadaljujte v <a href="doku.php?id=wiki:welcome">novi DokuWiki</a>.';
+$lang['i_failure']             = 'Med zapisovanjem nastavitvenih datotek je prišlo do napak. Preden lahko uporabite vaš <a href="doku.php?id=wiki:welcome">DokuWiki</a>, jih je treba odpraviti.';
+$lang['i_policy']              = 'Začetna določila ACL';
+$lang['i_pol0']                = 'Odprt Wiki (branje, zapis, nalaganje datotek je javno za vse)';
+$lang['i_pol1']                = 'Javni Wiki (branje za vse, zapis in nalaganje datotek za prijavljene uporabnike)';
+$lang['i_pol2']                = 'Zaprt Wiki (berejo in urejajo lahko le prijavljeni uporabniki)';
+$lang['i_allowreg']            = 'Dovoli uporabnikom vpis';
+$lang['i_retry']               = 'Ponovni poskus';
+$lang['i_license']             = 'Izbor dovoljenja objave vsebine:';
+$lang['i_license_none']        = 'Ne pokaži podrobnosti dovoljenja.';
+$lang['i_pop_field']           = 'Prosimo pomagajte nam izboljšati DokuWiki izkušnjo:';
+$lang['i_pop_label']           = 'Enkrat na mesec pošlji anonimne uporabniške podatke DokuWiki razvijalcem';
+$lang['recent_global']         = 'Trenutno so prikazane spremembe znotraj imenskega prostora <b>%s</b>. Mogoče si je ogledati tudi spremembe <a href="%s">celotnega sistema Wiki</a>.';
+$lang['years']                 = '%d let nazaj';
+$lang['months']                = '%d mesecev nazaj';
+$lang['weeks']                 = '%d tednov nazaj';
+$lang['days']                  = '%d dni nazaj';
+$lang['hours']                 = '%d ur nazaj';
+$lang['minutes']               = '%d minut nazaj';
+$lang['seconds']               = '%d sekund nazaj';
+$lang['wordblock']             = 'Spremembe niso shranjene, ker je v vsebini navedeno neželeno besedilo (spam).';
+$lang['media_uploadtab']       = 'Naloži';
+$lang['media_searchtab']       = 'Poišči';
+$lang['media_file']            = 'Datoteka';
+$lang['media_viewtab']         = 'Pogled';
+$lang['media_edittab']         = 'Uredi';
+$lang['media_historytab']      = 'Zgodovina';
+$lang['media_list_thumbs']     = 'Sličice';
+$lang['media_list_rows']       = 'Vrstice';
+$lang['media_sort_name']       = 'Ime';
+$lang['media_sort_date']       = 'Datum';
+$lang['media_namespaces']      = 'Izbor imenskega prostora';
+$lang['media_files']           = 'Datoteke v %s';
+$lang['media_upload']          = 'Naloži v %s';
+$lang['media_search']          = 'Poišči v %s';
+$lang['media_view']            = '%s';
+$lang['media_viewold']         = '%s pri %s';
+$lang['media_edit']            = 'Uredi %s';
+$lang['media_history']         = 'Zgodovina %s';
+$lang['media_meta_edited']     = 'metapodatki so urejeni';
+$lang['media_perm_read']       = 'Ni ustreznih dovoljenj za branje datotek.';
+$lang['media_perm_upload']     = 'Ni ustreznih dovoljenj za nalaganje datotek.';
+$lang['media_update']          = 'Naloži novo različico';
+$lang['media_restore']         = 'Obnovi to različico';
+$lang['currentns']             = 'Trenutni imenski prostor';
+$lang['searchresult']          = 'Rezultati iskanja';
+$lang['plainhtml']             = 'Zapis HTML';
+$lang['wikimarkup']            = 'Oblikovni jezik Wiki';
+$lang['email_signature_text']  = 'Sporočilo je samodejno ustvarjeno na spletišču
+@DOKUWIKIURL@';
diff --git a/wiki/inc/lang/sl/locked.txt b/wiki/inc/lang/sl/locked.txt
new file mode 100644
index 0000000..cc693d3
--- /dev/null
+++ b/wiki/inc/lang/sl/locked.txt
@@ -0,0 +1,3 @@
+====== Stran je zaklenjena ======
+
+Stran je zaklenjena za urejanje. Počakati je treba, da zaklep strani poteče.
diff --git a/wiki/inc/lang/sl/login.txt b/wiki/inc/lang/sl/login.txt
new file mode 100644
index 0000000..eeae0c9
--- /dev/null
+++ b/wiki/inc/lang/sl/login.txt
@@ -0,0 +1,3 @@
+====== Prijava ======
+
+Niste prijavljeni! Spodaj vnesite ustrezne podatke in se prijavite. Prijaviti se je mogoče le, če so omogočeni piškotki.
diff --git a/wiki/inc/lang/sl/mailtext.txt b/wiki/inc/lang/sl/mailtext.txt
new file mode 100644
index 0000000..9b33373
--- /dev/null
+++ b/wiki/inc/lang/sl/mailtext.txt
@@ -0,0 +1,12 @@
+Stran na vašem DokuWiki je bila dodana ali spremenjena. Podrobnosti:
+
+Datum            : @DATE@
+Brskalnik        : @BROWSER@
+Naslov IP        : @IPADDRESS@
+Ime gostitelja   : @HOSTNAME@
+Stara različica  : @OLDPAGE@
+Nova različica   : @NEWPAGE@
+Povzetek urejanja: @SUMMARY@
+Uporabnik        : @USER@
+
+@DIFF@
diff --git a/wiki/inc/lang/sl/newpage.txt b/wiki/inc/lang/sl/newpage.txt
new file mode 100644
index 0000000..2f11bbf
--- /dev/null
+++ b/wiki/inc/lang/sl/newpage.txt
@@ -0,0 +1,3 @@
+====== Stran še ne obstaja ======
+
+Sledili ste povezavi na stran, ki še ne obstaja. Stran je mogoče ustvariti preko povezave ''Ustvari stran''.
diff --git a/wiki/inc/lang/sl/norev.txt b/wiki/inc/lang/sl/norev.txt
new file mode 100644
index 0000000..adaa22d
--- /dev/null
+++ b/wiki/inc/lang/sl/norev.txt
@@ -0,0 +1,3 @@
+====== Neobstoječa različica strani ======
+
+Zahtevana različica strani ne obstaja. Uporabite gumb ''Stare različice'' za izpis seznama starih različic tega dokumenta.
diff --git a/wiki/inc/lang/sl/password.txt b/wiki/inc/lang/sl/password.txt
new file mode 100644
index 0000000..d0e1f69
--- /dev/null
+++ b/wiki/inc/lang/sl/password.txt
@@ -0,0 +1,6 @@
+Pozdravljeni, @FULLNAME@!
+
+Spodaj so navedeni podatki za @TITLE@ na wiki spletišču @DOKUWIKIURL@
+
+Uporabniško ime: @LOGIN@
+Geslo          : @PASSWORD@
diff --git a/wiki/inc/lang/sl/preview.txt b/wiki/inc/lang/sl/preview.txt
new file mode 100644
index 0000000..c49de66
--- /dev/null
+++ b/wiki/inc/lang/sl/preview.txt
@@ -0,0 +1,3 @@
+====== Predogled ======
+
+Prikazan je predogled strani. Stran še ni shranjena!
diff --git a/wiki/inc/lang/sl/pwconfirm.txt b/wiki/inc/lang/sl/pwconfirm.txt
new file mode 100644
index 0000000..33f4787
--- /dev/null
+++ b/wiki/inc/lang/sl/pwconfirm.txt
@@ -0,0 +1,8 @@
+Pozdravljeni, @FULLNAME@!
+
+S podatki vašega imena je bila poslana zahteva za pridobitev novega gesla za uporabniško ime @TITLE@ na wiki spletišču @DOKUWIKIURL@.
+
+ - V kolikor novega gesla niste zahtevali, prezrite to sporočilo.
+ - Za potrditev zahteve za pridobitev novega gesla, kliknite spodnjo povezavo.
+
+@CONFIRM@
diff --git a/wiki/inc/lang/sl/read.txt b/wiki/inc/lang/sl/read.txt
new file mode 100644
index 0000000..5ba9a2e
--- /dev/null
+++ b/wiki/inc/lang/sl/read.txt
@@ -0,0 +1,2 @@
+Stran je odprta z dovoljenji le za branje. Dovoljeno je ogledati si izvorno kodo strani, vsebine pa ni mogoče spreminjati. Za več podrobnosti stopite v stik s skrbnikom sistema.
+
diff --git a/wiki/inc/lang/sl/recent.txt b/wiki/inc/lang/sl/recent.txt
new file mode 100644
index 0000000..282a492
--- /dev/null
+++ b/wiki/inc/lang/sl/recent.txt
@@ -0,0 +1,3 @@
+====== Nedavne spremembe ======
+
+Izpisane wiki strani so bile nedavno spremenjene.
diff --git a/wiki/inc/lang/sl/register.txt b/wiki/inc/lang/sl/register.txt
new file mode 100644
index 0000000..f1b22f9
--- /dev/null
+++ b/wiki/inc/lang/sl/register.txt
@@ -0,0 +1,3 @@
+====== Vpis novega računa ======
+
+V spodnji obrazec je treba vnesti vse zahtevane podatke za ustvarjanje novega računa. Vnesti je treba veljaven **elektronski naslov**, na katerega bo poslano geslo. Uporabniško ime mora biti veljavno [[doku>pagename|ime strani]].
diff --git a/wiki/inc/lang/sl/registermail.txt b/wiki/inc/lang/sl/registermail.txt
new file mode 100644
index 0000000..255eb62
--- /dev/null
+++ b/wiki/inc/lang/sl/registermail.txt
@@ -0,0 +1,11 @@
+Nov uporabniški račun je uspešno vpisan.
+Podatki računa:
+
+Uporabniško ime   : @NEWUSER@
+Polno ime         : @NEWNAME@
+Elektronski naslov: @NEWEMAIL@
+
+Datum             : @DATE@
+Brskalnik         : @BROWSER@
+Naslov IP         : @IPADDRESS@
+Ime gostitelja    : @HOSTNAME@
diff --git a/wiki/inc/lang/sl/resendpwd.txt b/wiki/inc/lang/sl/resendpwd.txt
new file mode 100644
index 0000000..8a1e614
--- /dev/null
+++ b/wiki/inc/lang/sl/resendpwd.txt
@@ -0,0 +1,3 @@
+====== Pošiljanje novega gesla ======
+
+Za pridobitev novega gesla, vnesite vaše uporabniško ime ustrezno polje spodnjega obrazca. Na naveden elektronski naslov bo poslano sporočilo v katerem bo navedena povezava do strani za overjanje istovetnosti uporabnika.
diff --git a/wiki/inc/lang/sl/resetpwd.txt b/wiki/inc/lang/sl/resetpwd.txt
new file mode 100644
index 0000000..c2a81ab
--- /dev/null
+++ b/wiki/inc/lang/sl/resetpwd.txt
@@ -0,0 +1 @@
+====== Nastavitev novega gesla ======<br><br>Vnesite novo geslo za račun Wiki. 
\ No newline at end of file
diff --git a/wiki/inc/lang/sl/revisions.txt b/wiki/inc/lang/sl/revisions.txt
new file mode 100644
index 0000000..86ede9d
--- /dev/null
+++ b/wiki/inc/lang/sl/revisions.txt
@@ -0,0 +1,3 @@
+====== Stare različice ======
+
+Prikazana je stara različica tega dokumenta. Stran je mogoče povrniti na starejšo različico tako, da stran izberete, pritisnete na povezavo ''Uredi stran'' in stran nato shranite.
diff --git a/wiki/inc/lang/sl/searchpage.txt b/wiki/inc/lang/sl/searchpage.txt
new file mode 100644
index 0000000..d19d5e2
--- /dev/null
+++ b/wiki/inc/lang/sl/searchpage.txt
@@ -0,0 +1,4 @@
+====== Iskanje ======
+
+Spodaj so izpisani rezultati iskanja. @CREATEPAGEINFO@
+
diff --git a/wiki/inc/lang/sl/showrev.txt b/wiki/inc/lang/sl/showrev.txt
new file mode 100644
index 0000000..8383392
--- /dev/null
+++ b/wiki/inc/lang/sl/showrev.txt
@@ -0,0 +1,2 @@
+**Stara različica tega dokumenta!**
+----
diff --git a/wiki/inc/lang/sl/stopwords.txt b/wiki/inc/lang/sl/stopwords.txt
new file mode 100644
index 0000000..8eed2da
--- /dev/null
+++ b/wiki/inc/lang/sl/stopwords.txt
@@ -0,0 +1,18 @@
+# To je seznam besed, ki jih ustvarjalnik kazala prezre. Seznam je sestavljen iz
+# besede, ki so zapisane vsaka v svoji vrstici. Datoteka mora biti zapisana s končnim
+# UNIX znakom vrstice. Besede krajše od treh znakov so iz kazala izločene samodejno
+# zaradi preglednosti. Seznam se s bo s časom spreminjal in dopolnjeval.
+moja
+moje
+moji
+mojo
+njegovi
+njegove
+njegovo
+njeno
+njeni
+njene
+njihova
+njihove
+njihovi
+njihovo
diff --git a/wiki/inc/lang/sl/subscr_digest.txt b/wiki/inc/lang/sl/subscr_digest.txt
new file mode 100644
index 0000000..5da0042
--- /dev/null
+++ b/wiki/inc/lang/sl/subscr_digest.txt
@@ -0,0 +1,16 @@
+Pozdravljeni!
+
+Strani v imenskem prostoru @PAGE@ wiki spletišča @TITLE@ so spremenjene.
+Podrobnosti sprememb so navedene spodaj.
+
+------------------------------------------------
+@DIFF@
+------------------------------------------------
+
+Stara različica: @OLDPAGE@
+Nova različica : @NEWPAGE@
+
+Za odjavo prejemanja podrobnosti sprememb, se je treba prijaviti na spletišče
+@DOKUWIKIURL@ in med možnostmi naročanja
+@SUBSCRIBE@
+odjaviti prejemanje poročil sprememb strani ali imenskega prostora.
diff --git a/wiki/inc/lang/sl/subscr_form.txt b/wiki/inc/lang/sl/subscr_form.txt
new file mode 100644
index 0000000..46be8c9
--- /dev/null
+++ b/wiki/inc/lang/sl/subscr_form.txt
@@ -0,0 +1,3 @@
+===== Urejanje naročnin ====
+
+Ta stran vam omogoča urejanje vaših naročnin za trenutno stran in imenski prostor.
\ No newline at end of file
diff --git a/wiki/inc/lang/sl/subscr_list.txt b/wiki/inc/lang/sl/subscr_list.txt
new file mode 100644
index 0000000..914ae15
--- /dev/null
+++ b/wiki/inc/lang/sl/subscr_list.txt
@@ -0,0 +1,13 @@
+Pozdravljeni!
+
+Strani v imenskem prostoru @PAGE@ wiki spletišča @TITLE@ so spremenjene.
+Podrobnosti sprememb so navedene spodaj.
+
+------------------------------------------------
+@DIFF@
+------------------------------------------------
+
+Za odjavo prejemanja podrobnosti sprememb, se je treba prijaviti na spletišče
+@DOKUWIKIURL@ in med možnostmi naročanja
+@SUBSCRIBE@
+odjaviti prejemanje poročil sprememb strani ali imenskega prostora.
diff --git a/wiki/inc/lang/sl/subscr_single.txt b/wiki/inc/lang/sl/subscr_single.txt
new file mode 100644
index 0000000..4324b2d
--- /dev/null
+++ b/wiki/inc/lang/sl/subscr_single.txt
@@ -0,0 +1,19 @@
+Pozdravljeni!
+
+Stran @PAGE@ na spletišču Wiki @TITLE@ je spremenjena.
+Spremenjeno je:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Datum            : @DATE@
+Uporabnik        : @USER@
+Povzetek urejanja: @SUMMARY@
+Stara različica  : @OLDPAGE@
+Nova različica   : @NEWPAGE@
+
+Preklic obveščanja o spremembah strani je mogoče določiti
+na Wiki naslovu @DOKUWIKIURL@ in z obiskom @NEWPAGE@,
+kjer se je mogoče odjaviti od spremljanja strani ali
+imenskega prostora.
diff --git a/wiki/inc/lang/sl/updateprofile.txt b/wiki/inc/lang/sl/updateprofile.txt
new file mode 100644
index 0000000..5e939f2
--- /dev/null
+++ b/wiki/inc/lang/sl/updateprofile.txt
@@ -0,0 +1,3 @@
+===== Posodabljanje računa =====
+
+Posodobiti ali spremeniti je mogoče le nekatere podatke. Uporabniškega imena ni mogoče spremeniti.
\ No newline at end of file
diff --git a/wiki/inc/lang/sl/uploadmail.txt b/wiki/inc/lang/sl/uploadmail.txt
new file mode 100644
index 0000000..126ff2a
--- /dev/null
+++ b/wiki/inc/lang/sl/uploadmail.txt
@@ -0,0 +1,11 @@
+Datoteka je bila uspešno naložena na DokuWiki spletišče.
+Podrobnosti o datoteki:
+
+Datoteka  : @MEDIA@
+Datum     : @DATE@
+Brskalnik : @BROWSER@
+Naslov IP : @IPADDRESS@
+Ponudnik  : @HOSTNAME@
+Velikost  : @SIZE@
+Vrsta MIME: @MIME@
+Uporabnik : @USER@
diff --git a/wiki/inc/lang/sq/admin.txt b/wiki/inc/lang/sq/admin.txt
new file mode 100644
index 0000000..6edbf8a
--- /dev/null
+++ b/wiki/inc/lang/sq/admin.txt
@@ -0,0 +1,3 @@
+====== Administrimi ======
+
+Poshtë është një listë e punëve administrative të disponueshme në DokuWiki.
\ No newline at end of file
diff --git a/wiki/inc/lang/sq/adminplugins.txt b/wiki/inc/lang/sq/adminplugins.txt
new file mode 100644
index 0000000..f87626c
--- /dev/null
+++ b/wiki/inc/lang/sq/adminplugins.txt
@@ -0,0 +1 @@
+===== Plugin-e Shtesë =====
\ No newline at end of file
diff --git a/wiki/inc/lang/sq/backlinks.txt b/wiki/inc/lang/sq/backlinks.txt
new file mode 100644
index 0000000..b25df00
--- /dev/null
+++ b/wiki/inc/lang/sq/backlinks.txt
@@ -0,0 +1,3 @@
+====== Linke të kthyeshëm ======
+
+Kjo është një listë e faqeve që duket se lidhen mbrapsht te kjo faqe aktuale.
\ No newline at end of file
diff --git a/wiki/inc/lang/sq/conflict.txt b/wiki/inc/lang/sq/conflict.txt
new file mode 100644
index 0000000..9c6cc94
--- /dev/null
+++ b/wiki/inc/lang/sq/conflict.txt
@@ -0,0 +1,5 @@
+====== Ekziston një version më i ri ======
+
+Ekziston një version më i ri i dokumentit që ju redaktuat. Kjo ndodh kur një përdorues tjetër e ndryshoi dokumentin ndërkohë që ju po e redaktonit atë.
+
+Gjeni ndryshimet e treguara më poshtë dhe pastaj vendosni se kë version doni të mbani. Nëse zgjidhni "ruaj", versioni juaj do të ruhet. Klikon "fshi" për të mbajtur versioni aktual.
\ No newline at end of file
diff --git a/wiki/inc/lang/sq/denied.txt b/wiki/inc/lang/sq/denied.txt
new file mode 100644
index 0000000..60aa05e
--- /dev/null
+++ b/wiki/inc/lang/sq/denied.txt
@@ -0,0 +1,4 @@
+====== Leja Refuzohet ======
+
+Na vjen keq, ju nuk keni të drejta të mjaftueshme për të vazhduar.
+
diff --git a/wiki/inc/lang/sq/diff.txt b/wiki/inc/lang/sq/diff.txt
new file mode 100644
index 0000000..ab03a28
--- /dev/null
+++ b/wiki/inc/lang/sq/diff.txt
@@ -0,0 +1,3 @@
+====== Ndryshimet ======
+
+Kjo tregon ndryshimet midis dy versioneve të faqes.
\ No newline at end of file
diff --git a/wiki/inc/lang/sq/draft.txt b/wiki/inc/lang/sq/draft.txt
new file mode 100644
index 0000000..80634a7
--- /dev/null
+++ b/wiki/inc/lang/sq/draft.txt
@@ -0,0 +1,5 @@
+====== Skedari skicë u gjend ======
+
+Sesioni juaj i fundit i redaktimit në këtë faqe nuk përfundoi me sukses. DokuWiki ruajti automatikisht një skicë gjatë punës tuaj të cilën mund ta përdorni tani për të vazhduar redaktimin tuaj. Më poshtë mund të shihni të dhënat që janë ruajtur nga sesioni juaj i fundit.
+
+Ju lutem vendosni nëse doni të //rekuperoni// sesionin tuaj të humbur të redaktimit, //fshini// skicën e ruajtur automatikisht ose //dilni// nga proçesi i redaktimit.
\ No newline at end of file
diff --git a/wiki/inc/lang/sq/edit.txt b/wiki/inc/lang/sq/edit.txt
new file mode 100644
index 0000000..1f038ea
--- /dev/null
+++ b/wiki/inc/lang/sq/edit.txt
@@ -0,0 +1 @@
+Redaktoni faqen dhe shtypni "Ruaj". Shikoni [[wiki:syntax]] për sintaksën e Wiki-t. Nëse doni të provoni disa gjëra, mësoni të hidhni hapat e parë në [[playground:playground|playground]].
\ No newline at end of file
diff --git a/wiki/inc/lang/sq/editrev.txt b/wiki/inc/lang/sq/editrev.txt
new file mode 100644
index 0000000..08792ea
--- /dev/null
+++ b/wiki/inc/lang/sq/editrev.txt
@@ -0,0 +1,2 @@
+**Keni ngarkuar një rishikim të vjetër të dokumentit!** Nëse e ruani, do të krijoni një version të ri me këto të dhëna.
+----
\ No newline at end of file
diff --git a/wiki/inc/lang/sq/index.txt b/wiki/inc/lang/sq/index.txt
new file mode 100644
index 0000000..6daef1c
--- /dev/null
+++ b/wiki/inc/lang/sq/index.txt
@@ -0,0 +1,3 @@
+====== Index ======
+
+Ky është një index mbi të gjitha faqet e disponueshme të renditura sipas [[doku>namespaces|namespaces]].
\ No newline at end of file
diff --git a/wiki/inc/lang/sq/install.html b/wiki/inc/lang/sq/install.html
new file mode 100644
index 0000000..bad30b1
--- /dev/null
+++ b/wiki/inc/lang/sq/install.html
@@ -0,0 +1,8 @@
+<p>Kjo faqe ndihmon në instalimin dhe konfigurimin për herë të parë të <a href="http://dokuwiki.org">Dokuwiki-t</a>. Më shumë informacion mbi këtë installer gjendet në <a href="http://dokuwiki.org/installer">faqen e tij të dokumentimit</a>.</p>
+
+<p>Dokuwiki përdor skedarë të zakonshëm për ruajtjen e faqeve wiki dhe informacioneve të tjera të lidhura me ato faqe (psh imazhe, indekse kërkimi, rishikime të vjetra etj). Në mënyrë që të funksionojë me sukses DokuWiki <strong>duhet</strong> të ketë akses shkrimi mbi direktoritë që mbajnë këto skedarë. Ky installer nuk është në gjendje të vendosë leje mbi direktoritë. Kjo normalisht duhet bërë drejtpërdrejt nga një command shell ose nëse jeni duke përdorur hostimin, nëpërmjet FTP ose panelit të kontrollit të hostit (psh cPanel).</p>
+
+<p>Ky installer do të instalojë konfigurimin e DokuWiki-t tuaj
+për <abbr title="access control list">ACL</abbr>, që në këmbim lejon hyrje si administrator dhe akses të menusë së administrimit të DokuWiki-t për të instaluar plugin-e, menaxhuar përdoruesit, menaxhuar akses në faqet wiki dhe ndryshim të konfigurimeve. Nuk është e domosdoshme për DokuWiki-n të funksionojë, megjithatë do ta bëjë DokuWiki-n më të lehtë për tu administruar.</p>
+
+<p>Përduruesit me përvojë ose përdoruesit me kërkesa speciale për instalim duhet të përdorin këto linke për detaje mbi <a href="http://dokuwiki.org/install">instruksionet e instalimit</a> dhe <a href="http://dokuwiki.org/config">konfigurimeve</a>.</p>
\ No newline at end of file
diff --git a/wiki/inc/lang/sq/jquery.ui.datepicker.js b/wiki/inc/lang/sq/jquery.ui.datepicker.js
new file mode 100644
index 0000000..34fe66a
--- /dev/null
+++ b/wiki/inc/lang/sq/jquery.ui.datepicker.js
@@ -0,0 +1,37 @@
+/* Albanian initialisation for the jQuery UI date picker plugin. */
+/* Written by Flakron Bytyqi (flakron@gmail.com). */
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "../widgets/datepicker" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery.datepicker );
+	}
+}( function( datepicker ) {
+
+datepicker.regional.sq = {
+	closeText: "mbylle",
+	prevText: "&#x3C;mbrapa",
+	nextText: "Përpara&#x3E;",
+	currentText: "sot",
+	monthNames: [ "Janar","Shkurt","Mars","Prill","Maj","Qershor",
+	"Korrik","Gusht","Shtator","Tetor","Nëntor","Dhjetor" ],
+	monthNamesShort: [ "Jan","Shk","Mar","Pri","Maj","Qer",
+	"Kor","Gus","Sht","Tet","Nën","Dhj" ],
+	dayNames: [ "E Diel","E Hënë","E Martë","E Mërkurë","E Enjte","E Premte","E Shtune" ],
+	dayNamesShort: [ "Di","Hë","Ma","Më","En","Pr","Sh" ],
+	dayNamesMin: [ "Di","Hë","Ma","Më","En","Pr","Sh" ],
+	weekHeader: "Ja",
+	dateFormat: "dd.mm.yy",
+	firstDay: 1,
+	isRTL: false,
+	showMonthAfterYear: false,
+	yearSuffix: "" };
+datepicker.setDefaults( datepicker.regional.sq );
+
+return datepicker.regional.sq;
+
+} ) );
diff --git a/wiki/inc/lang/sq/lang.php b/wiki/inc/lang/sq/lang.php
new file mode 100644
index 0000000..5313ddd
--- /dev/null
+++ b/wiki/inc/lang/sq/lang.php
@@ -0,0 +1,236 @@
+<?php
+/**
+ * sq language file
+ *
+ * This file was initially built by fetching translations from other
+ * Wiki projects. See the @url lines below. Additional translations
+ * and fixes where done for DokuWiki by the people mentioned in the
+ * lines starting with @author
+ *
+ * @url http://svn.wikimedia.org/viewvc/mediawiki/trunk/phase3/languages/messages/MessagesSq.php?view=co
+ * @author Leonard Elezi <leonard.elezi@depinfo.info>
+ */
+$lang['encoding']              = 'utf-8';
+$lang['direction']             = 'ltr';
+$lang['doublequoteopening']    = '„';
+$lang['doublequoteclosing']    = '“';
+$lang['singlequoteopening']    = '‘';
+$lang['singlequoteclosing']    = '’';
+$lang['apostrophe']            = '\'';
+$lang['btn_edit']              = 'Redaktoni këtë faqe';
+$lang['btn_source']            = 'Trego kodin burim të faqes';
+$lang['btn_show']              = 'Trego faqen';
+$lang['btn_create']            = 'Krijo këtë faqe';
+$lang['btn_search']            = 'Kërko';
+$lang['btn_save']              = 'Ruaj';
+$lang['btn_preview']           = 'Shikim paraprak';
+$lang['btn_top']               = 'Kthehu ne krye';
+$lang['btn_newer']             = '<< më të hershme';
+$lang['btn_older']             = 'më të vonshme';
+$lang['btn_revs']              = 'Shqyrtime të vjetra';
+$lang['btn_recent']            = 'Ndryshime së fundmi';
+$lang['btn_upload']            = 'Ngarko';
+$lang['btn_cancel']            = 'Harroji';
+$lang['btn_index']             = 'Kreu';
+$lang['btn_secedit']           = 'Redaktoni';
+$lang['btn_login']             = 'Hyrje';
+$lang['btn_logout']            = 'Dalje';
+$lang['btn_admin']             = 'Admin';
+$lang['btn_update']            = 'Përditëso';
+$lang['btn_delete']            = 'Fshi';
+$lang['btn_back']              = 'Mbrapa';
+$lang['btn_backlink']          = 'Lidhjet këtu';
+$lang['btn_subscribe']         = 'Menaxho Abonimet';
+$lang['btn_profile']           = 'Përditëso Profilin';
+$lang['btn_reset']             = 'Rivendos';
+$lang['btn_draft']             = 'Redakto skicën';
+$lang['btn_recover']           = 'Rekupero skicën';
+$lang['btn_draftdel']          = 'Fshi skicën';
+$lang['btn_revert']            = 'Kthe si më parë';
+$lang['btn_register']          = 'Regjsitrohuni';
+$lang['loggedinas']            = 'Regjistruar si :';
+$lang['user']                  = 'Nofka e përdoruesit:';
+$lang['pass']                  = 'Fjalëkalimi';
+$lang['newpass']               = 'Fjalëkalim i ri';
+$lang['oldpass']               = 'Konfirmo fjalëkalimin aktual';
+$lang['passchk']               = 'Edhe një herë';
+$lang['remember']              = 'Më mbaj mend';
+$lang['fullname']              = 'Emri i vërtetë';
+$lang['email']                 = 'Adresa e email-it*';
+$lang['profile']               = 'Profili i përdoruesit';
+$lang['badlogin']              = 'Na vjen keq, emri ose fjalëkalimi është gabim.';
+$lang['minoredit']             = 'Ndryshime të Vogla';
+$lang['draftdate']             = 'Skica u ruajt automatikisht në';
+$lang['nosecedit']             = 'Faqja u ndryshua ndëwrkohë, informacioni i kwtij seksioni ishte i vjetër, u ngarkua faqja e tërë në vend të saj.';
+$lang['regmissing']            = 'Na vjen keq, duhet të plotësoni të gjitha fushat.';
+$lang['reguexists']            = 'Na vjen keq, ekziston një përdorues tjetër me të njëjtin emër.';
+$lang['regsuccess']            = 'Përdoruesi u regjistrua dhe fjalëkalimi u dërgua me email.';
+$lang['regsuccess2']           = 'Llogarija e Përdoruesit u krijua';
+$lang['regmailfail']           = 'Duket se ka ndodhur një gabim gjatë dërgimit të fjalëkalimit me e-mail. Ju lutemi kontaktoni administratorin!';
+$lang['regbadmail']            = 'Adresa email e dhënë nuk mund të pranohet sepse nuk duket e rregullt. Ju lutem fusni një adresë të rregullt ose boshatisni kutinë e shtypit.';
+$lang['regbadpass']            = 'Dy fjalëkalimet e dhëna nuk janë njësoj, ju lutemi provoni përsëri.';
+$lang['regpwmail']             = 'Fjalëkalimi juaj i DokuWiki-it.';
+$lang['reghere']               = 'Ende nuk keni llogari? Hap një';
+$lang['profna']                = 'Ky wiki nuk e lejon ndryshimin e profilit.';
+$lang['profnochange']          = 'Asnjë ndryshim, asgjë për të bërë.';
+$lang['profnoempty']           = 'Një emër bosh ose adresë email-i bosh nuk lejohet.';
+$lang['profchanged']           = 'Profili i përdoruesit u përditësua me sukses.';
+$lang['pwdforget']             = 'E harruat fjalëkalimin? Merni një të ri';
+$lang['resendna']              = 'Ky wiki nuk e lejon ridërgimin e fjalëkalimeve.';
+$lang['resendpwdmissing']      = 'Na vjen keq, duhet t\'i plotësoni të gjitha fushat.';
+$lang['resendpwdnouser']       = 'Na vjen keq, nuk mund ta gjejmë këtë përdorues në bazën tonë të të dhënave.';
+$lang['resendpwdbadauth']      = 'Na vjen keq, ky kod autorizimi nuk është i vlefshëm. Sigurohuni që përdoret linkun e plotë të konfirmimit.';
+$lang['resendpwdconfirm']      = 'U dërgua një link konfirmimi nëpërmjet eMail-it.';
+$lang['resendpwdsuccess']      = 'Fjalëkalimi juaj i ri u dërgua nëpërmjet eMail-it.';
+$lang['license']               = 'Përveç rasteve të përcaktuara, përmbajtja në këtë wiki është e liçnsuar nën liçensën e mëposhtme:';
+$lang['licenseok']             = 'Shënim: Duke redaktuar këtë faqe ju bini dakort të liçensoni përmbajtjen tuaj nën liçensën e mëposhtme:';
+$lang['searchmedia']           = 'Kërko emrin e skedarit:';
+$lang['searchmedia_in']        = 'Kërko në %s';
+$lang['txt_upload']            = 'Zgjidh skedarin për ngarkim:';
+$lang['txt_filename']          = 'Ngarko si (alternative):';
+$lang['txt_overwrt']           = 'Zëvendëso skedarin ekzistues';
+$lang['lockedby']              = 'Kyçur momentalisht nga:';
+$lang['lockexpire']            = 'Kyçi skadon në:';
+$lang['js']['willexpire']            = 'Kyçi juaj për redaktimin e kësaj faqeje është duke skaduar.\nPër të shmangur konflikte përdorni butonin Shiko Paraprakisht për të rivendosur kohën e kyçjes.';
+$lang['js']['notsavedyet']     = 'Ndryshimet e paruajtura do të humbasin.\nVazhdo me të vërtetë?';
+$lang['rssfailed']             = 'Ndoshi një gabim gjatë kapjes së këtij lajmi:';
+$lang['nothingfound']          = 'Nuk u gjet asgjë.';
+$lang['mediaselect']           = 'Skedarët e Medias';
+$lang['uploadsucc']            = 'Ngarkim i suksesshëm';
+$lang['uploadfail']            = 'Ngarkimi dështoi. Ndoshta leje të gabuara?';
+$lang['uploadwrong']           = 'Ngarkimi u refuzua! Prapashtesa e skedarit është e ndaluar!';
+$lang['uploadexist']           = 'Skedari ekziston. Nuk u bë asgjë.';
+$lang['uploadbadcontent']      = 'Përmbajtja e ngarkimit nuk përkoi me prapshtesën e skedarit %s';
+$lang['uploadspam']            = 'Ngarkimi u bllokua nga lista e zezë e spam-eve.';
+$lang['uploadxss']             = 'Ngarkimi u bllokua për dyshim përmbajtjeje jo të sigurt.';
+$lang['uploadsize']            = 'Skedari i ngarkuar ishte tepër i madh. (maksimumi %s)';
+$lang['deletesucc']            = 'Skedari "%s" u fshi.';
+$lang['deletefail']            = '"%s" nuk mundi të fshihej. Kontrollo lejet.';
+$lang['mediainuse']            = 'Skedari "%s" nuk u fshi - është ende në përdorim.';
+$lang['namespaces']            = 'Hapësirat e Emrave';
+$lang['mediafiles']            = 'Skedarët e disponueshëm në';
+$lang['js']['searchmedia']     = 'Kërko për skedarë';
+$lang['js']['keepopen']        = 'Mbaje dritaren të hapur gjatë përzgjedhjes';
+$lang['js']['hidedetails']     = 'Fshih Detajet';
+$lang['js']['nosmblinks']      = 'Lidhja te Windows shares funksionon vetëm në Microsoft Internet Explorer. Ju prapë mund ta kopjoni dhe ngjitni linkun.';
+$lang['js']['linkwiz']         = 'Magjistari i Link';
+$lang['js']['linkto']          = 'Lidh tek:';
+$lang['js']['del_confirm']     = 'Fshiji vërtetë objektet e përzgjedhura?';
+$lang['mediausage']            = 'Përdor sintaksën e mëposhtme për të referuar këtë skedar:';
+$lang['mediaview']             = 'Shiko skedarin origjinal';
+$lang['mediaroot']             = 'rrënja';
+$lang['mediaupload']           = 'Ngarko një skedar tek hapësira e emrit aktuale këtu. Për të krijuaj nënhapësira emri, bashkangjiti ato pas emrit të skedarit "Ngarko Si" duke e ndarë me dy pika (:).';
+$lang['mediaextchange']        = 'Prapashtesa e skedarit u ndërrua nga .%s në .%s!';
+$lang['reference']             = 'Referenca për:';
+$lang['ref_inuse']             = 'Skedari nuk mund të fshihet, sepse është duke u përdorur ende nga faqet e mëposhtme:';
+$lang['ref_hidden']            = 'Disa referenca janë në faqe të cilat ju nuk keni leje t\'i lexoni.';
+$lang['hits']                  = 'Pamje';
+$lang['quickhits']             = 'Emrat e faqeve që përkojnë';
+$lang['toc']                   = 'Tabela e Përmbajtjeve';
+$lang['current']               = 'aktuale';
+$lang['yours']                 = 'Versioni Juaj';
+$lang['diff']                  = 'Trego ndryshimet nga rishikimet aktuale';
+$lang['diff2']                 = 'Trego ndryshimet mes rishikimeve të përzgjedhura';
+$lang['line']                  = 'Vijë';
+$lang['breadcrumb']            = 'Gjurmë:';
+$lang['youarehere']            = 'Ju jeni këtu:';
+$lang['lastmod']               = 'Redaktuar për herë të fundit:';
+$lang['by']                    = 'nga';
+$lang['deleted']               = 'u fshi';
+$lang['created']               = 'u krijua';
+$lang['restored']              = 'Kthehu tek një version i vjetër (%s)';
+$lang['external_edit']         = 'redaktim i jashtëm';
+$lang['summary']               = 'Përmbledhja redaktimit';
+$lang['noflash']               = 'Nevojitet <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> për të paraqitur këtë përmbajtje.';
+$lang['download']              = 'Shkarko Copën';
+$lang['mail_newpage']          = 'faqje u shtua:';
+$lang['mail_changed']          = 'faqja u ndryshua:';
+$lang['mail_subscribe_list']   = 'faqet u ndryshuan në hapësirën e emrave:';
+$lang['mail_new_user']         = 'përdorues i ri:';
+$lang['mail_upload']           = 'skedari u ngarkua:';
+$lang['qb_bold']               = 'Tekst i Theksuar';
+$lang['qb_italic']             = 'Tekst i Pjerrët';
+$lang['qb_underl']             = 'Tekst i Nënvijëzuar';
+$lang['qb_code']               = 'Tekst Kodi';
+$lang['qb_strike']             = 'Tekst me Vijë Mespërmes';
+$lang['qb_h1']                 = 'Titull me Nivel 1';
+$lang['qb_h2']                 = 'Titull me Nivel 2';
+$lang['qb_h3']                 = 'Titull me Nivel 3';
+$lang['qb_h4']                 = 'Titull me Nivel 4';
+$lang['qb_h5']                 = 'Titull me Nivel 5';
+$lang['qb_h']                  = 'Titull';
+$lang['qb_hs']                 = 'Përzgjidh Titull';
+$lang['qb_hplus']              = 'Titull Më i Lartë';
+$lang['qb_hminus']             = 'Titull Më i Ulët';
+$lang['qb_hequal']             = 'Titull i të Njëjtit Nivel';
+$lang['qb_link']               = 'Lidhje e Brendshme';
+$lang['qb_extlink']            = 'Lidhje e Jashtme ';
+$lang['qb_hr']                 = 'Vijë Horizontale';
+$lang['qb_ol']                 = 'Listë Objektesh të Renditur';
+$lang['qb_ul']                 = 'Listë Objektesh të Parenditura';
+$lang['qb_media']              = 'Shto imazhe dhe skedarë të tjerë';
+$lang['qb_sig']                = 'Fut Firmën';
+$lang['qb_smileys']            = 'Smileys';
+$lang['qb_chars']              = 'Karaktere Speciale';
+$lang['upperns']               = 'kërce tek hapësira e emrit prind';
+$lang['metaedit']              = 'Redakto Metadata';
+$lang['metasaveerr']           = 'Shkrimi i metadata-ve dështoi';
+$lang['metasaveok']            = 'Metadata u ruajt';
+$lang['btn_img_backto']            = 'Mbrapa te %s';
+$lang['img_title']             = 'Titulli :';
+$lang['img_caption']           = 'Titra:';
+$lang['img_date']              = 'Data:';
+$lang['img_fname']             = 'Emri Skedarit:';
+$lang['img_fsize']             = 'Madhësia:';
+$lang['img_artist']            = 'Autor:';
+$lang['img_copyr']             = 'Mbajtësi i të drejtave të autorit:';
+$lang['img_format']            = 'Formati:';
+$lang['img_camera']            = 'Kamera:';
+$lang['img_keywords']          = 'Fjalë Kyçe:';
+$lang['subscr_subscribe_success'] = 'Iu shtua %s listës së abonimeve për %s';
+$lang['subscr_subscribe_error'] = 'Gabim gjatë shtimit të %s listës së abonimeve për %s';
+$lang['subscr_subscribe_noaddress'] = 'Nuk ekziston asnjë adresë e lidhur me regjistrimin tuaj, ju nuk mund t\'i shtoheni listës së abonimeve.';
+$lang['subscr_unsubscribe_success'] = 'U hoq %s nga lista e abonimeve për %s';
+$lang['subscr_unsubscribe_error'] = 'Gabim në heqjen e %s nga lista e abonimeve për %s';
+$lang['subscr_already_subscribed'] = '%s është abonuar njëherë te %s';
+$lang['subscr_not_subscribed'] = '%s nuk është abonuar te %s';
+$lang['subscr_m_not_subscribed'] = 'Momentalisht ju nuk jeni i abonuar në faqen aktuale apo hapësirën e emrit aktual.';
+$lang['subscr_m_new_header']   = 'Shto abonim';
+$lang['subscr_m_current_header'] = 'Abonimet aktuale';
+$lang['subscr_m_unsubscribe']  = 'Fshi Abonimin';
+$lang['subscr_m_subscribe']    = 'Abonohu';
+$lang['subscr_m_receive']      = 'Mer';
+$lang['subscr_style_every']    = 'email mbi çdo ndryshim';
+$lang['authtempfail']          = 'Autentikimi i përdoruesve është përkohësisht i padisponueshëm. Nëse kjo gjendje vazhdon, ju lutemi të informoni Administratorin tuaj të Wiki-it.';
+$lang['i_chooselang']          = 'Zgjidhni gjuhën tuaj';
+$lang['i_installer']           = 'Installer-i DokuWiki';
+$lang['i_wikiname']            = 'Emri Wiki-it';
+$lang['i_enableacl']           = 'Aktivizo ACL (rekomanduar)';
+$lang['i_superuser']           = 'Superpërdorues';
+$lang['i_problems']            = 'Installer-i gjeti disa probleme, të shfaqura më poshtë. Nuk mund të vazhdoni derisa t\'i keni rregulluar.';
+$lang['i_modified']            = 'Për arsye sigurie ky skript do të punojë vetëm me një instalim të ri dhe të pamodifikuar DokuWiki.
+Ose duhet të ekstraktoni skedarët nga e para nga pakoja e shkarkimit ose konsultohuni me <a href="http://dokuwiki.org/install">Dokuwiki installation instructions</a>';
+$lang['i_funcna']              = 'Funksioni PHP <code>%s</code> nuk është i disponueshëm. Mbase siguruesi juaj i host-it e ka çaktivizuar për ndonjë arsye?';
+$lang['i_phpver']              = 'Versioni juaj i PHP <code>%s</code> është më i vogël se ai i duhuri <code>%s</code>. Duhet të përditësoni instalimin tuaj të PHP-së.';
+$lang['i_permfail']            = '<code>%s</code> nuk është e shkruajtshme nga DokuWiki. Duhet të rregulloni lejet e përdorimit për këtë direktori.';
+$lang['i_confexists']          = '<code>%s</code> ekziston njëherë';
+$lang['i_writeerr']            = '<code>%s</code> nuk mundi të krijohej. Duhet të kontrolloni lejet e dirkektorisë/skedarit dhe ta krijoni skedarin manualisht.';
+$lang['i_badhash']             = 'dokuwiki.php e panjohur ose e ndryshuar (hash=code>%s</code>)';
+$lang['i_badval']              = '<code>%s</code> - vlerë e palejuar ose boshe';
+$lang['i_success']             = 'Konfigurimi u mbarua me sukses. Tani mund ta fshini skedarin install.php. Vazhdoni tek <a href="doku.php?id=wiki:welcome">DokuWiki juaj i ri.</a>.';
+$lang['i_failure']             = 'Ndodhën disa gabime gjatë shkrimit të skedarit të konfigurimit. Do t\'ju duhet t\'i rregulloni manualisht para se të përdorni <a href="doku.php?id=wiki:welcome">DokuWiki-in tuaj të ri.</a>.';
+$lang['i_policy']              = 'Veprimi fillestar ACL';
+$lang['i_pol0']                = 'Wiki i Hapur (lexim, shkrim, ngarkim për këdo)';
+$lang['i_pol1']                = 'Wiki Publike (lexim për këdo, shkrim dhe ngarkim për përdoruesit e regjistruar)';
+$lang['i_pol2']                = 'Wiki e Mbyllur (lexim, shkrim, ngarkim vetëm për përdoruesit e regjistruar)';
+$lang['i_retry']               = 'Provo Përsëri';
+$lang['recent_global']         = 'Momentalisht jeni duke parë ndryshimet brenda hapësirës së emrit <b>%s</b>. Gjithashtu mund <a href="%s">të shihni ndryshimet më të fundit në të gjithë wiki-n</a>.';
+$lang['years']                 = '%d vite më parë';
+$lang['months']                = '%d muaj më parë';
+$lang['weeks']                 = '%d javë më parë';
+$lang['days']                  = '%d ditë më parë';
+$lang['hours']                 = '%d orë më parë';
+$lang['minutes']               = '%d minuta më parë';
+$lang['seconds']               = '%d sekonda më parë';
+$lang['email_signature_text'] = 'Ky email u gjenerua nga DokuWiki në
+@DOKUWIKIURL@';
diff --git a/wiki/inc/lang/sq/locked.txt b/wiki/inc/lang/sq/locked.txt
new file mode 100644
index 0000000..8c86c8b
--- /dev/null
+++ b/wiki/inc/lang/sq/locked.txt
@@ -0,0 +1,3 @@
+====== Faqe e kyçur ======
+
+Kjo faqe është përkohësisht e kyçur për redaktim nga një përdorues tjetër. Duhet të prisni derisa ky përdorues të mbarojë redaktimin ose çelësi të skadojë.
\ No newline at end of file
diff --git a/wiki/inc/lang/sq/login.txt b/wiki/inc/lang/sq/login.txt
new file mode 100644
index 0000000..843e476
--- /dev/null
+++ b/wiki/inc/lang/sq/login.txt
@@ -0,0 +1,3 @@
+====== Hyrje ======
+
+Momentalisht nuk jeni të futur në Wiki! Futni informacionet tuaja të autentikimit më poshtë për të hyrë. Duhet t'i keni cookies të aktivizuara për të hyrë.
\ No newline at end of file
diff --git a/wiki/inc/lang/sq/mailtext.txt b/wiki/inc/lang/sq/mailtext.txt
new file mode 100644
index 0000000..0566aaf
--- /dev/null
+++ b/wiki/inc/lang/sq/mailtext.txt
@@ -0,0 +1,16 @@
+Një faqe në DokuWiki-n tuaj u shtua ose u ndryshua. Këto janë detajet:
+
+Data: @DATE@
+Shfletuesi: @BROWSER@
+Adresa IP: @IPADDRESS@
+Emri Hostit: @HOSTNAME@
+Rishikimi i vjetër: @OLDPAGE@
+Rishikimi i ri: @NEWPAGE@
+Përmbledhja redaktimit: @SUMMARY@
+Përdoruesi: @USER@
+
+@DIFF@
+
+---
+Ky email u gjenerua nga DokuWiki në
+@DOKUWIKIURL@
diff --git a/wiki/inc/lang/sq/newpage.txt b/wiki/inc/lang/sq/newpage.txt
new file mode 100644
index 0000000..1db750d
--- /dev/null
+++ b/wiki/inc/lang/sq/newpage.txt
@@ -0,0 +1,3 @@
+====== Kjo temë nuk ekziston ende ======
+
+Keni ndjekur një link për në një temë që nuk ekziston ende. Nëse ua lejojnë të drejtat, mund ta krijoni duke klikuar butonin "Krijo këtë faqe".
\ No newline at end of file
diff --git a/wiki/inc/lang/sq/norev.txt b/wiki/inc/lang/sq/norev.txt
new file mode 100644
index 0000000..0e73223
--- /dev/null
+++ b/wiki/inc/lang/sq/norev.txt
@@ -0,0 +1,3 @@
+====== Nuk ekzistion një rishikim i tillë ======
+
+Rishikimi i specifikuar nuk ekziston. Përdor buttonin "Rishikime të vjetra" për një listë të rishikimeve të vjetra të këtij dokumenti.
\ No newline at end of file
diff --git a/wiki/inc/lang/sq/password.txt b/wiki/inc/lang/sq/password.txt
new file mode 100644
index 0000000..44acfe6
--- /dev/null
+++ b/wiki/inc/lang/sq/password.txt
@@ -0,0 +1,10 @@
+Përshëndetje @FULLNAME@!
+
+Këtu janë të dhënat e përdoruesit për @TITLE@ në @DOKUWIKIURL@
+
+Hyrje: @LOGIN@
+Fjalëkalimi: @PASSWORD@
+
+---
+Ky email u gjenerua nga DokuWiki në
+@DOKUWIKIURL@
diff --git a/wiki/inc/lang/sq/preview.txt b/wiki/inc/lang/sq/preview.txt
new file mode 100644
index 0000000..07148b8
--- /dev/null
+++ b/wiki/inc/lang/sq/preview.txt
@@ -0,0 +1,3 @@
+====== Shikim Paraprak ======
+
+Ky është një shikim paraprak i tekstit tuaj. Kujtohuni: **Nuk** është ruajtur ende!
\ No newline at end of file
diff --git a/wiki/inc/lang/sq/pwconfirm.txt b/wiki/inc/lang/sq/pwconfirm.txt
new file mode 100644
index 0000000..ec776d4
--- /dev/null
+++ b/wiki/inc/lang/sq/pwconfirm.txt
@@ -0,0 +1,9 @@
+Përshëndetje @FULLNAME@!
+
+Dikush kërkoi një fjalëkalim të ri për hyrjen tuaj @TITLE@ në @DOKUWIKIURL@
+
+Nëse nuk kërkuat një fjalëkalim të ri atëherë thjesht injorojeni këtë email.
+
+Për të konfirmuar që kërkesa u dërgua me të vërtetë nga ju, ju lutemi përdorni link-un e mëposhtëm.
+
+@CONFIRM@
diff --git a/wiki/inc/lang/sq/read.txt b/wiki/inc/lang/sq/read.txt
new file mode 100644
index 0000000..cbb0280
--- /dev/null
+++ b/wiki/inc/lang/sq/read.txt
@@ -0,0 +1 @@
+Kjo faqe është vetëm për lexim. Mund të shihni kodin burim, por nuk mund ta ndryshoni atë. Kontaktoni administratorin nëse mendoni se kjo është e gabuar.
\ No newline at end of file
diff --git a/wiki/inc/lang/sq/recent.txt b/wiki/inc/lang/sq/recent.txt
new file mode 100644
index 0000000..4b3bdf4
--- /dev/null
+++ b/wiki/inc/lang/sq/recent.txt
@@ -0,0 +1,3 @@
+====== Ndryshimet e kohëve të fundit ======
+
+Faqet e mëposhtme janë ndryshuar së fundmi.
\ No newline at end of file
diff --git a/wiki/inc/lang/sq/register.txt b/wiki/inc/lang/sq/register.txt
new file mode 100644
index 0000000..d4a3ca3
--- /dev/null
+++ b/wiki/inc/lang/sq/register.txt
@@ -0,0 +1,3 @@
+====== Regjistrohuni si një përdorues i ri ======
+
+Plotësoni të gjitha informacionet e mëposhtme për të krijuar një llogari në këtë wiki. Sigorohuni që të jepni një **adresë email-i të vlefshme**. Nëse nuk ju kërkohet të futni një fjalëkalim këtu, një fjalëkalim i ri do t'ju dërgohet në adresën e email-it që specifikuat. Emri i hyrjes duhet të një [[doku>pagename|pagename]] e vlefshme.
\ No newline at end of file
diff --git a/wiki/inc/lang/sq/registermail.txt b/wiki/inc/lang/sq/registermail.txt
new file mode 100644
index 0000000..d0f7d51
--- /dev/null
+++ b/wiki/inc/lang/sq/registermail.txt
@@ -0,0 +1,10 @@
+Një përdorues i ri u regjistrua. Këto janë detajet:
+
+Emri përdoruesit: @NEWUSER@
+Emri i plotë i përdoruesit: @NEWNAME@
+E-mail: @NEWEMAIL@
+
+Data: @DATE@
+Shfletuesi: @BROWSER@
+Adresa IP: @IPADDRESS@
+Emri Hostit: @HOSTNAME@
diff --git a/wiki/inc/lang/sq/resendpwd.txt b/wiki/inc/lang/sq/resendpwd.txt
new file mode 100644
index 0000000..79d0b3e
--- /dev/null
+++ b/wiki/inc/lang/sq/resendpwd.txt
@@ -0,0 +1,3 @@
+====== Dërgo fjalëkalim të ri ======
+
+Ju lutemi futni emrin tuaj të përdorimit në formën e mëposhtme për të kërkuar një fjalëkalim të ri për llogarinë tuaj në këtë wiki. Një link konfirmimi do të dërgohet në adresën tuaj të eMail-it.
\ No newline at end of file
diff --git a/wiki/inc/lang/sq/revisions.txt b/wiki/inc/lang/sq/revisions.txt
new file mode 100644
index 0000000..349631f
--- /dev/null
+++ b/wiki/inc/lang/sq/revisions.txt
@@ -0,0 +1,3 @@
+====== Rishikime të vjetra ======
+
+Këto janë rishikimet e vjetra të dokumentit aktual. Për t'u kthyer në një rishikim të vjetër, zgjidhni nga këtu poshtë, klikoni "Redaktoni këtë faqe" dhe ruajeni atë.
diff --git a/wiki/inc/lang/sq/searchpage.txt b/wiki/inc/lang/sq/searchpage.txt
new file mode 100644
index 0000000..4c72f22
--- /dev/null
+++ b/wiki/inc/lang/sq/searchpage.txt
@@ -0,0 +1,4 @@
+====== Kërko ======
+
+Mund të gjeni rezultatet e kërkimit tuaj më poshtë. @CREATEPAGEINFO@
+
diff --git a/wiki/inc/lang/sq/showrev.txt b/wiki/inc/lang/sq/showrev.txt
new file mode 100644
index 0000000..9c1f761
--- /dev/null
+++ b/wiki/inc/lang/sq/showrev.txt
@@ -0,0 +1,2 @@
+**Ky është një rishikim i vjetër i dokumentit!**
+----
\ No newline at end of file
diff --git a/wiki/inc/lang/sq/stopwords.txt b/wiki/inc/lang/sq/stopwords.txt
new file mode 100644
index 0000000..e356694
--- /dev/null
+++ b/wiki/inc/lang/sq/stopwords.txt
@@ -0,0 +1,39 @@
+# Kjo është një listë e fjalëve që indexer-i injoron, një fjalë për rresht
+# Kur të redaktoni këtë faqe sigurohuni që të përdorni fund-rreshtash UNIX (rresht i ri i vetëm)
+# Nuk është nevoja të përfshini fjalë më të shkurtra se tre karaktere - këtë injorohen gjithsesi
+# Kjo listë bazohet mbi ato që gjenden në http://www.ranks.nl/stopwords/
+about
+are
+as
+an
+and
+you
+your
+them
+their
+com
+for
+from
+into
+if
+in
+is
+it
+how
+of
+on
+or
+that
+the
+this
+to
+was
+what
+when
+where
+who
+will
+with
+und
+the
+www
\ No newline at end of file
diff --git a/wiki/inc/lang/sq/subscr_digest.txt b/wiki/inc/lang/sq/subscr_digest.txt
new file mode 100644
index 0000000..62ca057
--- /dev/null
+++ b/wiki/inc/lang/sq/subscr_digest.txt
@@ -0,0 +1,16 @@
+Përshëndetje!
+
+Faqja @PAGE@ në wiki-n @TITLE@ ndryshoi.
+Këtu janë ndryshimet:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Rishikimi i vjetër: @OLDPAGE@
+Rishikimi i ri: @NEWPAGE@
+
+Për të fshirë lajmërimet e faqes, mund të hyni tek wiki në
+@DOKUWIKIURL@ pastaj vizitoni
+@SUBSCRIBE@
+dhe ç'regjistro faqen dhe/ose ndryshimet e hapësirës së emrit.
diff --git a/wiki/inc/lang/sq/subscr_form.txt b/wiki/inc/lang/sq/subscr_form.txt
new file mode 100644
index 0000000..7c71a4c
--- /dev/null
+++ b/wiki/inc/lang/sq/subscr_form.txt
@@ -0,0 +1,3 @@
+====== Menaxhimi i Abonimeve ======
+
+Kjo faqe lejon menaxhimin e abonimeve tuaja për faqen dhe hapësirën e emrit aktual.
\ No newline at end of file
diff --git a/wiki/inc/lang/sq/subscr_list.txt b/wiki/inc/lang/sq/subscr_list.txt
new file mode 100644
index 0000000..0677f40
--- /dev/null
+++ b/wiki/inc/lang/sq/subscr_list.txt
@@ -0,0 +1,9 @@
+Përshëndetje!
+
+Faqet në hapësirën e emrit @PAGE@ të wiki-t @TITLE@ ndryshuan. Këto janë faqet e ndryshuara:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Për të fshirë lajmërimet e faqes, hyni në wiki-n tek @DOKUWIKIURL@ dhe pastaj vizitoni @SUBSCRIBE@ dhe fshini ndryshimet e faqes dhe/ose të hapësirës së emrit.
diff --git a/wiki/inc/lang/sq/subscr_single.txt b/wiki/inc/lang/sq/subscr_single.txt
new file mode 100644
index 0000000..0e4a71c
--- /dev/null
+++ b/wiki/inc/lang/sq/subscr_single.txt
@@ -0,0 +1,19 @@
+Përshëndetje!
+
+Faqja @PAGE@ në wiki-n @TITLE@ ndryshoi.
+Këto janë ndryshimet:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Data : @DATE@
+Përdoruesi : @USER@
+Përmbledhja redaktimit: @SUMMARY@
+Rishikimi i vjetër: @OLDPAGE@
+Rishikimi i ri: @NEWPAGE@
+
+Për të fshirë lajmërimet e faqes, hyni në wiki tek
+@DOKUWIKIURL@ dhe pastaj vizitoni
+@SUBSCRIBE@
+dhe fshini ndryshimet e faqes dhe/ose hapësirës së emrit.
diff --git a/wiki/inc/lang/sq/updateprofile.txt b/wiki/inc/lang/sq/updateprofile.txt
new file mode 100644
index 0000000..ba76beb
--- /dev/null
+++ b/wiki/inc/lang/sq/updateprofile.txt
@@ -0,0 +1,3 @@
+====== Përditësoni profilin e llogarisë tuaj ======
+
+Duhet vetëm të plotësoni ato fusha që doni të ndryshoni. Mund të mos e ndryshoni emrin tuaj të përdoruesit.
\ No newline at end of file
diff --git a/wiki/inc/lang/sq/uploadmail.txt b/wiki/inc/lang/sq/uploadmail.txt
new file mode 100644
index 0000000..126aefc
--- /dev/null
+++ b/wiki/inc/lang/sq/uploadmail.txt
@@ -0,0 +1,10 @@
+Një skedar u ngarkua në DokuWiki-n tënd. Detajet janë:
+
+Skedar: @MEDIA@
+Data: @DATE@
+Shfletuesi: @BROWSER@
+Adresa IP: @IPADDRESS@
+Emri Hostit: @HOSTNAME@
+Madhësia: @SIZE@
+Tipi MIME: @MIME@
+Përdoruesi: @USER@
diff --git a/wiki/inc/lang/sr/admin.txt b/wiki/inc/lang/sr/admin.txt
new file mode 100644
index 0000000..1e42970
--- /dev/null
+++ b/wiki/inc/lang/sr/admin.txt
@@ -0,0 +1,4 @@
+====== Администрација ======
+
+Изпод се налази листа доступних администраторских опција у DokuWiki-ју.
+
diff --git a/wiki/inc/lang/sr/adminplugins.txt b/wiki/inc/lang/sr/adminplugins.txt
new file mode 100644
index 0000000..02b1a04
--- /dev/null
+++ b/wiki/inc/lang/sr/adminplugins.txt
@@ -0,0 +1 @@
+===== Остали додаци =====
\ No newline at end of file
diff --git a/wiki/inc/lang/sr/backlinks.txt b/wiki/inc/lang/sr/backlinks.txt
new file mode 100644
index 0000000..dae8d5a
--- /dev/null
+++ b/wiki/inc/lang/sr/backlinks.txt
@@ -0,0 +1,4 @@
+====== Повратне везе ======
+
+Ово је листа страница које имају везе ка тренутној страници.
+
diff --git a/wiki/inc/lang/sr/conflict.txt b/wiki/inc/lang/sr/conflict.txt
new file mode 100644
index 0000000..2a1427e
--- /dev/null
+++ b/wiki/inc/lang/sr/conflict.txt
@@ -0,0 +1,6 @@
+====== Постоји новија верзија ======
+
+Постоји новија верзија документа који сте изменили. Ово се дешава када неки други корисник измени документ док га Ви још увек мењате.
+
+Проучите разлике које су доле детаљно приказане, па након тога одлучите коју верзију желите да задржите. Ако изаберете ''сачувај'', Ваша верзија ће да буде сачувана. Ако изаберите ''поништи'', тренутна верзија ће да буде сачувана.
+
diff --git a/wiki/inc/lang/sr/denied.txt b/wiki/inc/lang/sr/denied.txt
new file mode 100644
index 0000000..521c284
--- /dev/null
+++ b/wiki/inc/lang/sr/denied.txt
@@ -0,0 +1,4 @@
+====== Забрањен приступ ======
+
+Извините, али немате довољно права да наставите.
+
diff --git a/wiki/inc/lang/sr/diff.txt b/wiki/inc/lang/sr/diff.txt
new file mode 100644
index 0000000..39b7427
--- /dev/null
+++ b/wiki/inc/lang/sr/diff.txt
@@ -0,0 +1,4 @@
+====== Разлике ======
+
+Овде су приказане разлике између изабране ревизије и тренутне верзије странице.
+
diff --git a/wiki/inc/lang/sr/draft.txt b/wiki/inc/lang/sr/draft.txt
new file mode 100644
index 0000000..44affdd
--- /dev/null
+++ b/wiki/inc/lang/sr/draft.txt
@@ -0,0 +1,5 @@
+====== Пронађена је скица датотеке ======
+
+Прошли пут кад сте покушали нешто да измените на овој страници ваше измене нису успешно сачуване. DokuWiki је аутоматски сачувао скицу вашег рада коју сада можете да искористите да бисте наставили са изменама. Испод можете да видите податке који су сачувани током ваше последње посете.
+
+Молимо вас, одаберите да ли желите да  //повратите// ваше измене, //обришете// аутоматски сачувану скицу, или //поништите// цео процес измена.
\ No newline at end of file
diff --git a/wiki/inc/lang/sr/edit.txt b/wiki/inc/lang/sr/edit.txt
new file mode 100644
index 0000000..2d6fa7b
--- /dev/null
+++ b/wiki/inc/lang/sr/edit.txt
@@ -0,0 +1,2 @@
+Измените ову страницу и притисните ''Сачувај''. Погледајте [[wiki:syntax]] за синтаксу Викија. Молим Вас, измените ову страницу само ако имате намеру да је **побољшате**. Ако желите да тестирате могућности, научите да направите своје кораке на [[playground:playground]].
+
diff --git a/wiki/inc/lang/sr/editrev.txt b/wiki/inc/lang/sr/editrev.txt
new file mode 100644
index 0000000..3279029
--- /dev/null
+++ b/wiki/inc/lang/sr/editrev.txt
@@ -0,0 +1,2 @@
+**Учитали сте стару ревизију документа!** Ако је сачувате, направићете нову верзију са овим подацима.
+----
diff --git a/wiki/inc/lang/sr/index.txt b/wiki/inc/lang/sr/index.txt
new file mode 100644
index 0000000..fe6467a
--- /dev/null
+++ b/wiki/inc/lang/sr/index.txt
@@ -0,0 +1,4 @@
+====== Индекс ======
+
+Овде је индекс свих доступних страница поређаних по [[doku>namespaces|именским просторима]].
+
diff --git a/wiki/inc/lang/sr/install.html b/wiki/inc/lang/sr/install.html
new file mode 100644
index 0000000..c6c70df
--- /dev/null
+++ b/wiki/inc/lang/sr/install.html
@@ -0,0 +1,12 @@
+<p>Ова страница ће вам помоћи у инсталацији и подешавању <a href="http://dokuwiki.org">Dokuwiki-ја</a>. Више информација о инсталацији можете пронаћи у
+<a href="http://dokuwiki.org/installer">документацији</a>.</p>
+
+<p>DokuWiki користи обичне датотеке за складиштење вики страница и осталих информација везаних за странице (слике, индекс претраге, старе преправке, итд.).
+Да би радио како треба DokuWiki као апликација <strong>мора</strong> имати могућност писања под фасциклама у којима се налазе ове датотеке. Овај програм за инсталацију нема могућност постављања дозвола за фасцикле. То се обично ради директно из командне линије или ако користите изнајмњени сервер, помоћу ФТПа или кроз Контролни панел (нпр. cPanel).</p>
+
+<p>Овај програм за инсталацију DokuWiki-а ће поставити подешавања за
+Права приступа, које ће омогућити пријјављивање као администратор и приступ менију за инсталацију додатака, управљање корисницима, управљање приступом ка страницама и алтернатвна подешавања. Није неопходно да би DokuWiki радио, али ће вам олакшати администрацију.</p>
+
+<p>Искуснији корисници и корисници са посебним захтевима би требало да погледају следеће линкове са детаљним упутствима о
+<a href="http://dokuwiki.org/install">инструкцијама за инсталацију</a>
+и <a href="http://dokuwiki.org/config">подешавањима</a>.</p>
\ No newline at end of file
diff --git a/wiki/inc/lang/sr/jquery.ui.datepicker.js b/wiki/inc/lang/sr/jquery.ui.datepicker.js
new file mode 100644
index 0000000..fa8827a
--- /dev/null
+++ b/wiki/inc/lang/sr/jquery.ui.datepicker.js
@@ -0,0 +1,37 @@
+/* Serbian i18n for the jQuery UI date picker plugin. */
+/* Written by Dejan Dimić. */
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "../widgets/datepicker" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery.datepicker );
+	}
+}( function( datepicker ) {
+
+datepicker.regional.sr = {
+	closeText: "Затвори",
+	prevText: "&#x3C;",
+	nextText: "&#x3E;",
+	currentText: "Данас",
+	monthNames: [ "Јануар","Фебруар","Март","Април","Мај","Јун",
+	"Јул","Август","Септембар","Октобар","Новембар","Децембар" ],
+	monthNamesShort: [ "Јан","Феб","Мар","Апр","Мај","Јун",
+	"Јул","Авг","Сеп","Окт","Нов","Дец" ],
+	dayNames: [ "Недеља","Понедељак","Уторак","Среда","Четвртак","Петак","Субота" ],
+	dayNamesShort: [ "Нед","Пон","Уто","Сре","Чет","Пет","Суб" ],
+	dayNamesMin: [ "Не","По","Ут","Ср","Че","Пе","Су" ],
+	weekHeader: "Сед",
+	dateFormat: "dd.mm.yy",
+	firstDay: 1,
+	isRTL: false,
+	showMonthAfterYear: false,
+	yearSuffix: "" };
+datepicker.setDefaults( datepicker.regional.sr );
+
+return datepicker.regional.sr;
+
+} ) );
diff --git a/wiki/inc/lang/sr/lang.php b/wiki/inc/lang/sr/lang.php
new file mode 100644
index 0000000..9182c1b
--- /dev/null
+++ b/wiki/inc/lang/sr/lang.php
@@ -0,0 +1,342 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Filip Brcic <brcha@users.sourceforge.net>
+ * @author Иван Петровић (Ivan Petrovic) <petrovicivan@ubuntusrbija.org>
+ * @author Miroslav Šolti <solti.miroslav@gmail.com>
+ * @author Жељко Тодоровић <zeljko_todorovic@mail.com>
+ * @author Марко М. Костић <marko.m.kostic@gmail.com>
+ */
+$lang['encoding']              = 'utf-8';
+$lang['direction']             = 'ltr';
+$lang['doublequoteopening']    = '„';
+$lang['doublequoteclosing']    = '“';
+$lang['singlequoteopening']    = '‚';
+$lang['singlequoteclosing']    = '‘';
+$lang['apostrophe']            = '\'';
+$lang['btn_edit']              = 'Измени ову страницу';
+$lang['btn_source']            = 'Прикажи изворни код';
+$lang['btn_show']              = 'Прикажи страницу';
+$lang['btn_create']            = 'Направи ову страницу';
+$lang['btn_search']            = 'Тражи';
+$lang['btn_save']              = 'Сачувај';
+$lang['btn_preview']           = 'Прегледај';
+$lang['btn_top']               = 'Врати се на врх';
+$lang['btn_newer']             = '<< новије';
+$lang['btn_older']             = 'старије >>';
+$lang['btn_revs']              = 'Старе верзије';
+$lang['btn_recent']            = 'Скорије измене';
+$lang['btn_upload']            = 'Пошаљи';
+$lang['btn_cancel']            = 'Поништи';
+$lang['btn_index']             = 'Индекс';
+$lang['btn_secedit']           = 'Измени';
+$lang['btn_login']             = 'Пријави се';
+$lang['btn_logout']            = 'Одјави се';
+$lang['btn_admin']             = 'Администрација';
+$lang['btn_update']            = 'Ажурирај';
+$lang['btn_delete']            = 'Избриши';
+$lang['btn_back']              = 'Натраг';
+$lang['btn_backlink']          = 'Повратне везе';
+$lang['btn_subscribe']         = 'Пријави се на измене';
+$lang['btn_profile']           = 'Ажурирај профил';
+$lang['btn_reset']             = 'Поништи';
+$lang['btn_resendpwd']         = 'Поставите нови лозинку';
+$lang['btn_draft']             = 'Измени нацрт';
+$lang['btn_recover']           = 'Опорави нацрт';
+$lang['btn_draftdel']          = 'Обриши нацрт';
+$lang['btn_revert']            = 'Врати на пређашњу верзију';
+$lang['btn_register']          = 'Региструј се';
+$lang['btn_apply']             = 'Примени';
+$lang['btn_media']             = 'Управник мултимедије';
+$lang['btn_deleteuser']        = 'Уклони мој налог';
+$lang['btn_img_backto']        = 'Натраг на %s';
+$lang['btn_mediaManager']      = 'Погледај у управнику мултимедије';
+$lang['loggedinas']            = 'Пријављен као:';
+$lang['user']                  = 'Корисничко име';
+$lang['pass']                  = 'Лозинка';
+$lang['newpass']               = 'Нова лозинка';
+$lang['oldpass']               = 'Унеси садашњу лозинку';
+$lang['passchk']               = 'поново';
+$lang['remember']              = 'Запамти ме';
+$lang['fullname']              = 'Име и презиме';
+$lang['email']                 = 'Е-адреса';
+$lang['profile']               = 'Кориснички профил';
+$lang['badlogin']              = 'Нажалост, није добро корисничко име или лозинка.';
+$lang['badpassconfirm']        = 'Нажалост, лозинка је била погрешна';
+$lang['minoredit']             = 'Мала измена';
+$lang['draftdate']             = 'Нацрт је аутоматски сачуван';
+$lang['nosecedit']             = 'Страна је у међувремену промењена, поглавље је застарело и поново се учитава цела страна.';
+$lang['regmissing']            = 'Извините, морате да попуните сва поља.';
+$lang['reguexists']            = 'Извините, корисник са истим именом већ постоји.';
+$lang['regsuccess']            = 'Корисник је направљен и лозинка је послата путем е-поште.';
+$lang['regsuccess2']           = 'Корисник је направљен.';
+$lang['regfail']               = 'Нисам могао да направим корисника.';
+$lang['regmailfail']           = 'Изгледа да је дошло до грешке приликом слања лозинке е-поштом. Контактирајте администратора!';
+$lang['regbadmail']            = 'Дата е-адреса није у реду - ако мислите да је ово грешка, контактирајте администратора';
+$lang['regbadpass']            = 'Две унете лозинке нису исте. Пробајте поново.';
+$lang['regpwmail']             = 'Ваша DokuWiki лозинка';
+$lang['reghere']               = 'Још увек немате налог? Само направите један';
+$lang['profna']                = 'Овај вики не дозвољава измену профила';
+$lang['profnochange']          = 'Нема промена.';
+$lang['profnoempty']           = 'Није дозвољено оставити празно поље имена или е-адресе.';
+$lang['profchanged']           = 'Кориснички профил је ажуриран.';
+$lang['profnodelete']          = 'Овај вики не подржава брисање корисника';
+$lang['profdeleteuser']        = 'Избриши налог';
+$lang['profdeleted']           = 'Ваш кориснички налог је избрисан са овог викија';
+$lang['profconfdelete']        = 'Желим да уклоним свој налог са овог викија. <br/> Ова радња се не може опозвати.';
+$lang['profconfdeletemissing'] = 'Није штиклирано поље за потврду';
+$lang['proffail']              = 'Кориснички профил није ажуриран.';
+$lang['pwdforget']             = 'Заборавили сте лозинку? Направите нову';
+$lang['resendna']              = 'Овај вики не дозвољава слање лозинки.';
+$lang['resendpwd']             = 'Поставите нову лозинку за';
+$lang['resendpwdmissing']      = 'Жао ми је, сва поља морају бити попуњена.';
+$lang['resendpwdnouser']       = 'Жао ми је, овај корисник не постоји у нашој бази.';
+$lang['resendpwdbadauth']      = 'Жао ми је, потврдни код није исправан. Проверите да ли сте користили комплетан потврдни линк.';
+$lang['resendpwdconfirm']      = 'Потврдни линк је постат као е-порука.';
+$lang['resendpwdsuccess']      = 'Ваша нова лозинка је послата као е-порука.';
+$lang['license']               = 'Осим где је другачије назначено, материјал на овом викију је под следећом лиценцом:';
+$lang['licenseok']             = 'Напомена: Изменом ове стране слажете се да ће ваше измене бити под следећом лиценцом:';
+$lang['searchmedia']           = 'Претражи по имену фајла';
+$lang['searchmedia_in']        = 'Претражи у %s';
+$lang['txt_upload']            = 'Изаберите датотеку за слање:';
+$lang['txt_filename']          = 'Унесите вики-име (опционо):';
+$lang['txt_overwrt']           = 'Препишите тренутни фајл';
+$lang['maxuploadsize']         = 'Отпреми највише %s по датотеци.';
+$lang['lockedby']              = 'Тренутно закључано од стране:';
+$lang['lockexpire']            = 'Закључавање истиче:';
+$lang['js']['willexpire']      = 'Ваше закључавање за измену ове странице ће да истекне за један минут.\nДа би сте избегли конфликте, искористите дугме за преглед како би сте ресетовали тајмер закључавања.';
+$lang['js']['notsavedyet']     = 'Несачуване измене ће бити изгубљене.
+Да ли стварно желите да наставите?';
+$lang['js']['searchmedia']     = 'Потражи фајлове';
+$lang['js']['keepopen']        = 'Задржи отворен прозор након одабира';
+$lang['js']['hidedetails']     = 'Сакриј детаље';
+$lang['js']['mediatitle']      = 'Подешаванја везе';
+$lang['js']['mediadisplay']    = 'Тип везе';
+$lang['js']['mediaalign']      = 'Поравнање';
+$lang['js']['mediasize']       = 'Величина слике';
+$lang['js']['mediatarget']     = 'веза води ка:';
+$lang['js']['mediaclose']      = 'Затвори';
+$lang['js']['mediainsert']     = 'Убаци';
+$lang['js']['mediadisplayimg'] = 'Покажи слику';
+$lang['js']['mediadisplaylnk'] = 'Покажи само везу';
+$lang['js']['mediasmall']      = 'Мала верзија';
+$lang['js']['mediamedium']     = 'Средња верзија';
+$lang['js']['medialarge']      = 'Велика верзија';
+$lang['js']['mediaoriginal']   = 'Оригинална верзија';
+$lang['js']['medialnk']        = 'Веза ка страници са детаљима';
+$lang['js']['mediadirect']     = 'Директна веза ка оригиналу';
+$lang['js']['medianolnk']      = 'Без везе';
+$lang['js']['medianolink']     = 'Не постављај слику као везу';
+$lang['js']['medialeft']       = 'Поравнај слику на лево';
+$lang['js']['mediaright']      = 'Поравнај слику на десно';
+$lang['js']['mediacenter']     = 'Поравнај слику по средини';
+$lang['js']['medianoalign']    = 'Без поравнања';
+$lang['js']['nosmblinks']      = 'Повезивање са Windows дељеним фолдерима ради само у Мајкрософтовом Интернет Претраживачу.
+Ипак, можете да ископирате и залепите везу.';
+$lang['js']['linkwiz']         = 'Чаробњак за стварање везе';
+$lang['js']['linkto']          = 'Повежи ка:';
+$lang['js']['del_confirm']     = 'Обриши овај унос?';
+$lang['js']['restore_confirm'] = 'Заиста желите да вратите ово издање?';
+$lang['js']['media_diff']      = 'Погледај разлике:';
+$lang['js']['media_diff_both'] = 'Једно до другог';
+$lang['js']['media_select']    = 'Изабери датотеке…';
+$lang['js']['media_upload_btn'] = 'Отпреми';
+$lang['js']['media_done_btn']  = 'Готово';
+$lang['js']['media_drop']      = 'Превуците датотеке овде да бисте их отпремили';
+$lang['js']['media_cancel']    = 'уклони';
+$lang['js']['media_overwrt']   = 'Препиши постојеће датотеке';
+$lang['rssfailed']             = 'Дошло је до грешке приликом преузимања овог довода: ';
+$lang['nothingfound']          = 'Ништа није нађено.';
+$lang['mediaselect']           = 'Избор медијске датотеке';
+$lang['uploadsucc']            = 'Успешно слање';
+$lang['uploadfail']            = 'Неуспешно слање. Можда немате дозволу?';
+$lang['uploadwrong']           = 'Слање је забрањено. Овај наставак датотеке је забрањен!';
+$lang['uploadexist']           = 'Датотека већ постоји. Ништа није учињено.';
+$lang['uploadbadcontent']      = 'Материјал који шаљете не одговара %s ';
+$lang['uploadspam']            = 'Слање је блокирано јер се налазите на црној листи пошиљаоца.';
+$lang['uploadxss']             = 'Слање је блокирано јер је потенцијално малициозног садржаја.';
+$lang['uploadsize']            = 'Послата датотека је превелика. (максимум је %s)';
+$lang['deletesucc']            = 'Фајл "%s" је избрисан.';
+$lang['deletefail']            = '"%s" није могао да буде избрисан - проверите дозволе.';
+$lang['mediainuse']            = 'Фајл "%s" није избрисан - још је у употреби.';
+$lang['namespaces']            = 'Именски простори';
+$lang['mediafiles']            = 'Доступни фајлови у';
+$lang['accessdenied']          = 'Немате дозволу да видите ову страницу.';
+$lang['mediausage']            = 'Користите следећу синтаксу за референцу ка овој датотеци:';
+$lang['mediaview']             = 'Прикажи оригиналну датотеку';
+$lang['mediaroot']             = 'почетак';
+$lang['mediaupload']           = 'Пошаљи датотеку у тренутни именски простор. Да бисте направили подпросторе, предвидите их у поље „Пошаљи као“ раздвојено двотачкама.';
+$lang['mediaextchange']        = 'Наставак датотеке је промењен из .%s у .%s!';
+$lang['reference']             = 'Референце за';
+$lang['ref_inuse']             = 'Фајл не може да буде избрисан јер га још увек користе следеће странице:';
+$lang['ref_hidden']            = 'Неке референце су на страницама за које немате дозволе за читање';
+$lang['hits']                  = 'Поготци';
+$lang['quickhits']             = 'Имена страница које се поклапају';
+$lang['toc']                   = 'Садржај';
+$lang['current']               = 'тренутно';
+$lang['yours']                 = 'Ваша верзија';
+$lang['diff']                  = 'прикажи разлике до тренутне верзије';
+$lang['diff2']                 = 'Прикажи разлике између одабраних ревизија';
+$lang['difflink']              = 'Постави везу ка овом компаративном приказу';
+$lang['diff_type']             = 'Погледај разлике:';
+$lang['diff_inline']           = 'У линији';
+$lang['diff_side']             = 'Једно до другог';
+$lang['diffprevrev']           = 'Претходна ревизија';
+$lang['diffnextrev']           = 'Следећа ревизија';
+$lang['difflastrev']           = 'Последња ревизија';
+$lang['diffbothprevrev']       = 'Обе стране последње ревизије';
+$lang['diffbothnextrev']       = 'Обе стране следеће ревизије';
+$lang['line']                  = 'Линија';
+$lang['breadcrumb']            = 'Траг:';
+$lang['youarehere']            = 'Сада сте овде:';
+$lang['lastmod']               = 'Последњи пут мењано:';
+$lang['by']                    = 'од';
+$lang['deleted']               = 'избрисано';
+$lang['created']               = 'направљено';
+$lang['restored']              = 'стара верзија повраћена (%s)';
+$lang['external_edit']         = 'спољна измена';
+$lang['summary']               = 'Сажетак измене';
+$lang['noflash']               = 'За приказивање ове врсте материјала потребан вам је <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a>.';
+$lang['download']              = 'Преузми снипет';
+$lang['tools']                 = 'Алатке';
+$lang['user_tools']            = 'Корисничке алатке';
+$lang['site_tools']            = 'Алатке сајта';
+$lang['page_tools']            = 'Алатке странице';
+$lang['skip_to_content']       = 'скочи на садржај';
+$lang['sidebar']               = 'Страничник';
+$lang['mail_newpage']          = 'страница додата:';
+$lang['mail_changed']          = 'страница измењена:';
+$lang['mail_subscribe_list']   = 'Странице промењене у именском простору:';
+$lang['mail_new_user']         = 'нови корисник:';
+$lang['mail_upload']           = 'послата датотека:';
+$lang['changes_type']          = 'Прикажи измене';
+$lang['pages_changes']         = 'Странице';
+$lang['media_changes']         = 'датотека';
+$lang['both_changes']          = 'И страница и датотека';
+$lang['qb_bold']               = 'Мастан текст';
+$lang['qb_italic']             = 'Курзивни текст';
+$lang['qb_underl']             = 'Подвучени текст';
+$lang['qb_code']               = 'Изворни код';
+$lang['qb_strike']             = 'Прецртани текст';
+$lang['qb_h1']                 = 'Наслов 1. нивоа';
+$lang['qb_h2']                 = 'Наслов 2. нивоа';
+$lang['qb_h3']                 = 'Наслов 3. нивоа';
+$lang['qb_h4']                 = 'Наслов 4. нивоа';
+$lang['qb_h5']                 = 'Наслов 5. нивоа';
+$lang['qb_h']                  = 'Наслов';
+$lang['qb_hs']                 = 'Одабери наслов';
+$lang['qb_hplus']              = 'Виши наслов';
+$lang['qb_hminus']             = 'Нижи наслов';
+$lang['qb_hequal']             = 'Наслов на истом нивоу';
+$lang['qb_link']               = 'Унутрашња веза';
+$lang['qb_extlink']            = 'Спољашња веза';
+$lang['qb_hr']                 = 'Хоризонтална линија';
+$lang['qb_ol']                 = 'Елемент уређене листе';
+$lang['qb_ul']                 = 'Елемент неуређене листе';
+$lang['qb_media']              = 'Додај слике и друге фајлове';
+$lang['qb_sig']                = 'Убаци потпис';
+$lang['qb_smileys']            = 'Смешко';
+$lang['qb_chars']              = 'Посебни карактери';
+$lang['upperns']               = 'Скочи на виши именски простор';
+$lang['metaedit']              = 'Измени мета-податке';
+$lang['metasaveerr']           = 'Записивање мета-података није било успешно';
+$lang['metasaveok']            = 'Мета-подаци су сачувани';
+$lang['img_title']             = 'Наслов:';
+$lang['img_caption']           = 'Назив:';
+$lang['img_date']              = 'Датум:';
+$lang['img_fname']             = 'Име фајла:';
+$lang['img_fsize']             = 'Величина:';
+$lang['img_artist']            = 'Фотограф:';
+$lang['img_copyr']             = 'Права копирања:';
+$lang['img_format']            = 'Формат:';
+$lang['img_camera']            = 'Камера:';
+$lang['img_keywords']          = 'Кључне речи:';
+$lang['img_width']             = 'Ширина:';
+$lang['img_height']            = 'Висина:';
+$lang['subscr_subscribe_success'] = '%s је додат на списак претплатника %s';
+$lang['subscr_subscribe_error'] = 'Грешка приликом додавања %s на списак претплатника %s';
+$lang['subscr_subscribe_noaddress'] = 'Не постоји адреса повезана са вашим подацима, стога вас не можемо додати на списак претплатника.';
+$lang['subscr_unsubscribe_success'] = '%s уклоњен са списка претплатника %s';
+$lang['subscr_unsubscribe_error'] = 'Грешка приликом уклањања %s са списка претплатника %s';
+$lang['subscr_already_subscribed'] = '%s је већ претплаћен на %s';
+$lang['subscr_not_subscribed'] = '%s још није претплаћен на %s';
+$lang['subscr_m_not_subscribed'] = 'Тренутно нисте претплаћени на ову страницу или именски простор.';
+$lang['subscr_m_new_header']   = 'Додај претплату';
+$lang['subscr_m_current_header'] = 'Тренутне претплате';
+$lang['subscr_m_unsubscribe']  = 'Уклони претплату';
+$lang['subscr_m_subscribe']    = 'Претплати се';
+$lang['subscr_m_receive']      = 'Прими';
+$lang['subscr_style_every']    = 'имејл о свакој промени';
+$lang['subscr_style_digest']   = 'скраћени имејл о променама за сваку страницу (сваких %.2f дана)';
+$lang['subscr_style_list']     = 'Списак страница промењених након последњег имејла (сваких %.2f дана)';
+$lang['authtempfail']          = 'Провера корисника је тренутно недоступна. Ако се ситуација настави, молимо Вас да обавестите администратора викија.';
+$lang['i_chooselang']          = 'Одаберите језик';
+$lang['i_installer']           = 'Докувики инсталација';
+$lang['i_wikiname']            = 'Назив викија';
+$lang['i_enableacl']           = 'Укључи ';
+$lang['i_superuser']           = 'Суперкорисник';
+$lang['i_problems']            = 'Инсталација је наишла на проблеме који су навадени у тексту испод. Не можете наставити даље док их не исправите.';
+$lang['i_modified']            = 'Из сигурносних разлога ова скрипта ради само са новом Dokuwiki инсталацијом. Требало би или да опет распакујете архиву преузету са сајта или да погледате <a href="http://dokuwiki.org/install">Dokuwiki инструкције за инсталацију</a>';
+$lang['i_funcna']              = 'ПХП функција <code>%s</code> није доступна. Можда је Ваш хостинг провајдер забранио из неког разлога?';
+$lang['i_phpver']              = '<code>%s</code> Верзија Вашег ПХПа је нижа од неопходне <code>%s</code>. Требало би да надоградите ПХП инсталацију.';
+$lang['i_mbfuncoverload']      = 'mbstring.func_overload мора бити искључен у датотеци php.ini да бисте користили Докувики.';
+$lang['i_permfail']            = 'DokuWiki нема дозволу писања у <code>%s</code>. Потребно је да поправите дозволе за ову фасциклу!';
+$lang['i_confexists']          = '<code>%s</code> већ постоји';
+$lang['i_writeerr']            = 'Не могу да направим <code>%s</code>. Проверите дозволе а затим ручно направите ову датотеку.';
+$lang['i_badhash']             = 'dokuwiki.php није препознат или је измењен (hash=<code>%s</code>)';
+$lang['i_badval']              = '<code>%s</code> - недозвољена или празна вредност';
+$lang['i_success']             = 'Подешавања су завршена. Сада можете обрисати датотеку install.php. Наставите у <a href="doku.php?id=wiki:welcome">Ваш нови DokuWiki</a>.';
+$lang['i_failure']             = 'Појавили су се проблеми при писању датотеке са подешавањима. Требало би да их ручно исправите пре него што ћете моћи да користите <a href="doku.php?id=wiki:welcome">Ваш нови DokuWiki</a>.';
+$lang['i_policy']              = 'Иницијалне корисничке дозволе';
+$lang['i_pol0']                = 'Отворени вики (читање, писање, слање датотека за све)';
+$lang['i_pol1']                = 'Јавни вики (читање за све, писање и слање датотека само за регистроване кориснике)';
+$lang['i_pol2']                = 'Затворени вики (читање, писање и слање датотека само за регистроване кориснике)';
+$lang['i_allowreg']            = 'Дозволи корисницима да се региструју';
+$lang['i_retry']               = 'Понови';
+$lang['i_license']             = 'Молимо вас, одаберите лиценцу под коју желите да ставите свој садржај:';
+$lang['i_license_none']        = 'Не приказуј податке о лиценци';
+$lang['i_pop_field']           = 'Помозите нам да побољшамо Докувики:';
+$lang['i_pop_label']           = 'Једном месечно шаљи анонимне податке о коришћењу програмерима Докувикија';
+$lang['recent_global']         = 'Тренутно пратите промене у именском простору <b>%s</b>. Такође, можете пратити <a href="%s">прмене на целом викију</a>.';
+$lang['years']                 = 'Пре %d година';
+$lang['months']                = 'Пре %d месеци';
+$lang['weeks']                 = 'Пре %d недеља';
+$lang['days']                  = 'Пре %d дана';
+$lang['hours']                 = 'Пре %d сати';
+$lang['minutes']               = 'Пре %d минута';
+$lang['seconds']               = 'Пре %d секунди';
+$lang['wordblock']             = 'Ваше измене нису сачуване јер садрже забрањен текст (спам)';
+$lang['media_uploadtab']       = 'Отпреми';
+$lang['media_searchtab']       = 'Претрага';
+$lang['media_file']            = 'Датотека';
+$lang['media_viewtab']         = 'Погледај';
+$lang['media_edittab']         = 'Уреди';
+$lang['media_historytab']      = 'Историјат';
+$lang['media_list_thumbs']     = 'Сличице';
+$lang['media_list_rows']       = 'Редови';
+$lang['media_sort_name']       = 'Име';
+$lang['media_sort_date']       = 'Датум';
+$lang['media_namespaces']      = 'Изабери именски простор';
+$lang['media_files']           = 'Датотеке у %s';
+$lang['media_upload']          = 'Отпреми на %s';
+$lang['media_search']          = 'Претражи у %s';
+$lang['media_view']            = '%s';
+$lang['media_viewold']         = '%s у %s';
+$lang['media_edit']            = 'Уреди %s';
+$lang['media_history']         = 'Историјат од %s';
+$lang['media_meta_edited']     = 'промењени мета-подаци';
+$lang['media_perm_read']       = 'Нажалост, немате довољно овлашћења за читање датотека.';
+$lang['media_perm_upload']     = 'Нажалост, немате довољно овлашћења за отпремање датотека.';
+$lang['media_update']          = 'Отпреми ново издање';
+$lang['media_restore']         = 'Поврати ово издање';
+$lang['media_acl_warning']     = 'Овај списак је можда непотпун због забрана на списку контроле приступа и скривених страница.';
+$lang['currentns']             = 'Тренутни именски простор';
+$lang['searchresult']          = 'Резултати претраге';
+$lang['plainhtml']             = 'Обичан HTML';
+$lang['wikimarkup']            = 'Вики маркап';
+$lang['page_nonexist_rev']     = 'Страница не постоји у %s. Касније је направљена у <a href="%s">%s</a>.';
+$lang['unable_to_parse_date']  = 'Не могу да обрадим код параметра "%s".';
+$lang['email_signature_text']  = 'Ову поруку је генерисао DokuWiki sa
+@DOKUWIKIURL@';
diff --git a/wiki/inc/lang/sr/locked.txt b/wiki/inc/lang/sr/locked.txt
new file mode 100644
index 0000000..4bcc0ac
--- /dev/null
+++ b/wiki/inc/lang/sr/locked.txt
@@ -0,0 +1,3 @@
+====== Страница је закључана ======
+
+Ову страница је други корисник у овом тренутку закључао за измене. Мораћете да сачекате док он не заврши са изменама или не истекне закључавање.
diff --git a/wiki/inc/lang/sr/login.txt b/wiki/inc/lang/sr/login.txt
new file mode 100644
index 0000000..c2f5a6f
--- /dev/null
+++ b/wiki/inc/lang/sr/login.txt
@@ -0,0 +1,4 @@
+====== Пријављивање ======
+
+Тренутно нисте пријављени! Унесите Ваше информације испод да бисте се пријавили. За то је неопходно да колачићи буду омогућен.
+
diff --git a/wiki/inc/lang/sr/mailtext.txt b/wiki/inc/lang/sr/mailtext.txt
new file mode 100644
index 0000000..ab9d717
--- /dev/null
+++ b/wiki/inc/lang/sr/mailtext.txt
@@ -0,0 +1,12 @@
+Страница на Вашем DokuWiki-ју је додата или измењена. Ево детаља
+
+Датум                 : @DATE@
+Веб читач           : @BROWSER@
+ИП адреса          : @IPADDRESS@
+Име домаћина     : @HOSTNAME@
+Стара ревизија    : @OLDPAGE@
+Нова ревизија      : @NEWPAGE@
+Сажетак измена   : @SUMMARY@
+Корисник             : @USER@
+
+@DIFF@
diff --git a/wiki/inc/lang/sr/newpage.txt b/wiki/inc/lang/sr/newpage.txt
new file mode 100644
index 0000000..40a36e6
--- /dev/null
+++ b/wiki/inc/lang/sr/newpage.txt
@@ -0,0 +1,3 @@
+====== Ова тема још увек не постоји ======
+
+Пратили сте везу до теме која још увек не постоји. Можете да је направите користећи дугме ''Направи ову страницу''.
diff --git a/wiki/inc/lang/sr/norev.txt b/wiki/inc/lang/sr/norev.txt
new file mode 100644
index 0000000..73f8d0b
--- /dev/null
+++ b/wiki/inc/lang/sr/norev.txt
@@ -0,0 +1,4 @@
+====== Не постоји таква ревизија ======
+
+Задата ревизија не постоји. Искористите дугме ''Старе ревизије'' да излистате старе ревизије овог документа.
+
diff --git a/wiki/inc/lang/sr/password.txt b/wiki/inc/lang/sr/password.txt
new file mode 100644
index 0000000..bd2cf32
--- /dev/null
+++ b/wiki/inc/lang/sr/password.txt
@@ -0,0 +1,6 @@
+Здраво @FULLNAME@!
+
+Ево Ваших података за @TITLE@ на @DOKUWIKIURL@
+
+Корисничко име : @LOGIN@
+Лозинка          : @PASSWORD@
diff --git a/wiki/inc/lang/sr/preview.txt b/wiki/inc/lang/sr/preview.txt
new file mode 100644
index 0000000..be92888
--- /dev/null
+++ b/wiki/inc/lang/sr/preview.txt
@@ -0,0 +1,4 @@
+====== Преглед ======
+
+Ово је преглед тога како би Ваш текст изгледао. Не заборавите: он још **није сачуван**!
+
diff --git a/wiki/inc/lang/sr/pwconfirm.txt b/wiki/inc/lang/sr/pwconfirm.txt
new file mode 100644
index 0000000..ce44cd5
--- /dev/null
+++ b/wiki/inc/lang/sr/pwconfirm.txt
@@ -0,0 +1,9 @@
+Здраво @FULLNAME@!
+
+Неко је затражио нову лозинку за Ваш налог @TITLE@ на @DOKUWIKIURL@
+
+Ако то нисте Ви, само игноришите ову поруку.
+
+У супротном, да бисте потврдили захтев кликните на следећи линк:
+
+@CONFIRM@
diff --git a/wiki/inc/lang/sr/read.txt b/wiki/inc/lang/sr/read.txt
new file mode 100644
index 0000000..c2d9fff
--- /dev/null
+++ b/wiki/inc/lang/sr/read.txt
@@ -0,0 +1,2 @@
+Ова страница је само за читање. Можете да погледате изворни код, али не можете да је мењате. Обратите се администратору ако мислите да то није уреду.
+
diff --git a/wiki/inc/lang/sr/recent.txt b/wiki/inc/lang/sr/recent.txt
new file mode 100644
index 0000000..54c0c26
--- /dev/null
+++ b/wiki/inc/lang/sr/recent.txt
@@ -0,0 +1,5 @@
+====== Скорије измене ======
+
+Следеће странице су биле измењене у скорије време.
+
+
diff --git a/wiki/inc/lang/sr/register.txt b/wiki/inc/lang/sr/register.txt
new file mode 100644
index 0000000..a553b7a
--- /dev/null
+++ b/wiki/inc/lang/sr/register.txt
@@ -0,0 +1,4 @@
+====== Региструјте се као нови корисник ======
+
+Попуните све информације испод како би сте направили нови налог на овом викију. Обавезно упишите **тачну е-адресу** - Ваша нова лозинка ће тамо бити послата. Корисничко име би требало да буде исправно [[doku>pagename|име странице]]
+
diff --git a/wiki/inc/lang/sr/registermail.txt b/wiki/inc/lang/sr/registermail.txt
new file mode 100644
index 0000000..9dca20c
--- /dev/null
+++ b/wiki/inc/lang/sr/registermail.txt
@@ -0,0 +1,10 @@
+Регистрован је нови корисник. Ово су детаљи:
+
+Корисничко име: @NEWUSER@
+Име и презиме: @NEWNAME@
+Е-адреса: @NEWEMAIL@
+
+Датум: @DATE@
+Веб читач: @BROWSER@
+ИП адреса: @IPADDRESS@
+Домаћин: @HOSTNAME@
diff --git a/wiki/inc/lang/sr/resendpwd.txt b/wiki/inc/lang/sr/resendpwd.txt
new file mode 100644
index 0000000..7f6623d
--- /dev/null
+++ b/wiki/inc/lang/sr/resendpwd.txt
@@ -0,0 +1,3 @@
+====== Пошаљи нову лозинку ======
+
+Молим Вас унесите корисничко име у форму да бисте затражили нову лозинку за Ваш налог на овом викију. Потврдни линк ће бити послат на е-адресу коју сте користили на регистрацији.
\ No newline at end of file
diff --git a/wiki/inc/lang/sr/resetpwd.txt b/wiki/inc/lang/sr/resetpwd.txt
new file mode 100644
index 0000000..642de98
--- /dev/null
+++ b/wiki/inc/lang/sr/resetpwd.txt
@@ -0,0 +1,3 @@
+====== Поставите нову лозинку ======
+
+Унесите нову лозинку за ваш налог на овом викију.
\ No newline at end of file
diff --git a/wiki/inc/lang/sr/revisions.txt b/wiki/inc/lang/sr/revisions.txt
new file mode 100644
index 0000000..1ca995a
--- /dev/null
+++ b/wiki/inc/lang/sr/revisions.txt
@@ -0,0 +1,4 @@
+====== Старе ревизије ======
+
+Ово су старије ревизије тренутног документа. Да би сте повратили стару ревизију, изаберите је одоздо, кликните на ''Измени страницу'' и сачувајте је.
+
diff --git a/wiki/inc/lang/sr/searchpage.txt b/wiki/inc/lang/sr/searchpage.txt
new file mode 100644
index 0000000..4663f47
--- /dev/null
+++ b/wiki/inc/lang/sr/searchpage.txt
@@ -0,0 +1,4 @@
+====== Претрага ======
+
+Испод можете да нађете резултате Ваше претраге. @CREATEPAGEINFO@
+
diff --git a/wiki/inc/lang/sr/showrev.txt b/wiki/inc/lang/sr/showrev.txt
new file mode 100644
index 0000000..f2aabb2
--- /dev/null
+++ b/wiki/inc/lang/sr/showrev.txt
@@ -0,0 +1,2 @@
+**Ово је стара верзија документа!**
+----
diff --git a/wiki/inc/lang/sr/stopwords.txt b/wiki/inc/lang/sr/stopwords.txt
new file mode 100644
index 0000000..78093e2
--- /dev/null
+++ b/wiki/inc/lang/sr/stopwords.txt
@@ -0,0 +1,12 @@
+# Ово је листа речи које се неће индексирати, по једна реч у реду
+# Када мењате ову датотеку проверите да ли је нови ред записан по UNIX систему
+# Нема потребе уносити речи краће од 3 слова - оне се прескачу иначе
+ваш
+они
+њихов
+како
+ово
+шта
+кад
+где
+www
diff --git a/wiki/inc/lang/sr/subscr_digest.txt b/wiki/inc/lang/sr/subscr_digest.txt
new file mode 100644
index 0000000..aaba525
--- /dev/null
+++ b/wiki/inc/lang/sr/subscr_digest.txt
@@ -0,0 +1,16 @@
+Здраво!
+
+Страница @PAGE@ под Вики насловом @TITLE@ је промењена.
+Ово су промене:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Стара верзија: @OLDPAGE@
+Нова верзија: @NEWPAGE@
+
+
+Да бисте поништили обавештења о променама страница, улогујте се на Вики овде
+@DOKUWIKIURL@ а затим посетите
+@SUBSCRIBE@ и поништите обавештавање о променама страница и/или именских простора..
diff --git a/wiki/inc/lang/sr/subscr_form.txt b/wiki/inc/lang/sr/subscr_form.txt
new file mode 100644
index 0000000..9bf72e4
--- /dev/null
+++ b/wiki/inc/lang/sr/subscr_form.txt
@@ -0,0 +1,3 @@
+===== Управљање претплатама =====
+
+Ова страница вам омогућава да управљате својим претплатама на страницу и именски простор на којима се налазите.
\ No newline at end of file
diff --git a/wiki/inc/lang/sr/subscr_list.txt b/wiki/inc/lang/sr/subscr_list.txt
new file mode 100644
index 0000000..09df43d
--- /dev/null
+++ b/wiki/inc/lang/sr/subscr_list.txt
@@ -0,0 +1,13 @@
+Здраво!
+
+Страница у именском простору @PAGE@ под Вики насловом @TITLE@ је промењена.
+Ово су промењене странице:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+
+Да бисте поништили обавештења о променама страница, улогујте се на Вики овде
+@DOKUWIKIURL@ а затим посетите
+@SUBSCRIBE@ и поништите обавештавање о променама страница и/или именских простора..
diff --git a/wiki/inc/lang/sr/subscr_single.txt b/wiki/inc/lang/sr/subscr_single.txt
new file mode 100644
index 0000000..67102dd
--- /dev/null
+++ b/wiki/inc/lang/sr/subscr_single.txt
@@ -0,0 +1,19 @@
+Здраво!
+
+Страница @PAGE@ под Вики насловом @TITLE@ је промењена.
+Ово су промене:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Датум : @DATE@
+Корисникr : @USER@
+Измени сиже: @SUMMARY@
+Стара верзија: @OLDPAGE@
+Нова верзија: @NEWPAGE@
+
+
+Да бисте поништили обавештења о променама страница, улогујте се на Бики овде
+@DOKUWIKIURL@ а затим посетите
+@SUBSCRIBE@ и поништите обавештавање о променама страница и/или именских простора..
diff --git a/wiki/inc/lang/sr/updateprofile.txt b/wiki/inc/lang/sr/updateprofile.txt
new file mode 100644
index 0000000..1f31b22
--- /dev/null
+++ b/wiki/inc/lang/sr/updateprofile.txt
@@ -0,0 +1,3 @@
+====== Ажурирање Вашег профила ======
+
+Потребно је попунити само она поља која желите да промените. Поље Корисничко име не можете да промените.
\ No newline at end of file
diff --git a/wiki/inc/lang/sr/uploadmail.txt b/wiki/inc/lang/sr/uploadmail.txt
new file mode 100644
index 0000000..0db6f9e
--- /dev/null
+++ b/wiki/inc/lang/sr/uploadmail.txt
@@ -0,0 +1,10 @@
+Нова датотека је послата на Ваш DokuWiki. Ово су њени детањи:
+
+Датотека: @MEDIA@
+Датум: @DATE@
+Веб читач: @BROWSER@
+ИП адреса: @IPADDRESS@
+Домаћин: @HOSTNAME@
+Величина: @SIZE@
+MIME тип: @MIME@
+Корисник: @USER@
diff --git a/wiki/inc/lang/sv/admin.txt b/wiki/inc/lang/sv/admin.txt
new file mode 100644
index 0000000..10887da
--- /dev/null
+++ b/wiki/inc/lang/sv/admin.txt
@@ -0,0 +1,4 @@
+====== Administration ======
+
+Nedan hittar du en lista över de tillgängliga administrativa uppgifterna i DokuWiki.
+
diff --git a/wiki/inc/lang/sv/adminplugins.txt b/wiki/inc/lang/sv/adminplugins.txt
new file mode 100644
index 0000000..2429b93
--- /dev/null
+++ b/wiki/inc/lang/sv/adminplugins.txt
@@ -0,0 +1 @@
+===== Ytterligare Tillägg =====
\ No newline at end of file
diff --git a/wiki/inc/lang/sv/backlinks.txt b/wiki/inc/lang/sv/backlinks.txt
new file mode 100644
index 0000000..c907c8e
--- /dev/null
+++ b/wiki/inc/lang/sv/backlinks.txt
@@ -0,0 +1,3 @@
+====== Tillbakalänkar ======
+
+Detta är en lista över sidor som verkar länka tillbaka till den aktuella sidan.
diff --git a/wiki/inc/lang/sv/conflict.txt b/wiki/inc/lang/sv/conflict.txt
new file mode 100644
index 0000000..42168d1
--- /dev/null
+++ b/wiki/inc/lang/sv/conflict.txt
@@ -0,0 +1,6 @@
+====== Det finns en senare version ======
+
+Det finns en senare version av dokumentet du har redigerat. Detta kan hända när en annan användare redigerar dokumentet samtidigt som du.
+
+Granska skillnaderna som visas nedan noga, och välj sedan vilken version du vill behålla. Om du väljer ''spara'', så kommer din version att sparas. Välj ''avbryt'' för att behålla den nuvarande versionen.
+
diff --git a/wiki/inc/lang/sv/denied.txt b/wiki/inc/lang/sv/denied.txt
new file mode 100644
index 0000000..7ae09b8
--- /dev/null
+++ b/wiki/inc/lang/sv/denied.txt
@@ -0,0 +1,4 @@
+====== Åtkomst nekad ======
+
+Tyvärr, du har inte behörighet att fortsätta.
+
diff --git a/wiki/inc/lang/sv/diff.txt b/wiki/inc/lang/sv/diff.txt
new file mode 100644
index 0000000..9fb8c20
--- /dev/null
+++ b/wiki/inc/lang/sv/diff.txt
@@ -0,0 +1,4 @@
+====== Skillnader ======
+
+Här visas skillnader mellan den valda versionen och den nuvarande versionen av sidan.
+
diff --git a/wiki/inc/lang/sv/draft.txt b/wiki/inc/lang/sv/draft.txt
new file mode 100644
index 0000000..3749ad0
--- /dev/null
+++ b/wiki/inc/lang/sv/draft.txt
@@ -0,0 +1,6 @@
+====== Utkast hittat ======
+
+Din senaste redigering av sidan avslutades inte på ett korrekt sätt. DokuWiki sparade automatiskt ett utkast under tiden du arbetade, och nu kan du använda det för att fortsätta redigeringen. Nedan kan du se det innehåll som sparats från din förra session.
+
+Bestäm om du vill //återskapa// din förlorade redigeringssession, //radera// det automatiskt sparade utkastet eller //avbryta// redigeringen.
+
diff --git a/wiki/inc/lang/sv/edit.txt b/wiki/inc/lang/sv/edit.txt
new file mode 100644
index 0000000..187b11f
--- /dev/null
+++ b/wiki/inc/lang/sv/edit.txt
@@ -0,0 +1,2 @@
+Redigera sidan och klicka ''Spara''. Se [[wiki:syntax]] för Wikisyntax. Redigera bara sidan om du kan **förbättra** den. Om du vill testa hur saker och ting fungerar, gör det på [[playground:playground|lekplatsen]].
+
diff --git a/wiki/inc/lang/sv/editrev.txt b/wiki/inc/lang/sv/editrev.txt
new file mode 100644
index 0000000..8bd1adb
--- /dev/null
+++ b/wiki/inc/lang/sv/editrev.txt
@@ -0,0 +1,2 @@
+**Du har hämtat en tidigare version av dokumentet!** Om du sparar den så kommer du att skapa en ny version med detta innehåll.
+----
diff --git a/wiki/inc/lang/sv/index.txt b/wiki/inc/lang/sv/index.txt
new file mode 100644
index 0000000..24d715b
--- /dev/null
+++ b/wiki/inc/lang/sv/index.txt
@@ -0,0 +1,4 @@
+====== Innehållsförteckning ======
+
+Detta är en innehållsförteckning över alla tillgängliga sidor, sorterad efter [[doku>namespaces|namnrymder]].
+
diff --git a/wiki/inc/lang/sv/install.html b/wiki/inc/lang/sv/install.html
new file mode 100644
index 0000000..a6b3ade
--- /dev/null
+++ b/wiki/inc/lang/sv/install.html
@@ -0,0 +1,25 @@
+<p>Denna sida hjälper dig med nyinstallation och inställningar för
+<a href="http://dokuwiki.org">Dokuwiki</a>. Mer information om
+installationsprogrammet finns på dess egen
+<a href="http://dokuwiki.org/installer">dokumentationssida</a>.</p>
+
+<p>DokuWiki använder vanliga filer för att lagra wikisidor och annan
+information som här till sidorna (till exempel bilder, sökindex, gamla
+versioner, etc).  För att kunna fungera
+<strong>måste</strong> DokuWiki ha skrivrättigheter i de kataloger där
+filerna ligger. Detta installationsprogram kan inte ändra rättigheter
+på kataloger. Det måste normalt göras direkt på en kommandorad, eller
+om du använder ett webbhotell, via FTP eller din leverantörs kontrollpanel
+(till exempel cPanel).</p>
+
+<p>Detta installationsprogram anpassar inställningarna i din DokuWiki för
+<abbr title="access control list">ACL</abbr> (behörighetslista), vilket i sin tur gör att
+administratören kan logga in och komma åt DokuWikis administrationsmenu för
+att installera insticksmoduler, hantera användare, hantera behörighet till
+wikisidor och ändra inställningar. ACL är inget krav för att DokuWiki ska
+fungera, men det förenklar administrationen.</p>
+
+<p>Erfarna användare, eller användare med särskilda behov, kan använda dessa
+länkar för att hitta mer detaljer om
+<a href="http://dokuwiki.org/install">installation</a>
+och <a href="http://dokuwiki.org/config">inställningar</a>.</p>
diff --git a/wiki/inc/lang/sv/jquery.ui.datepicker.js b/wiki/inc/lang/sv/jquery.ui.datepicker.js
new file mode 100644
index 0000000..92686ef
--- /dev/null
+++ b/wiki/inc/lang/sv/jquery.ui.datepicker.js
@@ -0,0 +1,37 @@
+/* Swedish initialisation for the jQuery UI date picker plugin. */
+/* Written by Anders Ekdahl ( anders@nomadiz.se). */
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "../widgets/datepicker" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery.datepicker );
+	}
+}( function( datepicker ) {
+
+datepicker.regional.sv = {
+	closeText: "Stäng",
+	prevText: "&#xAB;Förra",
+	nextText: "Nästa&#xBB;",
+	currentText: "Idag",
+	monthNames: [ "Januari","Februari","Mars","April","Maj","Juni",
+	"Juli","Augusti","September","Oktober","November","December" ],
+	monthNamesShort: [ "Jan","Feb","Mar","Apr","Maj","Jun",
+	"Jul","Aug","Sep","Okt","Nov","Dec" ],
+	dayNamesShort: [ "Sön","Mån","Tis","Ons","Tor","Fre","Lör" ],
+	dayNames: [ "Söndag","Måndag","Tisdag","Onsdag","Torsdag","Fredag","Lördag" ],
+	dayNamesMin: [ "Sö","Må","Ti","On","To","Fr","Lö" ],
+	weekHeader: "Ve",
+	dateFormat: "yy-mm-dd",
+	firstDay: 1,
+	isRTL: false,
+	showMonthAfterYear: false,
+	yearSuffix: "" };
+datepicker.setDefaults( datepicker.regional.sv );
+
+return datepicker.regional.sv;
+
+} ) );
diff --git a/wiki/inc/lang/sv/lang.php b/wiki/inc/lang/sv/lang.php
new file mode 100644
index 0000000..1486421
--- /dev/null
+++ b/wiki/inc/lang/sv/lang.php
@@ -0,0 +1,351 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Tor Härnqvist <tor@harnqvist.se>
+ * @author Joaquim Homrighausen <joho@webbplatsen.se>
+ * @author Per Foreby <per@foreby.se>
+ * @author Nicklas Henriksson <nicklas[at]nihe.se>
+ * @author Håkan Sandell <hakan.sandell@home.se>
+ * @author Dennis Karlsson
+ * @author Tormod Otter Johansson <tormod@latast.se>
+ * @author Tormod Johansson <tormod.otter.johansson@gmail.com>
+ * @author Pontus Bergendahl <pontus.bergendahl@gmail.com>
+ * @author Emil Lind <emil@sys.nu>
+ * @author Bogge Bogge <bogge@bogge.com>
+ * @author Peter Åström <eaustreum@gmail.com>
+ * @author Henrik <henrik@idealis.se>
+ * @author Hans Iwan Bratt <hibratt@gmail.com>
+ * @author Mikael Bergström <krank23@gmail.com>
+ */
+$lang['encoding']              = 'utf-8';
+$lang['direction']             = 'ltr';
+$lang['doublequoteopening']    = '”';
+$lang['doublequoteclosing']    = '”';
+$lang['singlequoteopening']    = '’';
+$lang['singlequoteclosing']    = '’';
+$lang['apostrophe']            = '’';
+$lang['btn_edit']              = 'Redigera sidan';
+$lang['btn_source']            = 'Visa källkod';
+$lang['btn_show']              = 'Visa sidan';
+$lang['btn_create']            = 'Skapa sidan';
+$lang['btn_search']            = 'Sök';
+$lang['btn_save']              = 'Spara';
+$lang['btn_preview']           = 'Granska';
+$lang['btn_top']               = 'Till början av sidan';
+$lang['btn_newer']             = '<< nyare';
+$lang['btn_older']             = 'äldre >>';
+$lang['btn_revs']              = 'Historik';
+$lang['btn_recent']            = 'Nyligen ändrat';
+$lang['btn_upload']            = 'Ladda upp';
+$lang['btn_cancel']            = 'Avbryt';
+$lang['btn_index']             = 'Index';
+$lang['btn_secedit']           = 'Redigera';
+$lang['btn_login']             = 'Logga in';
+$lang['btn_logout']            = 'Logga ut';
+$lang['btn_admin']             = 'Admin';
+$lang['btn_update']            = 'Uppdatera';
+$lang['btn_delete']            = 'Radera';
+$lang['btn_back']              = 'Tillbaka';
+$lang['btn_backlink']          = 'Tillbakalänkar';
+$lang['btn_subscribe']         = 'Prenumerera på ändringar';
+$lang['btn_profile']           = 'Uppdatera profil';
+$lang['btn_reset']             = 'Återställ';
+$lang['btn_resendpwd']         = 'Skapa nytt lösenord';
+$lang['btn_draft']             = 'Redigera utkast';
+$lang['btn_recover']           = 'Återskapa utkast';
+$lang['btn_draftdel']          = 'Radera utkast';
+$lang['btn_revert']            = 'Återställ';
+$lang['btn_register']          = 'Registrera';
+$lang['btn_apply']             = 'Verkställ';
+$lang['btn_media']             = 'Mediahanteraren';
+$lang['btn_deleteuser']        = 'Ta bort Mitt Konto';
+$lang['btn_img_backto']        = 'Tillbaka till %s';
+$lang['btn_mediaManager']      = 'Se mediahanteraren';
+$lang['loggedinas']            = 'Inloggad som:';
+$lang['user']                  = 'Användarnamn';
+$lang['pass']                  = 'Lösenord';
+$lang['newpass']               = 'Nytt lösenord';
+$lang['oldpass']               = 'Bekräfta nuvarande lösenord';
+$lang['passchk']               = 'en gång till';
+$lang['remember']              = 'Kom ihåg mig';
+$lang['fullname']              = 'Namn';
+$lang['email']                 = 'E-post';
+$lang['profile']               = 'Användarprofil';
+$lang['badlogin']              = 'Felaktigt användarnamn eller lösenord.';
+$lang['badpassconfirm']        = 'Ledsen, lösenordet var felaktigt';
+$lang['minoredit']             = 'Små ändringar';
+$lang['draftdate']             = 'Utkast automatiskt sparat';
+$lang['nosecedit']             = 'Sidan ändrades medan du skrev, sektionsinformationen var inte uppdaterad. Laddar hela sidan istället.';
+$lang['regmissing']            = 'Du måste fylla i alla fälten.';
+$lang['reguexists']            = 'Det finns redan en användare med det användarnamnet.';
+$lang['regsuccess']            = 'Användarkontot skapat, lösenordet har skickats via e-post.';
+$lang['regsuccess2']           = 'Användarkontot skapat.';
+$lang['regfail']               = 'Användaren kunde inte skapas.';
+$lang['regmailfail']           = 'Ett fel uppstod när ditt lösenord skulle skickas via e-post. Var god kontakta administratören!';
+$lang['regbadmail']            = 'Den angivna e-postadressen verkar vara ogiltig - om du anser detta felaktigt, var god kontakta administratören';
+$lang['regbadpass']            = 'De två angivna lösenorden är inte identiska. Försök igen.';
+$lang['regpwmail']             = 'Ditt DokuWikilösenord';
+$lang['reghere']               = 'Har du inte ett konto än? Skaffa ett';
+$lang['profna']                = 'Denna wiki stödjer inte ändringar av profiler';
+$lang['profnochange']          = 'Ingenting ändrades, inget att göra.';
+$lang['profnoempty']           = 'Namn och e-postadress måste fyllas i.';
+$lang['profchanged']           = 'Användarprofilen uppdaterad.';
+$lang['profnodelete']          = 'Den här wiki:n stödjer ej borttagning av användare';
+$lang['profdeleteuser']        = 'Radera kontot';
+$lang['profdeleted']           = 'Ditt användarkonto har raderats från den här wiki:n';
+$lang['profconfdelete']        = 'Jag vill ta bort mitt konto/inlogg på den här wiki:n <br/> Denna åtgärd går ej att ångra.';
+$lang['profconfdeletemissing'] = 'Bekräftelse-kryssrutan är ej markerad';
+$lang['proffail']              = 'Användarprofilen uppdaterades ej.';
+$lang['pwdforget']             = 'Glömt ditt lösenord? Ordna ett nytt';
+$lang['resendna']              = 'Den här wikin stödjer inte utskick av lösenord.';
+$lang['resendpwd']             = 'Sätt lösenord för';
+$lang['resendpwdmissing']      = 'Du måste fylla i alla fält.';
+$lang['resendpwdnouser']       = 'Den här användaren hittas inte i databasen.';
+$lang['resendpwdbadauth']      = 'Den här verifieringskoden är inte giltig. Kontrollera att du använde hela verifieringslänken.';
+$lang['resendpwdconfirm']      = 'En verifieringslänk har skickats med e-post.';
+$lang['resendpwdsuccess']      = 'Ditt nya lösenord har skickats med e-post.';
+$lang['license']               = 'Om inte annat angivet, innehållet i denna wiki är licensierat under följande licenser:';
+$lang['licenseok']             = 'Notera: Genom att ändra i denna sidan så accepterar du att licensiera ditt bidrag under följande licenser:';
+$lang['searchmedia']           = 'Sök efter filnamn:';
+$lang['searchmedia_in']        = 'Sök i %s';
+$lang['txt_upload']            = 'Välj fil att ladda upp:';
+$lang['txt_filename']          = 'Ladda upp som (ej obligatoriskt):';
+$lang['txt_overwrt']           = 'Skriv över befintlig fil';
+$lang['maxuploadsize']         = 'Max %s per uppladdad fil.';
+$lang['lockedby']              = 'Låst av:';
+$lang['lockexpire']            = 'Lås upphör att gälla:';
+$lang['js']['willexpire']      = 'Ditt redigeringslås för detta dokument kommer snart att upphöra.\nFör att undvika versionskonflikter bör du förhandsgranska ditt dokument för att förlänga redigeringslåset.';
+$lang['js']['notsavedyet']     = 'Det finns ändringar som inte är sparade.
+Är du säker på att du vill fortsätta?';
+$lang['js']['searchmedia']     = 'Sök efter filer';
+$lang['js']['keepopen']        = 'Lämna fönstret öppet efter val av fil';
+$lang['js']['hidedetails']     = 'Dölj detaljer';
+$lang['js']['mediatitle']      = 'Länkinställningar';
+$lang['js']['mediadisplay']    = 'Länktyp';
+$lang['js']['mediaalign']      = 'Justering';
+$lang['js']['mediasize']       = 'Bildstorlek';
+$lang['js']['mediatarget']     = 'Länköppning';
+$lang['js']['mediaclose']      = 'Stäng';
+$lang['js']['mediainsert']     = 'Infoga';
+$lang['js']['mediadisplayimg'] = 'Visa bilden.';
+$lang['js']['mediadisplaylnk'] = 'Visa endast länken.';
+$lang['js']['mediasmall']      = 'Liten storlek';
+$lang['js']['mediamedium']     = 'Mellanstor storlek';
+$lang['js']['medialarge']      = 'Stor storlek';
+$lang['js']['mediaoriginal']   = 'Originalstorlek';
+$lang['js']['medialnk']        = 'Länk till detalj sida';
+$lang['js']['mediadirect']     = 'Direktlänk till originalet';
+$lang['js']['medianolnk']      = 'Ingen länk';
+$lang['js']['medianolink']     = 'Länka inte bilden';
+$lang['js']['medialeft']       = 'Justera bilden till vänster.';
+$lang['js']['mediaright']      = 'Justera bilden till höger.';
+$lang['js']['mediacenter']     = 'Centrera bilden.';
+$lang['js']['nosmblinks']      = 'Länkning till Windowsresurser fungerar bara med Microsofts Internet Explorer.
+Du kan fortfarande klippa och klistra in länken om du använder en annan webbläsare än MSIE.';
+$lang['js']['linkwiz']         = 'Snabbguide Länkar';
+$lang['js']['linkto']          = 'Länk till:';
+$lang['js']['del_confirm']     = 'Vill du verkligen radera?';
+$lang['js']['restore_confirm'] = 'Återställa denna version?';
+$lang['js']['media_diff']      = 'Se skillnader:';
+$lang['js']['media_diff_both'] = 'Sida vid sida';
+$lang['js']['media_diff_opacity'] = 'Genomskinlig';
+$lang['js']['media_diff_portions'] = 'Svep';
+$lang['js']['media_select']    = 'Välj filer...';
+$lang['js']['media_upload_btn'] = 'Ladda upp';
+$lang['js']['media_done_btn']  = 'Färdig';
+$lang['js']['media_drop']      = 'Släpp filer här för att ladda upp';
+$lang['js']['media_cancel']    = 'ta bort';
+$lang['js']['media_overwrt']   = 'Skriv över existerande filer';
+$lang['rssfailed']             = 'Ett fel uppstod när detta RSS-flöde skulle hämtas: ';
+$lang['nothingfound']          = 'Inga filer hittades.';
+$lang['mediaselect']           = 'Mediafiler';
+$lang['uploadsucc']            = 'Uppladdningen lyckades';
+$lang['uploadfail']            = 'Uppladdningen misslyckades, fel filskydd?';
+$lang['uploadwrong']           = 'Uppladdning nekad. Filändelsen är inte tillåten!';
+$lang['uploadexist']           = 'Filen finns redan. Ingenting gjordes.';
+$lang['uploadbadcontent']      = 'Det uppladdade innehållet stämde inte överens med filändelsen %s.';
+$lang['uploadspam']            = 'Uppladdningen stoppades av spärrlistan för spam.';
+$lang['uploadxss']             = 'Uppladdningen stoppades på grund av eventuellt skadligt innehåll.';
+$lang['uploadsize']            = 'Den uppladdade filen är för stor. (max. %s)';
+$lang['deletesucc']            = 'Filen "%s" har raderats.';
+$lang['deletefail']            = 'Kunde inte radera "%s" - kontrollera filskydd.';
+$lang['mediainuse']            = 'Filen "%s" har inte raderats - den används fortfarande.';
+$lang['namespaces']            = 'Namnrymder';
+$lang['mediafiles']            = 'Tillgängliga filer i';
+$lang['accessdenied']          = 'Du får inte läsa den här sidan.';
+$lang['mediausage']            = 'Använd följande syntax för att referera till denna fil:';
+$lang['mediaview']             = 'Visa originalfilen';
+$lang['mediaroot']             = 'rot';
+$lang['mediaupload']           = 'Här kan du ladda upp en fil till den nuvarande namnrymden. För att skapa undernamnrymder, skriv dem före filnamnet under "Ladda upp som". Separera namnrymd och filnamn med kolon.';
+$lang['mediaextchange']        = 'Filändelsen ändrad från .%s till .%s!';
+$lang['reference']             = 'Referenser till';
+$lang['ref_inuse']             = 'Filen kan inte raderas eftersom den fortfarande används av följande sidor:';
+$lang['ref_hidden']            = 'Vissa referenser är på sidor som du inte har rätt att läsa';
+$lang['hits']                  = 'Träffar';
+$lang['quickhits']             = 'Matchande sidnamn';
+$lang['toc']                   = 'Innehållsförteckning';
+$lang['current']               = 'aktuell';
+$lang['yours']                 = 'Din version';
+$lang['diff']                  = 'visa skillnader mot aktuell version';
+$lang['diff2']                 = 'Visa skillnader mellan valda versioner';
+$lang['difflink']              = 'Länk till den här jämförelsesidan';
+$lang['diff_type']             = 'Visa skillnader:';
+$lang['diff_side']             = 'Sida vid sida';
+$lang['diffprevrev']           = 'Föregående version.';
+$lang['diffnextrev']           = 'Nästa version.';
+$lang['difflastrev']           = 'Senaste version.';
+$lang['line']                  = 'Rad';
+$lang['breadcrumb']            = 'Spår:';
+$lang['youarehere']            = 'Här är du:';
+$lang['lastmod']               = 'Senast uppdaterad:';
+$lang['by']                    = 'av';
+$lang['deleted']               = 'raderad';
+$lang['created']               = 'skapad';
+$lang['restored']              = 'tidigare version återställd (%s)';
+$lang['external_edit']         = 'extern redigering';
+$lang['summary']               = 'Redigeringskommentar';
+$lang['noflash']               = '<a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> behövs för att visa detta innehåll.';
+$lang['download']              = 'Ladda ner kodfragmentet';
+$lang['tools']                 = 'Verktyg';
+$lang['user_tools']            = 'Användarverktyg';
+$lang['site_tools']            = 'Webbverktyg';
+$lang['page_tools']            = 'Sidverktyg';
+$lang['skip_to_content']       = 'hoppa till innehåll';
+$lang['sidebar']               = 'Sidmeny';
+$lang['mail_newpage']          = 'sida tillagd:';
+$lang['mail_changed']          = 'sida ändrad:';
+$lang['mail_subscribe_list']   = 'sidor ändrade i namnrymd:';
+$lang['mail_new_user']         = 'Ny användare:';
+$lang['mail_upload']           = 'fil uppladdad:';
+$lang['changes_type']          = 'Se ändringar av';
+$lang['pages_changes']         = 'Sidor';
+$lang['media_changes']         = 'Mediafiler';
+$lang['both_changes']          = 'Både sidor och mediafiler';
+$lang['qb_bold']               = 'Fet text';
+$lang['qb_italic']             = 'Kursiv text';
+$lang['qb_underl']             = 'Understruken text';
+$lang['qb_code']               = 'Kodtext';
+$lang['qb_strike']             = 'Överstruken text';
+$lang['qb_h1']                 = 'Rubrik nivå 1';
+$lang['qb_h2']                 = 'Rubrik nivå 2';
+$lang['qb_h3']                 = 'Rubrik nivå 3';
+$lang['qb_h4']                 = 'Rubrik nivå 4';
+$lang['qb_h5']                 = 'Rubrik nivå 5';
+$lang['qb_h']                  = 'Rubrik';
+$lang['qb_hs']                 = 'Välj Rubrik';
+$lang['qb_hplus']              = 'Större Rubrik';
+$lang['qb_hminus']             = 'Mindre Rubrik';
+$lang['qb_hequal']             = 'Rubrik samma nivå.';
+$lang['qb_link']               = 'Intern Länk';
+$lang['qb_extlink']            = 'Extern Länk';
+$lang['qb_hr']                 = 'Horisontell linje';
+$lang['qb_ol']                 = 'Punkt i sorterad lista';
+$lang['qb_ul']                 = 'Punkt i osorterad lista';
+$lang['qb_media']              = 'Lägg till bilder och andra filer';
+$lang['qb_sig']                = 'Infoga signatur';
+$lang['qb_smileys']            = 'Smileys';
+$lang['qb_chars']              = 'Specialtecken';
+$lang['upperns']               = 'hoppa till föräldernamnrymd';
+$lang['metaedit']              = 'Redigera metadata';
+$lang['metasaveerr']           = 'Skrivning av metadata misslyckades';
+$lang['metasaveok']            = 'Metadata sparad';
+$lang['img_title']             = 'Rubrik:';
+$lang['img_caption']           = 'Bildtext:';
+$lang['img_date']              = 'Datum:';
+$lang['img_fname']             = 'Filnamn:';
+$lang['img_fsize']             = 'Storlek:';
+$lang['img_artist']            = 'Fotograf:';
+$lang['img_copyr']             = 'Copyright:';
+$lang['img_format']            = 'Format:';
+$lang['img_camera']            = 'Kamera:';
+$lang['img_keywords']          = 'Nyckelord:';
+$lang['img_width']             = 'Bredd:';
+$lang['img_height']            = 'Höjd:';
+$lang['subscr_subscribe_success'] = 'La till %s till prenumerationslista %s';
+$lang['subscr_subscribe_error'] = 'Error att lägga till %s till prenumerationslista för %s';
+$lang['subscr_subscribe_noaddress'] = 'Det finns ingen adress associerad med din inloggning, du kan inte bli tillagd i prenumerationslistan';
+$lang['subscr_unsubscribe_success'] = '%s borttagen från prenumerationslistan för %s';
+$lang['subscr_unsubscribe_error'] = 'Fel vid borttagning av %s från prenumerationslista %s';
+$lang['subscr_already_subscribed'] = '%s prenumererar redan på %s';
+$lang['subscr_not_subscribed'] = '%s prenumererar inte på %s';
+$lang['subscr_m_not_subscribed'] = 'Du prenumererar inte på denna sida eller namnrymd.';
+$lang['subscr_m_new_header']   = 'Lägg till prenumeration';
+$lang['subscr_m_current_header'] = 'Nuvarande prenumerationer';
+$lang['subscr_m_unsubscribe']  = 'Avsluta prenumeration';
+$lang['subscr_m_subscribe']    = 'Prenumerera';
+$lang['subscr_m_receive']      = 'Ta emot';
+$lang['subscr_style_every']    = 'skicka epost vid varje ändring';
+$lang['subscr_style_digest']   = 'Samlings-e-brev av ändringar för varje sida (var %.2f dag)';
+$lang['subscr_style_list']     = 'lista över ändrade sidor sedan senaste e-post (varje %.2f dag)';
+$lang['authtempfail']          = 'Tillfälligt fel på användarautentisering. Om felet kvarstår, var vänlig meddela wikiadministratören.';
+$lang['i_chooselang']          = 'Välj språk';
+$lang['i_installer']           = 'Installation av DokuWiki';
+$lang['i_wikiname']            = 'Wikins namn';
+$lang['i_enableacl']           = 'Aktivera behörighetslistan (ACL) (rekommenderas)';
+$lang['i_superuser']           = 'Användarnamn för administratören';
+$lang['i_problems']            = 'Installationsprogrammet hittade några problem som visas nedan. Du kan inte fortsätta innan du har fixat dem.';
+$lang['i_modified']            = 'Av säkerhetsskäl fungerar det här skriptet bara med en ny och omodifierad installation av Dokuwiki.
+                         Du får antingen packa upp det nedladdade paketet på nytt, eller konsultera de kompletta
+                         <a href="http://dokuwiki.org/install">instruktionerna för installation av Dokuwiki</a>';
+$lang['i_funcna']              = 'PHP-funktionen <code>%s</code> är inte tillgänglig. Kanske ditt webbhotell har avaktiverat den av någon anledning?';
+$lang['i_phpver']              = 'Din PHP-version <code>%s</code> är lägre än vad som krävs <code>%s</code>. Du behöver uppgradera din PHP-installation.';
+$lang['i_permfail']            = '<code>%s</code> är inte skrivbar av DokuWiki. Du behöver ändra filskyddet på den här katalogen!';
+$lang['i_confexists']          = '<code>%s</code> finns redan';
+$lang['i_writeerr']            = 'Kan inte skapa <code>%s</code>. Kontrollera filskyddet på kataloger/filer och skapa filen manuellt.';
+$lang['i_badhash']             = 'okänd eller ändrad dokuwiki.php (hash=<code>%s</code>)';
+$lang['i_badval']              = '<code>%s</code> - felaktig eller blank';
+$lang['i_success']             = 'Konfigurationen avslutades utan fel. Du kan radera filen install.php nu. Fortsätt till
+                        <a href="doku.php?id=wiki:welcome">din nya DokuWiki</a>.';
+$lang['i_failure']             = 'Fel uppstod vid skrivning av konfigurationsfilerna. Du kan behöva ordna till dem manuellt innan
+                         du kan använda <a href="doku.php?id=wiki:welcome">din nya DokuWiki</a>.';
+$lang['i_policy']              = 'Initial ACL-policy';
+$lang['i_pol0']                = 'Öppen wiki (alla får läsa, skriva och ladda upp filer)';
+$lang['i_pol1']                = 'Publik wiki (alla får läsa, registrerade användare för skriva och ladda upp filer)';
+$lang['i_pol2']                = 'Sluten wiki (endast registrerade användare får läsa, skriva och ladda upp filer)';
+$lang['i_allowreg']            = 'Tillåt användare att registrera sig själva';
+$lang['i_retry']               = 'Försök igen';
+$lang['i_license']             = 'Vänligen välj licens du vill använda för ditt innehåll:';
+$lang['i_license_none']        = 'Visa ingen licensinformation';
+$lang['i_pop_field']           = 'Hjälp oss förbättra DokuWiki upplevelsen:';
+$lang['i_pop_label']           = 'Sänd anonym användarinformation en gång i månaden till DokuWikis utvecklare';
+$lang['recent_global']         = 'Du bevakar ändringar i namnrymden <b>%s</b>. Du kan också titta på <a href="%s">senaste ändringar för hela wikin</a>.';
+$lang['years']                 = '%d år sedan';
+$lang['months']                = '%d månader sedan';
+$lang['weeks']                 = '%d veckor sedan';
+$lang['days']                  = '%d dagar sedan';
+$lang['hours']                 = '%d timmar sedan';
+$lang['minutes']               = '%d minuter sedan';
+$lang['seconds']               = '%d sekunder sedan';
+$lang['wordblock']             = 'Din ändring sparades inte för att den innehåller otillåten text (spam).';
+$lang['media_uploadtab']       = 'Ladda upp';
+$lang['media_searchtab']       = 'Sök';
+$lang['media_file']            = 'Fil';
+$lang['media_viewtab']         = 'Visa';
+$lang['media_edittab']         = 'Redigera';
+$lang['media_historytab']      = 'Historik';
+$lang['media_list_thumbs']     = 'Miniatyrbild';
+$lang['media_list_rows']       = 'Rader';
+$lang['media_sort_name']       = 'Namn';
+$lang['media_sort_date']       = 'Datum';
+$lang['media_namespaces']      = 'Visa namnrymd';
+$lang['media_files']           = 'Filer i %s';
+$lang['media_upload']          = 'Ladda upp till %s';
+$lang['media_search']          = 'Sök i %s';
+$lang['media_view']            = '%s';
+$lang['media_viewold']         = '%s vid %s';
+$lang['media_edit']            = 'Redigera %s';
+$lang['media_history']         = '%s-historik';
+$lang['media_meta_edited']     = 'metadata redigerat';
+$lang['media_perm_read']       = 'Du har tyvärr inte tillräckliga behörigheter för att läsa filer.';
+$lang['media_perm_upload']     = 'Du har tyvärr inte tillräckliga behörigheter för att ladda upp filer.';
+$lang['media_update']          = 'Ladda upp ny version';
+$lang['media_restore']         = 'Återställ denna version';
+$lang['media_acl_warning']     = 'Listan kanske inte är ';
+$lang['currentns']             = 'Nuvarande namnrymd.';
+$lang['searchresult']          = 'Sökresultat';
+$lang['plainhtml']             = 'Ren HTML';
+$lang['page_nonexist_rev']     = 'Sidan fanns inte på %s. Den blev sedermera skapad på <a href="%s">%s</a>.';
+$lang['email_signature_text']  = 'Detta meddelande har skapats av DokuWiki på
+@DOKUWIKIURL@';
diff --git a/wiki/inc/lang/sv/locked.txt b/wiki/inc/lang/sv/locked.txt
new file mode 100644
index 0000000..cb64eaf
--- /dev/null
+++ b/wiki/inc/lang/sv/locked.txt
@@ -0,0 +1,3 @@
+====== Sidan låst ======
+
+Den här sidan är för närvarande låst för redigering av en annan användare. Du måste vänta tills den användaren är klar med sin redigering, eller tills dess att dokumentlåset upphör att gälla.
diff --git a/wiki/inc/lang/sv/login.txt b/wiki/inc/lang/sv/login.txt
new file mode 100644
index 0000000..5f0e3b2
--- /dev/null
+++ b/wiki/inc/lang/sv/login.txt
@@ -0,0 +1,4 @@
+====== Logga in ======
+
+Du är inte inloggad! Ange ditt användarnamn och lösenord i formuläret nedan för att logga in. Stöd för cookies måste vara aktiverat i din webbläsare för att du skall kunna logga in.
+
diff --git a/wiki/inc/lang/sv/mailtext.txt b/wiki/inc/lang/sv/mailtext.txt
new file mode 100644
index 0000000..a45bc2a
--- /dev/null
+++ b/wiki/inc/lang/sv/mailtext.txt
@@ -0,0 +1,12 @@
+En sida i din DokuWiki har lagts till eller ändrats. Här är detaljerna:
+
+Datum                : @DATE@
+Webbläsare           : @BROWSER@
+IP-adress            : @IPADDRESS@
+Datornamn            : @HOSTNAME@
+Tidigare version     : @OLDPAGE@
+Aktuell version      : @NEWPAGE@
+Redigeringskommentar : @SUMMARY@
+Användare            : @USER@
+
+@DIFF@
diff --git a/wiki/inc/lang/sv/mailwrap.html b/wiki/inc/lang/sv/mailwrap.html
new file mode 100644
index 0000000..d257190
--- /dev/null
+++ b/wiki/inc/lang/sv/mailwrap.html
@@ -0,0 +1,13 @@
+<html>
+<head>
+<title>@TITLE@</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+</head>
+<body>
+
+@HTMLBODY@
+
+<br /><hr />
+<small>@EMAILSIGNATURE@</small>
+</body>
+</html>
\ No newline at end of file
diff --git a/wiki/inc/lang/sv/newpage.txt b/wiki/inc/lang/sv/newpage.txt
new file mode 100644
index 0000000..3e09510
--- /dev/null
+++ b/wiki/inc/lang/sv/newpage.txt
@@ -0,0 +1,3 @@
+====== Det här ämnet finns inte ännu ======
+
+Du har följt en länk till ett ämne som inte finns ännu. Du kan skapa det genom att klicka på ''Skapa den här sidan''.
diff --git a/wiki/inc/lang/sv/norev.txt b/wiki/inc/lang/sv/norev.txt
new file mode 100644
index 0000000..46df862
--- /dev/null
+++ b/wiki/inc/lang/sv/norev.txt
@@ -0,0 +1,4 @@
+====== Det finns ingen sådan version ======
+
+Den angivna versionen finns inte. Använd ''Historik'' för en förteckning över de versioner som finns av detta dokument.
+
diff --git a/wiki/inc/lang/sv/password.txt b/wiki/inc/lang/sv/password.txt
new file mode 100644
index 0000000..f8465a4
--- /dev/null
+++ b/wiki/inc/lang/sv/password.txt
@@ -0,0 +1,6 @@
+Hej @FULLNAME@!
+
+Här är dina användaruppgifter för @TITLE@ på @DOKUWIKIURL@
+
+Användarnamn : @LOGIN@
+Lösenord     : @PASSWORD@
diff --git a/wiki/inc/lang/sv/preview.txt b/wiki/inc/lang/sv/preview.txt
new file mode 100644
index 0000000..5c3a653
--- /dev/null
+++ b/wiki/inc/lang/sv/preview.txt
@@ -0,0 +1,4 @@
+====== Förhandsgranskning ======
+
+Detta är en förhandstitt på hur din text kommer att se ut när den visas. Kom ihåg: Den är **inte sparad** ännu!
+
diff --git a/wiki/inc/lang/sv/pwconfirm.txt b/wiki/inc/lang/sv/pwconfirm.txt
new file mode 100644
index 0000000..428cfa3
--- /dev/null
+++ b/wiki/inc/lang/sv/pwconfirm.txt
@@ -0,0 +1,12 @@
+Hej @FULLNAME@!
+
+Någon har bett om ett nytt lösenord för ditt konto på @TITLE@
+(@DOKUWIKIURL@)
+
+Om det inte var du som bad om ett nytt lösenord kan du helt
+enkelt ignorera det här brevet.
+
+För att bekräfta att förfrågan verkligen kom från dig, var vänlig
+och använd följande länk.
+
+@CONFIRM@
diff --git a/wiki/inc/lang/sv/read.txt b/wiki/inc/lang/sv/read.txt
new file mode 100644
index 0000000..5391b3d
--- /dev/null
+++ b/wiki/inc/lang/sv/read.txt
@@ -0,0 +1,2 @@
+Denna sida är skrivskyddad. Du kan titta på källkoden, men inte ändra den. Kontakta administratören om du anser att du bör kunna ändra sidan.
+
diff --git a/wiki/inc/lang/sv/recent.txt b/wiki/inc/lang/sv/recent.txt
new file mode 100644
index 0000000..d8c39df
--- /dev/null
+++ b/wiki/inc/lang/sv/recent.txt
@@ -0,0 +1,5 @@
+====== Senaste ändringarna ======
+
+Följande sidor/dokument har nyligen uppdaterats.
+
+
diff --git a/wiki/inc/lang/sv/register.txt b/wiki/inc/lang/sv/register.txt
new file mode 100644
index 0000000..e75d2a6
--- /dev/null
+++ b/wiki/inc/lang/sv/register.txt
@@ -0,0 +1,4 @@
+====== Registrera dig som användare ======
+
+Fyll i all information som efterfrågas i formuläret nedan för att skapa ett nytt konto i denna wiki. Var särskilt noga med att ange en **giltig e-postadress** - om du inte blir ombedd att ange ett lösenord här kommer ett nytt lösenord att skickas till den adressen.  Användarnamnet skall vara ett giltigt [[doku>pagename|sidnamn]].
+
diff --git a/wiki/inc/lang/sv/registermail.txt b/wiki/inc/lang/sv/registermail.txt
new file mode 100644
index 0000000..cbcf3f4
--- /dev/null
+++ b/wiki/inc/lang/sv/registermail.txt
@@ -0,0 +1,10 @@
+En ny användare har registrerat sig. Här är detaljerna:
+
+Användarnamn : @NEWUSER@
+Namn         : @NEWNAME@
+E-post       : @NEWEMAIL@
+
+Datum        : @DATE@
+Webbläsare   : @BROWSER@
+IP-adress    : @IPADDRESS@
+Datornamn    : @HOSTNAME@
diff --git a/wiki/inc/lang/sv/resendpwd.txt b/wiki/inc/lang/sv/resendpwd.txt
new file mode 100644
index 0000000..0757ee9
--- /dev/null
+++ b/wiki/inc/lang/sv/resendpwd.txt
@@ -0,0 +1,4 @@
+====== Skicka nytt lösenord ======
+
+Fyll i ditt användarnamn i formuläret nedan för att få ett nytt lösenord till ditt konto i denna wiki. En länk för verifiering kommer att skickas till din registrerade e-postadress.
+
diff --git a/wiki/inc/lang/sv/resetpwd.txt b/wiki/inc/lang/sv/resetpwd.txt
new file mode 100644
index 0000000..a329ce5
--- /dev/null
+++ b/wiki/inc/lang/sv/resetpwd.txt
@@ -0,0 +1,3 @@
+====== Sätt nytt lösenord ======
+
+Vänligen skriv ett nytt lösenord för ditt konto på denna wiki.
\ No newline at end of file
diff --git a/wiki/inc/lang/sv/revisions.txt b/wiki/inc/lang/sv/revisions.txt
new file mode 100644
index 0000000..b9dfc56
--- /dev/null
+++ b/wiki/inc/lang/sv/revisions.txt
@@ -0,0 +1,4 @@
+====== Historik ======
+
+Här visas tidigare versioner av detta dokument. För att återställa dokumentet till en tidigare version, välj den önskade versionen nedan, klicka på ''Redigera sida'' och spara sedan dokumentet.
+
diff --git a/wiki/inc/lang/sv/searchpage.txt b/wiki/inc/lang/sv/searchpage.txt
new file mode 100644
index 0000000..d01bf23
--- /dev/null
+++ b/wiki/inc/lang/sv/searchpage.txt
@@ -0,0 +1,4 @@
+====== Sök ======
+
+Nedan ser du resultatet av sökningen. @CREATEPAGEINFO@
+
diff --git a/wiki/inc/lang/sv/showrev.txt b/wiki/inc/lang/sv/showrev.txt
new file mode 100644
index 0000000..a79b30b
--- /dev/null
+++ b/wiki/inc/lang/sv/showrev.txt
@@ -0,0 +1,2 @@
+**Detta är en gammal version av dokumentet!**
+----
diff --git a/wiki/inc/lang/sv/stopwords.txt b/wiki/inc/lang/sv/stopwords.txt
new file mode 100644
index 0000000..3576596
--- /dev/null
+++ b/wiki/inc/lang/sv/stopwords.txt
@@ -0,0 +1,129 @@
+# This is a list of words the indexer ignores, one word per line
+# When you edit this file be sure to use UNIX line endings (single newline)
+# No need to include words shorter than 3 chars - these are ignored anyway
+# This list is based upon the ones found at http://www.ranks.nl/stopwords/
+about
+are
+and
+you
+your
+them
+their
+com
+for
+from
+into
+how
+that
+the
+this
+was
+what
+when
+where
+who
+will
+with
+und
+the
+www
+
+# Följande svenska stoppord kommer från
+# http://snowball.tartarus.org/algorithms/swedish/stop.txt. Ord kortare än tre
+# bokstäver har tagits bort (se kommentaren ovan) Se även
+# http://www.cling.gu.se/theses/2004/cl0sknub_cl0tsven.pdf. Vi behåller de
+# engelska orden eftersom det är rätt vanligt med engelska texter.
+och
+det
+att
+jag
+hon
+som
+han
+den
+med
+var
+sig
+för
+till
+men
+ett
+hade
+icke
+mig
+henne
+sin
+har
+inte
+hans
+honom
+skulle
+hennes
+där
+min
+man
+vid
+kunde
+något
+från
+när
+efter
+upp
+dem
+vara
+vad
+över
+dig
+kan
+sina
+här
+mot
+alla
+under
+någon
+eller
+allt
+mycket
+sedan
+denna
+själv
+detta
+utan
+varit
+hur
+ingen
+mitt
+bli
+blev
+oss
+din
+dessa
+några
+deras
+blir
+mina
+samma
+vilken
+sådan
+vår
+blivit
+dess
+inom
+mellan
+sådant
+varför
+varje
+vilka
+ditt
+vem
+vilket
+sitta
+sådana
+vart
+dina
+vars
+vårt
+våra
+ert
+era
+vilkas
diff --git a/wiki/inc/lang/sv/subscr_digest.txt b/wiki/inc/lang/sv/subscr_digest.txt
new file mode 100644
index 0000000..adf6680
--- /dev/null
+++ b/wiki/inc/lang/sv/subscr_digest.txt
@@ -0,0 +1,15 @@
+Hej
+
+Sidan @PAGE@ med @TITLE@ har ändrats.
+Här är ändringarna:
+
+-----------------------------
+@DIFF@
+-----------------------------
+
+Äldre versionen: @OLDPAGE@
+Ny version: @NEWPAGE@
+
+För att avbryta meddelanden om sidändringar logga in till wikin @DOKUWIKIURL@, besök sedan
+@SUBSCRIBE@
+och avbeställ ändringar av sidor och/eller namespace.
diff --git a/wiki/inc/lang/sv/subscr_form.txt b/wiki/inc/lang/sv/subscr_form.txt
new file mode 100644
index 0000000..bfb8fa3
--- /dev/null
+++ b/wiki/inc/lang/sv/subscr_form.txt
@@ -0,0 +1,3 @@
+====== Prenumerations hantering ======
+
+Denna sida låter dig hantera dina prenumerationer för nuvarande sida och namnrymd.
\ No newline at end of file
diff --git a/wiki/inc/lang/sv/subscr_list.txt b/wiki/inc/lang/sv/subscr_list.txt
new file mode 100644
index 0000000..4621917
--- /dev/null
+++ b/wiki/inc/lang/sv/subscr_list.txt
@@ -0,0 +1,9 @@
+Hej!
+
+Sidorna i namnrymden @PAGE@ för wikin @TITLE@ har ändrats. Följande sidor har ändrats: 
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+För att inaktivera sidnotifieringar, logga in på wikin (@DOKUWIKIURL@), gå till @SUBSCRIBE@ och avanmäl dig från sid-och/eller namnrymd-ändringar.
\ No newline at end of file
diff --git a/wiki/inc/lang/sv/subscr_single.txt b/wiki/inc/lang/sv/subscr_single.txt
new file mode 100644
index 0000000..50ef056
--- /dev/null
+++ b/wiki/inc/lang/sv/subscr_single.txt
@@ -0,0 +1,19 @@
+Hej!
+
+Sidan @PAGE@ i wikin @TITLE@ har ändrats.
+Detta är ändringarna:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Datum: @DATE@
+Användare: @USER@
+Ändrings sammanfattning: @SUMMARY@
+Gammal version: @OLDPAGE@
+Ny version: @NEWPAGE@
+
+För att avsluta noteringar om sidor, logga in på wikin vid
+@DOKUWIKIURL@ gå sedan till
+@SUBSCRIBE@
+och avsluta prenumerationen av sida och/eller namnrymd ändringar.
diff --git a/wiki/inc/lang/sv/updateprofile.txt b/wiki/inc/lang/sv/updateprofile.txt
new file mode 100644
index 0000000..98ed6e3
--- /dev/null
+++ b/wiki/inc/lang/sv/updateprofile.txt
@@ -0,0 +1,5 @@
+====== Uppdatera din användarprofil ======
+
+Du behöver bara fylla i de fält som du vill ändra. Du kan inte ändra ditt användarnamn.
+
+
diff --git a/wiki/inc/lang/sv/uploadmail.txt b/wiki/inc/lang/sv/uploadmail.txt
new file mode 100644
index 0000000..8db5f55
--- /dev/null
+++ b/wiki/inc/lang/sv/uploadmail.txt
@@ -0,0 +1,10 @@
+En fil har laddats upp till din DokuWiki. Här är detaljerna:
+
+Fil         : @MEDIA@
+Datum       : @DATE@
+Webbläsare  : @BROWSER@
+IP-adress   : @IPADDRESS@
+Datornamn   : @HOSTNAME@
+Storlek     : @SIZE@
+MIME-typ    : @MIME@
+Användare   : @USER@
diff --git a/wiki/inc/lang/ta/admin.txt b/wiki/inc/lang/ta/admin.txt
new file mode 100644
index 0000000..2538b45
--- /dev/null
+++ b/wiki/inc/lang/ta/admin.txt
@@ -0,0 +1,3 @@
+====== நிர்வாகம் ======
+
+கீழே டோகுவிக்கியின் நிர்வாகம் தொடர்பான முறைமைகளைப் பார்க்கலாம்.
\ No newline at end of file
diff --git a/wiki/inc/lang/ta/adminplugins.txt b/wiki/inc/lang/ta/adminplugins.txt
new file mode 100644
index 0000000..54a363a
--- /dev/null
+++ b/wiki/inc/lang/ta/adminplugins.txt
@@ -0,0 +1 @@
+===== மேலதிக சொருகிகள் =====
\ No newline at end of file
diff --git a/wiki/inc/lang/ta/backlinks.txt b/wiki/inc/lang/ta/backlinks.txt
new file mode 100644
index 0000000..d8e618f
--- /dev/null
+++ b/wiki/inc/lang/ta/backlinks.txt
@@ -0,0 +1,3 @@
+====== பின்னிணைப்புக்கள் ======
+
+குறித்த பக்கத்திற்கான இணைப்பைக் கொண்டிருக்கும் அனைத்துப் பக்கங்களும்
\ No newline at end of file
diff --git a/wiki/inc/lang/ta/conflict.txt b/wiki/inc/lang/ta/conflict.txt
new file mode 100644
index 0000000..301c2f0
--- /dev/null
+++ b/wiki/inc/lang/ta/conflict.txt
@@ -0,0 +1,3 @@
+====== புதிய பதிப்பு உண்டு ======
+
+நீங்கள் திருத்திய பக்கத்திற்கு புதிய பதிப்பு உருவாகியுள்ளது. நீங்கள் குறித்த பக்கத்தை திருத்தும் போது, இன்னுமொரு பயனர் அதே பக்கத்தைத் திருத்தினால் இப்படி ஏற்பட வாய்ப்புண்டு.
\ No newline at end of file
diff --git a/wiki/inc/lang/ta/denied.txt b/wiki/inc/lang/ta/denied.txt
new file mode 100644
index 0000000..9dcf1c9
--- /dev/null
+++ b/wiki/inc/lang/ta/denied.txt
@@ -0,0 +1 @@
+மன்னிக்கவும் ! உங்களுக்கு தொடர அனுமதி இல்லை
\ No newline at end of file
diff --git a/wiki/inc/lang/ta/diff.txt b/wiki/inc/lang/ta/diff.txt
new file mode 100644
index 0000000..bbc2876
--- /dev/null
+++ b/wiki/inc/lang/ta/diff.txt
@@ -0,0 +1,3 @@
+====== வேறுபாடுகள் ======
+
+குறித்த பக்கத்திற்கான இருவேறுபட்ட மாறுதல்களைக்  காட்டுகின்றது.
\ No newline at end of file
diff --git a/wiki/inc/lang/ta/draft.txt b/wiki/inc/lang/ta/draft.txt
new file mode 100644
index 0000000..2bb8921
--- /dev/null
+++ b/wiki/inc/lang/ta/draft.txt
@@ -0,0 +1 @@
+====== பூரணமாகத கோப்பு ======
\ No newline at end of file
diff --git a/wiki/inc/lang/ta/edit.txt b/wiki/inc/lang/ta/edit.txt
new file mode 100644
index 0000000..e2d61d7
--- /dev/null
+++ b/wiki/inc/lang/ta/edit.txt
@@ -0,0 +1 @@
+பக்கத்தைத் திருத்தி முடிந்தவுடன், "செமி" என்ற பட்டனை அழுத்தவும். விக்கியின் வாக்கிய அமைப்புக்களைப் அறிந்துகொள்ள [[wiki:syntax]] ஐ பார்க்கவும். நீங்கள் விக்கியில் எழுதிப் பயிற்சிபெற [playground:playground|விளையாட்டுத்தாடலை]] பயன்படுத்தவும்.
\ No newline at end of file
diff --git a/wiki/inc/lang/ta/jquery.ui.datepicker.js b/wiki/inc/lang/ta/jquery.ui.datepicker.js
new file mode 100644
index 0000000..722614d
--- /dev/null
+++ b/wiki/inc/lang/ta/jquery.ui.datepicker.js
@@ -0,0 +1,53 @@
+/* Tamil (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by S A Sureshkumar (saskumar@live.com). */
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "../widgets/datepicker" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery.datepicker );
+	}
+}( function( datepicker ) {
+
+datepicker.regional.ta = {
+	closeText: "மூடு",
+	prevText: "முன்னையது",
+	nextText: "அடுத்தது",
+	currentText: "இன்று",
+	monthNames: [ "தை","மாசி","பங்குனி","சித்திரை","வைகாசி","ஆனி",
+	"ஆடி","ஆவணி","புரட்டாசி","ஐப்பசி","கார்த்திகை","மார்கழி" ],
+	monthNamesShort: [ "தை","மாசி","பங்","சித்","வைகா","ஆனி",
+	"ஆடி","ஆவ","புர","ஐப்","கார்","மார்" ],
+	dayNames: [
+		"ஞாயிற்றுக்கிழமை",
+		"திங்கட்கிழமை",
+		"செவ்வாய்க்கிழமை",
+		"புதன்கிழமை",
+		"வியாழக்கிழமை",
+		"வெள்ளிக்கிழமை",
+		"சனிக்கிழமை"
+	],
+	dayNamesShort: [
+		"ஞாயிறு",
+		"திங்கள்",
+		"செவ்வாய்",
+		"புதன்",
+		"வியாழன்",
+		"வெள்ளி",
+		"சனி"
+	],
+	dayNamesMin: [ "ஞா","தி","செ","பு","வி","வெ","ச" ],
+	weekHeader: "Не",
+	dateFormat: "dd/mm/yy",
+	firstDay: 1,
+	isRTL: false,
+	showMonthAfterYear: false,
+	yearSuffix: "" };
+datepicker.setDefaults( datepicker.regional.ta );
+
+return datepicker.regional.ta;
+
+} ) );
diff --git a/wiki/inc/lang/ta/lang.php b/wiki/inc/lang/ta/lang.php
new file mode 100644
index 0000000..422613e
--- /dev/null
+++ b/wiki/inc/lang/ta/lang.php
@@ -0,0 +1,55 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Naveen Venugopal <naveen.venugopal.anu@gmail.com>
+ * @author Sri Saravana <saravanamuthaly@gmail.com>
+ */
+$lang['doublequoteopening']    = '&quot;';
+$lang['doublequoteclosing']    = '&quot;';
+$lang['singlequoteopening']    = '\'';
+$lang['singlequoteclosing']    = '\'';
+$lang['apostrophe']            = '\'';
+$lang['btn_edit']              = 'இந்த பக்கத்தை திருத்து ';
+$lang['btn_source']            = 'பக்க மூலத்தைக் காட்டு';
+$lang['btn_show']              = 'பக்கத்தை காண்பி ';
+$lang['btn_create']            = 'இந்த பக்கத்தை உருவாக்கு ';
+$lang['btn_search']            = 'தேடு';
+$lang['btn_save']              = 'சேமி ';
+$lang['btn_preview']           = 'முன்னோட்டம்';
+$lang['btn_top']               = 'மேலே செல்';
+$lang['btn_revs']              = 'பழைய  திருத்தங்கள்';
+$lang['btn_recent']            = 'சமீபத்திய மாற்றங்கள்';
+$lang['btn_upload']            = 'பதிவேற்று';
+$lang['btn_cancel']            = 'ரத்து';
+$lang['btn_index']             = 'தள வரைபடம்';
+$lang['btn_secedit']           = 'தொகு';
+$lang['btn_login']             = 'புகுபதிகை';
+$lang['btn_logout']            = 'விடுபதிகை';
+$lang['btn_admin']             = 'நிர்வாகம்';
+$lang['btn_update']            = 'மேம்படுத்து ';
+$lang['btn_delete']            = 'நீக்கு';
+$lang['btn_back']              = 'பின்';
+$lang['btn_backlink']          = 'பின்னிணைப்புக்கள்';
+$lang['btn_subscribe']         = 'சந்தா நிர்வகிப்பு';
+$lang['btn_profile']           = 'பயனர் கணக்கு மாற்றம்';
+$lang['btn_reset']             = 'மீட்டமை';
+$lang['btn_resendpwd']         = 'புதிய அடையாளச்சொல்லை நியமி';
+$lang['btn_draft']             = 'திருத்த வரைவு';
+$lang['btn_apply']             = 'உபயோகி';
+$lang['user']                  = 'பயனர்பெயர்';
+$lang['pass']                  = 'அடையாளச்சொல்';
+$lang['newpass']               = 'புதிய அடையாளச்சொல்';
+$lang['oldpass']               = 'தற்போதைய  அடையாளச்சொல்லை உறுதிப்படுத்து';
+$lang['passchk']               = 'மேலும் ஒரு முறை ';
+$lang['remember']              = 'என்னை ஞாபகம் வைத்து கொள்';
+$lang['fullname']              = 'உண்மையான பெயர்';
+$lang['email']                 = 'மின்னஞ்சல்';
+$lang['profile']               = 'பயன்படுத்துபவர் விவரம்';
+$lang['minoredit']             = 'சிறிய மாற்றங்கள்';
+$lang['media_historytab']      = 'வரலாறு';
+$lang['media_list_rows']       = 'வரிசைகள் ';
+$lang['media_sort_name']       = 'பெயர் ';
+$lang['media_sort_date']       = 'தேதி ';
+$lang['media_namespaces']      = 'பெயர்வெளியை தேர்வுசெய் ';
diff --git a/wiki/inc/lang/th/admin.txt b/wiki/inc/lang/th/admin.txt
new file mode 100644
index 0000000..677e779
--- /dev/null
+++ b/wiki/inc/lang/th/admin.txt
@@ -0,0 +1,3 @@
+====== งานธุรการควบคุมระบบ ======
+
+ด้านล่างนี้คุณสามารถพบรายการงานควบคุมระบบทั้งหมดในโดกุวิกิ
\ No newline at end of file
diff --git a/wiki/inc/lang/th/adminplugins.txt b/wiki/inc/lang/th/adminplugins.txt
new file mode 100644
index 0000000..85a6b17
--- /dev/null
+++ b/wiki/inc/lang/th/adminplugins.txt
@@ -0,0 +1 @@
+====== ปลั๊กอินเสริม ======
\ No newline at end of file
diff --git a/wiki/inc/lang/th/backlinks.txt b/wiki/inc/lang/th/backlinks.txt
new file mode 100644
index 0000000..fff6898
--- /dev/null
+++ b/wiki/inc/lang/th/backlinks.txt
@@ -0,0 +1,3 @@
+====== ลิงค์กลับ(Backlinks) ======
+
+นี่คือรายชื่อเพจที่ชี้ลิงค์กลับมายังเพจปัจจุบัน
\ No newline at end of file
diff --git a/wiki/inc/lang/th/conflict.txt b/wiki/inc/lang/th/conflict.txt
new file mode 100644
index 0000000..5e786a6
--- /dev/null
+++ b/wiki/inc/lang/th/conflict.txt
@@ -0,0 +1,5 @@
+====== มีเนื้อหารุ่นใหม่กว่าเกิดขึ้น ======
+
+มีเอกสารรุ่นใหม่กว่าที่คุณได้แก้ไขไว้ มันเกิดขึ้นเมื่อผู้ใช้รายอื่นได้ทำการแก้ไขเอกสารในขณะที่ขณะเดียวกันกับที่คุณกำลังแก้ไขมัน
+
+ให้ตรวจสอบความแตกต่างที่แสดงไว้ด้านล่างนี้ให้ทั่วถึง, แล้วตัดสินใจว่าจะเก็บฉบับไหนไว้ ถ้าคุณเลือก "บันทึก", ฉบับของคุณจะถูกบันทึกไว้ หรือกด "ยกเลิก" เพื่อเก็บฉบับปัจจุบัน
\ No newline at end of file
diff --git a/wiki/inc/lang/th/denied.txt b/wiki/inc/lang/th/denied.txt
new file mode 100644
index 0000000..4cc29d6
--- /dev/null
+++ b/wiki/inc/lang/th/denied.txt
@@ -0,0 +1,4 @@
+====== ปฏิเสธสิทธิ์ ======
+
+ขออภัย คุณไม่มีสิทธิ์เพียงพอที่จะดำเนินการต่อ
+
diff --git a/wiki/inc/lang/th/diff.txt b/wiki/inc/lang/th/diff.txt
new file mode 100644
index 0000000..e21759e
--- /dev/null
+++ b/wiki/inc/lang/th/diff.txt
@@ -0,0 +1,3 @@
+====== ความแตกต่าง ======
+
+นี่เป็นการแสดงความแตกต่างระหว่างเพจสองรุ่น
\ No newline at end of file
diff --git a/wiki/inc/lang/th/draft.txt b/wiki/inc/lang/th/draft.txt
new file mode 100644
index 0000000..37b1841
--- /dev/null
+++ b/wiki/inc/lang/th/draft.txt
@@ -0,0 +1,5 @@
+====== พบไฟล์ฉบับร่าง ======
+
+เซสชั่นที่คุณแก้ไขฉบับล่าสุดในเพจนี้ไม่ถูกจัดเก็บให้สมบูรณ์ โดกุวิกิได้ทำการบันทึกฉบับร่างให้โดยอัตโนมัติในระหว่างที่คุณกำลังทำงาน อันซึ่งขณะนี้คุณอาจต้องการใช้มันเพื่อแก้ไขต่อ ด้านล่างนี้คุณจะเห็นข้อมูลที่ถูกบันทึกไว้จากการทำงานครั้งล่าสุด
+
+กรุณาตัดสินใจว่าคุณต้องการที่จะ //กู้คืน//งานฉบับที่แก้ไขล่าสุด, //ลบทิ้ง/// ตัวฉบับร่างที่ได้บันทึกอัตโนมัติไว้, //ยกเลิก// กระบวนการแก้ไขนี้
\ No newline at end of file
diff --git a/wiki/inc/lang/th/edit.txt b/wiki/inc/lang/th/edit.txt
new file mode 100644
index 0000000..81dc000
--- /dev/null
+++ b/wiki/inc/lang/th/edit.txt
@@ -0,0 +1 @@
+แก้ไขหน้านี้แล้วกด "บันทึก" ให้อ่าน[[wiki:syntax|ไวยกรณ์วิกิ]] สำหรับค้นหาไวยกรณ์ที่ใช้ในวิกิ และกรุณาแก้ไขเฉพาะเพจที่คุณสามารถ**ปรับปรุง**ให้มันดีขึ้นได้, ถ้าหากคุณต้องการที่จะทดสอบอะไรบางอย่าง ให้ไปลองเล่นครั้งแรกได้ใน[[playground:playground|สนามเด็กเล่น]]
\ No newline at end of file
diff --git a/wiki/inc/lang/th/editrev.txt b/wiki/inc/lang/th/editrev.txt
new file mode 100644
index 0000000..28e6760
--- /dev/null
+++ b/wiki/inc/lang/th/editrev.txt
@@ -0,0 +1,2 @@
+**คุณได้โหลดเอาเอกสารฉบับเก่าขึ้นมา!** ถ้าคุณบันทึกมัน คุณจะสร้างเอกสารรุ่นใหม่ด้วยข้อมูลเหล่านี้
+----
\ No newline at end of file
diff --git a/wiki/inc/lang/th/index.txt b/wiki/inc/lang/th/index.txt
new file mode 100644
index 0000000..eb32a64
--- /dev/null
+++ b/wiki/inc/lang/th/index.txt
@@ -0,0 +1,2 @@
+====== ดัชนี ======
+นี่คือดัชนีรวมทุกเพจ เรียงตาม[[doku>namespaces|เนมสเปซ]]
\ No newline at end of file
diff --git a/wiki/inc/lang/th/jquery.ui.datepicker.js b/wiki/inc/lang/th/jquery.ui.datepicker.js
new file mode 100644
index 0000000..6de48cf
--- /dev/null
+++ b/wiki/inc/lang/th/jquery.ui.datepicker.js
@@ -0,0 +1,37 @@
+/* Thai initialisation for the jQuery UI date picker plugin. */
+/* Written by pipo (pipo@sixhead.com). */
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "../widgets/datepicker" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery.datepicker );
+	}
+}( function( datepicker ) {
+
+datepicker.regional.th = {
+	closeText: "ปิด",
+	prevText: "&#xAB;&#xA0;ย้อน",
+	nextText: "ถัดไป&#xA0;&#xBB;",
+	currentText: "วันนี้",
+	monthNames: [ "มกราคม","กุมภาพันธ์","มีนาคม","เมษายน","พฤษภาคม","มิถุนายน",
+	"กรกฎาคม","สิงหาคม","กันยายน","ตุลาคม","พฤศจิกายน","ธันวาคม" ],
+	monthNamesShort: [ "ม.ค.","ก.พ.","มี.ค.","เม.ย.","พ.ค.","มิ.ย.",
+	"ก.ค.","ส.ค.","ก.ย.","ต.ค.","พ.ย.","ธ.ค." ],
+	dayNames: [ "อาทิตย์","จันทร์","อังคาร","พุธ","พฤหัสบดี","ศุกร์","เสาร์" ],
+	dayNamesShort: [ "อา.","จ.","อ.","พ.","พฤ.","ศ.","ส." ],
+	dayNamesMin: [ "อา.","จ.","อ.","พ.","พฤ.","ศ.","ส." ],
+	weekHeader: "Wk",
+	dateFormat: "dd/mm/yy",
+	firstDay: 0,
+	isRTL: false,
+	showMonthAfterYear: false,
+	yearSuffix: "" };
+datepicker.setDefaults( datepicker.regional.th );
+
+return datepicker.regional.th;
+
+} ) );
diff --git a/wiki/inc/lang/th/lang.php b/wiki/inc/lang/th/lang.php
new file mode 100644
index 0000000..b2b2fd8
--- /dev/null
+++ b/wiki/inc/lang/th/lang.php
@@ -0,0 +1,245 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Komgrit Niyomrath <n.komgrit@gmail.com>
+ * @author Arthit Suriyawongkul <arthit@gmail.com>
+ * @author Kittithat Arnontavilas <mrtomyum@gmail.com>
+ * @author Thanasak Sompaisansin <jombthep@gmail.com>
+ * @author Yuthana Tantirungrotechai <yt203y@gmail.com>
+ * @author Amnuay <amnuay@gmail.com>
+ */
+$lang['encoding']              = 'utf-8';
+$lang['direction']             = 'ltr';
+$lang['doublequoteopening']    = '“';
+$lang['doublequoteclosing']    = '”';
+$lang['singlequoteopening']    = '‘';
+$lang['singlequoteclosing']    = '’';
+$lang['apostrophe']            = '’';
+$lang['btn_edit']              = 'แก้ไขหน้านี้';
+$lang['btn_source']            = 'ดูโค้ด';
+$lang['btn_show']              = 'แสดงเพจ';
+$lang['btn_create']            = 'สร้างเพจนี้';
+$lang['btn_search']            = 'ค้นหา';
+$lang['btn_save']              = 'บันทึก';
+$lang['btn_preview']           = 'แสดงตัวอย่าง';
+$lang['btn_top']               = 'กลับสู่ด้านบน';
+$lang['btn_newer']             = '<< ใหม่กว่า';
+$lang['btn_older']             = 'เก่ากว่า >>';
+$lang['btn_revs']              = 'ฉบับเก่าๆ';
+$lang['btn_recent']            = 'ปรับปรุงล่าสุด';
+$lang['btn_upload']            = 'ส่งข้อมูลเข้าสู่ระบบ';
+$lang['btn_cancel']            = 'ยกเลิก';
+$lang['btn_index']             = 'ดัชนี';
+$lang['btn_secedit']           = 'แก้ไข';
+$lang['btn_login']             = 'ล็อกอิน';
+$lang['btn_logout']            = 'ล็อกเอาต์';
+$lang['btn_admin']             = 'ผู้ควบคุมระบบ';
+$lang['btn_update']            = 'ปรับปรุง';
+$lang['btn_delete']            = 'ลบ';
+$lang['btn_back']              = 'ย้อนกลับ';
+$lang['btn_backlink']          = 'หน้าที่ลิงก์มา';
+$lang['btn_subscribe']         = 'เฝ้าดู';
+$lang['btn_profile']           = 'แก้ข้อมูลผู้ใช้';
+$lang['btn_reset']             = 'เริ่มใหม่';
+$lang['btn_resendpwd']         = 'ตั้งพาสเวิร์ดใหม่';
+$lang['btn_draft']             = 'แก้ไขเอกสารฉบับร่าง';
+$lang['btn_recover']           = 'กู้คืนเอกสารฉบับร่าง';
+$lang['btn_draftdel']          = 'ลบเอกสารฉบับร่าง';
+$lang['btn_revert']            = 'กู้คืน';
+$lang['btn_register']          = 'สร้างบัญชีผู้ใช้';
+$lang['btn_apply']             = 'นำไปใช้';
+$lang['btn_media']             = 'ส่วนจัดการสื่อและไฟล์';
+$lang['btn_deleteuser']        = 'ลบบัญชีผู้ใช้งานของฉัน';
+$lang['btn_img_backto']        = 'กลับไปยัง %s';
+$lang['btn_mediaManager']      = 'ดูในส่วนจัดการสื่อและไฟล์';
+$lang['loggedinas']            = 'ลงชื่อเข้าใช้เป็น:';
+$lang['user']                  = 'ชื่อผู้ใช้:';
+$lang['pass']                  = 'รหัสผ่าน';
+$lang['newpass']               = 'รหัสผ่านใหม่';
+$lang['oldpass']               = 'รหัสผ่านเดิม:';
+$lang['passchk']               = 'พิมพ์รหัสผ่านอีกครั้ง:';
+$lang['remember']              = 'จำชื่อและรหัสผ่าน';
+$lang['fullname']              = 'ชื่อจริง:';
+$lang['email']                 = 'อีเมล:';
+$lang['profile']               = 'ข้อมูลส่วนตัวผู้ใช้';
+$lang['badlogin']              = 'ขัดข้อง:';
+$lang['badpassconfirm']        = 'พาสเวิร์ดไม่ถูกต้อง';
+$lang['minoredit']             = 'เป็นการแก้ไขเล็กน้อย';
+$lang['draftdate']             = 'บันทึกฉบับร่างเมื่อ';
+$lang['nosecedit']             = 'ในช่วงเวลาที่ผ่านมานี้เพจถูกแก้ไขไปแล้ว, เนื้อหาในเซคชั่นนี้ไม่ทันสมัย กรุณาโหลดเพจใหม่ทั้งหน้าแทน';
+$lang['regmissing']            = 'ขออภัย คุณต้องกรอกให้ครบทุกช่อง';
+$lang['reguexists']            = 'ชื่อบัญชีที่ใส่นั้นมีผู้อื่นได้ใช้แล้ว กรุณาเลือกชื่อผู้ใช้อื่น';
+$lang['regsuccess']            = 'ผู้ใช้ถูกสร้างแล้ว และรหัสผ่านได้ถูกส่งไปทางอีเมลแล้ว';
+$lang['regsuccess2']           = 'ชื่อบัญชีได้ถูกสร้างขึ้น';
+$lang['regfail']               = 'การสร้างผู้ใช้ไม่สำเร็จ';
+$lang['regmailfail']           = 'ดูเหมือนจะมีข้อผิดพลาดในการส่งรหัสผ่านทางเมล์ กรุณาติดต่อผู้ดูแลระบบ';
+$lang['regbadmail']            = 'รูปแบบอีเมลไม่ถูกต้อง ให้ใส่อีเมลให้ถูกต้องตามรูปแบบอีเมล หรือให้ทำช่องอีเมลให้ว่างแทน';
+$lang['regbadpass']            = 'รหัสผ่านที่ใส่ไม่ถูกต้อง';
+$lang['regpwmail']             = 'รหัสผ่านเข้าโดกุวิกิของคุณ';
+$lang['reghere']               = 'คุณยังไม่มีบัญชีหรือ ก็แค่สร้างขึ้นมาสักอันหนึ่ง';
+$lang['profna']                = 'วิกินี้ไม่รองรับการแก้ไขข้อมูลส่วนตัว';
+$lang['profnochange']          = 'ไม่มีการเปลี่ยนแปลงข้อมูลส่วนตัว';
+$lang['profnoempty']           = 'ไม่อนุญาติให้เว้นว่างชื่อ หรืออีเมล';
+$lang['profchanged']           = 'ปรับปรุงข้อมูลส่วนตัวผู้ใช้สำเร็จ';
+$lang['profnodelete']          = 'วิกินี้ไม่รองรับการลบบัญชีผู้ใช้งาน';
+$lang['profdeleteuser']        = 'ลบบัญชีผู้ใช้งาน';
+$lang['profdeleted']           = 'บัญชีผู้ใช้งานของคุณได้ถูกลบออกจากวิกิแล้ว';
+$lang['profconfdelete']        = 'ฉันอยากลบบัญชีผู้ใช้งานของฉันจากวิกินี้ <br/> การดำเนินการนี้ไม่สามารถแก้ไขคืนได้ ';
+$lang['profconfdeletemissing'] = 'ท่านไม่ได้ยืนยันในช่องยืนยัน';
+$lang['proffail']              = 'ข้อมูลผู้ใช้ไม่เป็นปัจจุบัน';
+$lang['pwdforget']             = 'ลืมรหัสผ่านหรือ? เอาอันใหม่สิ';
+$lang['resendna']              = 'วิกินี้ไม่รองรับการส่งรหัสผ่านซ้ำ';
+$lang['resendpwd']             = 'สร้างรหัสผ่านใหม่สำหรับ';
+$lang['resendpwdmissing']      = 'ขออภัย, คุณต้องกรอกทุกช่อง';
+$lang['resendpwdnouser']       = 'ขออภัย, เราไม่พบผู้ใช้คนนี้ในฐานข้อมูลของเรา';
+$lang['resendpwdbadauth']      = 'ขออภัย, รหัสนี้ยังใช้ไม่ได้ กรุณาตรวจสอบว่าคุณกดลิ้งค์ยืนยันแล้ว';
+$lang['resendpwdconfirm']      = 'อีเมลยืนยันได้ถูกส่งไปที่อีเมลที่ได้ถูกเสนอ ก่อนที่อีเมลจะถูกส่งไปที่ชื่อบัญชีนั้น คุณต้องปฏิบัติตามคำแนะนำในอีเมลเพื่อยืนยันว่าหมายเลยบัญชีนั้นเป็นของคุณ';
+$lang['resendpwdsuccess']      = 'รหัสผ่านใหม่ของคุณได้ถูกส่งให้แล้วทางอีเมล';
+$lang['license']               = 'เว้นแต่จะได้แจ้งไว้เป็นอื่นใด เนื้อหาบนวิกินี้ถูกกำหนดสิทธิ์ไว้ภายใต้สัญญาอนุญาติต่อไปนี้:';
+$lang['licenseok']             = 'โปรดทราบ: เมื่อเริ่มแก้ไขหน้านี้ ถือว่าคุณตกลงให้สิทธิ์กับเนื้อหาของคุณอยู่ภายใต้สัญญาอนุญาตินี้';
+$lang['searchmedia']           = 'สืบค้นไฟล์ชื่อ:';
+$lang['searchmedia_in']        = 'สืบค้นใน %s';
+$lang['txt_upload']            = 'เลือกไฟล์ที่จะอัพโหลด:';
+$lang['txt_filename']          = 'อัพโหลดเป็น(ตัวเลือก):';
+$lang['txt_overwrt']           = 'เขียนทับไฟล์ที่มีอยู่แล้ว';
+$lang['maxuploadsize']         = 'อัพโหลด สูงสุด %s ต่อไฟล์';
+$lang['lockedby']              = 'ตอนนี้ถูกล๊อคโดย:';
+$lang['lockexpire']            = 'การล๊อคจะหมดอายุเมื่อ:';
+$lang['js']['willexpire']      = 'การล๊อคเพื่อแก้ไขหน้านี้กำลังจะหมดเวลาในอีก \n นาที เพื่อที่จะหลีกเลี่ยงข้อขัดแย้งให้ใช้ปุ่ม "Preview" เพื่อรีเซ็ทเวลาใหม่';
+$lang['js']['notsavedyet']     = 'การแก้ไขที่ไม่ได้บันทึกจะสูญหาย \n ต้องการทำต่อจริงๆหรือ?';
+$lang['js']['searchmedia']     = 'ค้นหาไฟล์';
+$lang['js']['keepopen']        = 'เปิดหน้าต่างไว้ระหว่างที่เลือก';
+$lang['js']['hidedetails']     = 'ซ่อนรายละเอียด';
+$lang['js']['mediatitle']      = 'กำหนดข้อมูลลิงค์';
+$lang['js']['mediadisplay']    = 'ชนิดของลิงค์';
+$lang['js']['mediaalign']      = 'การจัดวาง';
+$lang['js']['mediasize']       = 'ขนาดรูปภาพ';
+$lang['js']['mediatarget']     = 'เป้าหมายของลิงค์';
+$lang['js']['mediaclose']      = 'ปิด';
+$lang['js']['mediainsert']     = 'แทรก';
+$lang['js']['mediadisplayimg'] = 'แสดงรูปภาพ';
+$lang['js']['mediadisplaylnk'] = 'แสดงลิงค์ เท่านั้น';
+$lang['js']['mediasmall']      = 'รูปแบบขนาดเล็ก';
+$lang['js']['mediamedium']     = 'รูปแบบขนาดกลาง';
+$lang['js']['medialarge']      = 'รูปแบบขนาดใหญ่';
+$lang['js']['mediaoriginal']   = 'รูปแบบตั้งต้น';
+$lang['js']['nosmblinks']      = 'เชื่อมไปยังหน้าต่างแบ่งปัน ทำงานได้กับเฉพาะไมโครซอฟท์อินเตอร์เน็ตเอ็กซโปรเรอร์(IE) คุณยังคงสามารถคัดลอกและแปะลิ้งค์ได้';
+$lang['js']['linkwiz']         = 'ลิงค์วิเศษ';
+$lang['js']['linkto']          = 'ลิงค์ไป:';
+$lang['js']['del_confirm']     = 'ต้องการลบรายการที่เลือกจริงๆหรือ?';
+$lang['rssfailed']             = 'มีข้อผิดพลาดขณะดูดฟีดนี้';
+$lang['nothingfound']          = 'ไม่พบสิ่งใด';
+$lang['mediaselect']           = 'ไฟล์สื่อ';
+$lang['uploadsucc']            = 'อัปโหลดสำเร็จ';
+$lang['uploadfail']            = 'เกิดความขัดข้องในการอัปโหลด';
+$lang['uploadwrong']           = 'การอัพโหลดถูกปฏิเสธ ส่วนขยายไฟล์นี้ต้องห้าม!';
+$lang['uploadexist']           = 'ไฟล์นี้มีอยู่แล้ว ไม่มีการบันทึกใดๆเกิดขึ้น';
+$lang['uploadbadcontent']      = 'เนื้อหาที่อัพโหลดไม่ตรงกับส่วนขยายไฟล์ %s ';
+$lang['uploadspam']            = 'การอัพโหลดถูกกีดกันจากบัญชีดำสแปม';
+$lang['uploadxss']             = 'ไฟล์นี้มีส่วนประกอบของโค้ดเอชทีเอ็มแอลหรือสคริปต์ ซึ่งอาจก่อให้เกิดความผิดพลาดในการแสดงผลของเว็บเบราว์เซอร์';
+$lang['uploadsize']            = 'ไฟล์ที่อัพโหลดใหญ่เกินไป (สูงสุด %s)';
+$lang['deletesucc']            = 'ไฟล์ "%s" ถูกลบ';
+$lang['deletefail']            = '"%s" ไม่สามารถลบได้ - ให้ตรวจสอบสิทธิ์การใช้ของคุณ';
+$lang['mediainuse']            = 'ไฟล์ "%s" ไม่ได้ถูกลบ - มันถูกใช้อยู่';
+$lang['namespaces']            = 'เนมสเปซ';
+$lang['mediafiles']            = 'มีไฟล์พร้อมใช้อยู่ใน';
+$lang['mediausage']            = 'ให้ใช้ไวยกรณ์ต่อไปนี้เพื่ออ้างอิงไฟล์นี้';
+$lang['mediaview']             = 'ดูไฟล์ต้นฉบับ';
+$lang['mediaroot']             = 'ราก(รูท)';
+$lang['mediaupload']           = 'อัพโหลดไฟล์ไปยังเนมสเปซปัจจุบันจากที่นี่ หากจะสร้างเนมสเปซย่อย ให้พิมพ์ต่อข้อความของคุณหลังชื่อไฟล์ในช่อง "อัพโหลดเป็น" โดยให้คั่นด้วยโคล่อน(:)';
+$lang['mediaextchange']        = 'ส่วนขยายไฟล์ถูกเปลี่ยนจาก .%s ไปเป็น .%s!';
+$lang['reference']             = 'อ้างอิงสำหรับ';
+$lang['ref_inuse']             = 'ไม่สามารถลบไฟล์ได้ เพราะมันยังคงถูกใช้โดยเพจดังต่อไปนี้:';
+$lang['ref_hidden']            = 'มีการอ้างอิงบางรายการในเพจ คุณไม่มีสิทธิ์ในการอ่าน';
+$lang['hits']                  = 'คำที่ตรงกัน';
+$lang['quickhits']             = 'ชื่อเพจที่ตรงกัน';
+$lang['toc']                   = 'สารบัญ';
+$lang['current']               = 'ฉบับปัจจุบัน';
+$lang['yours']                 = 'ฉบับของคุณ';
+$lang['diff']                  = 'แสดงจุดแตกต่างกับฉบับปัจจุบัน';
+$lang['diff2']                 = 'แสดงจุดแตกต่างระหว่างฉบับที่เลือกไว้';
+$lang['line']                  = 'บรรทัด';
+$lang['breadcrumb']            = 'ตามรอย:';
+$lang['youarehere']            = 'คุณอยู่ที่นี่:';
+$lang['lastmod']               = 'แก้ไขครั้งล่าสุด:';
+$lang['by']                    = 'โดย';
+$lang['deleted']               = 'ถูกถอดออก';
+$lang['created']               = 'ถูกสร้าง';
+$lang['restored']              = 'ย้อนไปรุ่นก่อนหน้า (%s)';
+$lang['external_edit']         = 'แก้ไขภายนอก';
+$lang['summary']               = 'สรุป(หมายเหตุ)การแก้ไขนี้';
+$lang['noflash']               = 'ต้องการตัวเล่นแฟลช <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> เพื่อแสดงผลเนื้อหานี้';
+$lang['download']              = 'ดาวน์โหลดสนิปเป็ด(Snippet)';
+$lang['mail_newpage']          = 'เพิ่มเพจแล้ว:';
+$lang['mail_changed']          = 'แก้ไขเพจแล้ว:';
+$lang['mail_new_user']         = 'ผู้ใช้คนใหม่:';
+$lang['mail_upload']           = 'ไฟล์อัพโหลดแล้ว:';
+$lang['qb_bold']               = 'ทำตัวหนา';
+$lang['qb_italic']             = 'ทำตัวเอียง';
+$lang['qb_underl']             = 'ขีดเส้นใต้ข้อความ';
+$lang['qb_code']               = 'ข้อความเป็นโค้ดโปรแกรม';
+$lang['qb_strike']             = 'ขีดฆ่าข้อความ';
+$lang['qb_h1']                 = 'หัวเรื่องระดับที่ 1';
+$lang['qb_h2']                 = 'หัวเรื่องระดับที่ 2';
+$lang['qb_h3']                 = 'หัวเรื่องระดับที่ 3';
+$lang['qb_h4']                 = 'หัวเรื่องระดับที่ 4';
+$lang['qb_h5']                 = 'หัวเรื่องระดับที่ 5';
+$lang['qb_h']                  = 'หัวเรื่อง';
+$lang['qb_hs']                 = 'เลือกหัวเรื่อง';
+$lang['qb_hplus']              = 'หัวเรื่องที่สูงกว่า';
+$lang['qb_hminus']             = 'หัวเรื่องที่ต่ำกว่า';
+$lang['qb_hequal']             = 'หัวเรื่องระดับเดียวกัน';
+$lang['qb_link']               = 'ลิงก์ภายในเว็บ';
+$lang['qb_extlink']            = 'ลิงก์ไปที่อื่น (อย่าลืม http:// นำหน้าเสมอ)';
+$lang['qb_hr']                 = 'เส้นนอน';
+$lang['qb_ol']                 = 'รายการที่เรียงลำดับแล้ว';
+$lang['qb_ul']                 = 'รายการที่ยังไม่ได้เรียงลำดับ';
+$lang['qb_media']              = 'เพิ่มภาพและไฟล์อื่นๆ';
+$lang['qb_sig']                = 'ลายเซ็นพร้อมลงเวลา';
+$lang['qb_smileys']            = 'ภาพแสดงอารมณ์';
+$lang['qb_chars']              = 'อักขระพิเศษ';
+$lang['upperns']               = 'กระโดดขึ้นไปยังเนมสเปซแม่';
+$lang['metaedit']              = 'แก้ไขข้อมูลเมต้า';
+$lang['metasaveerr']           = 'มีข้อผิดพลาดในการเขียนข้อมูลเมต้า';
+$lang['metasaveok']            = 'บันทึกเมต้าดาต้าแล้ว';
+$lang['img_title']             = 'ชื่อภาพ:';
+$lang['img_caption']           = 'คำบรรยายภาพ:';
+$lang['img_date']              = 'วันที่:';
+$lang['img_fname']             = 'ชื่อไฟล์:';
+$lang['img_fsize']             = 'ขนาดภาพ:';
+$lang['img_artist']            = 'ผู้สร้างสรรค์:';
+$lang['img_copyr']             = 'ผู้ถือลิขสิทธิ์:';
+$lang['img_format']            = 'รูปแบบ:';
+$lang['img_camera']            = 'กล้อง:';
+$lang['img_keywords']          = 'คำหลัก:';
+$lang['authtempfail']          = 'ระบบตรวจสอบสิทธิ์ผู้ใช้ไม่พร้อมใช้งานชั่วคราว หากสถานการณ์ยังไม่เปลี่ยนแปลง กรุณาแจ้งผู้ดูแลระบวิกิของคุณ';
+$lang['i_chooselang']          = 'เลือกภาษาของคุณ';
+$lang['i_installer']           = 'ตัวติดตั้งโดกุวิกิ';
+$lang['i_wikiname']            = 'ชื่อวิกิ';
+$lang['i_enableacl']           = 'เปิดระบบ ACL(แนะนำ)';
+$lang['i_superuser']           = 'ซุปเปอร์ยูสเซอร์';
+$lang['i_problems']            = 'ตัวติดตั้งพบปัญหาบางประการ ตามที่ระบุด้านล่าง คุณไม่สามารถทำต่อได้จนกว่าจะได้แก้ไขสิ่งเหล่านั้น';
+$lang['i_modified']            = 'ด้วยเหตุผลด้านความปลอดภัย สคริปต์นี้จะทำงานกับเฉพาะโดกุวิกิที่ติดตั้งใหม่หรือยังไม่ได้ดัดแปลงแก้ไข
+คุณควรเลือกระหว่างคลี่ไฟล์จากแพคเกจที่ได้ดาวน์โหลดมาอีกครั้ง หรือศึกษาจากคู่มือ
+<a href="http://dokuwiki.org/install">Dokuwiki installation instructions</a>';
+$lang['i_funcna']              = 'PHP function <code>%s</code> ไม่สามารถใช้งานได้ อาจเป็นเพราะผู้ให้บริการโฮสไม่เปิดให้ใช้งาน';
+$lang['i_phpver']              = 'PHP รุ่นที่คุณกำลังใช้งานอยู่คือ <code>%s</code> คุณจำเป็นต้องอัพเกรด PHP ให้เป็นรุ่น <code>%s</code> หรือสูงกว่า';
+$lang['i_permfail']            = '<code>%s</code> DokuWiki ไม่สามารถเขียนข้อมูลได้ ต้องตั้งค่าสิทธิ์การอนุญาตของไดเรคทอรีนี้เสียก่อน!';
+$lang['i_confexists']          = '<code>%s</code> ถูกใช้งานไปแล้ว';
+$lang['i_writeerr']            = 'ไม่สามารถสร้าง <code>%s</code>. ตรวจสอบสิทธิ์การอนุญาตของไดเรคทอรีหรือไฟล์ แล้วสร้างไฟล์ด้วยตนเอง';
+$lang['i_policy']              = 'นโยบายสิทธิ์เข้าถึง(ACL)ตั้งต้น';
+$lang['i_pol0']                = 'วิกิเปิดกว้าง (ใครก็ อ่าน, เขียน, อัพโหลดได้)';
+$lang['i_pol1']                = 'วิกิสาธารณะ (ทุกคนอ่านได้, เขียน และ อัพโหลดเฉพาะผู้ใช้ที่ลงทะเบียนแล้ว)';
+$lang['i_pol2']                = 'วิกิภายใน (อ่าน, เขียน, อัพโหลด สำหรับผู้ใช้ที่ลงทะเบียนแล้วเท่านั้น)';
+$lang['i_retry']               = 'ลองใหม่';
+$lang['years']                 = '%d ปีก่อน';
+$lang['months']                = '%d เดือนก่อน';
+$lang['weeks']                 = '%d สัปดาห์ก่อน';
+$lang['days']                  = '%d วันก่อน';
+$lang['hours']                 = '%d ชั่วโมงก่อน';
+$lang['minutes']               = '%d นาทีก่อน';
+$lang['seconds']               = '%d วินาทีก่อน';
+$lang['email_signature_text'] = 'จดหมายนี้ถูกสร้างขึ้นโดยโดกุวิกิที่
+@DOKUWIKIURL@';
diff --git a/wiki/inc/lang/th/locked.txt b/wiki/inc/lang/th/locked.txt
new file mode 100644
index 0000000..a198ad7
--- /dev/null
+++ b/wiki/inc/lang/th/locked.txt
@@ -0,0 +1,3 @@
+====== เพจถูกล๊อค ======
+
+เพจนี้กำลังถูกล๊อคจากการแก้ไขโดยผู้ใช้ท่านอื่น คุณต้องรอจนกว่าผู้ใช้คนนี้จะแก้ไขเสร็จ หรือการล๊อคนั้นหมดเวลา
\ No newline at end of file
diff --git a/wiki/inc/lang/th/login.txt b/wiki/inc/lang/th/login.txt
new file mode 100644
index 0000000..d384c2d
--- /dev/null
+++ b/wiki/inc/lang/th/login.txt
@@ -0,0 +1,4 @@
+====== ล็อกอิน ======
+
+คุณยังไม่ได้เข้าสู่ระบบ(ล็อกอิน)ในขณะนี้! กรอกรายละเอียดเพื่อพิสูจน์สิทธิ์ข้างล่างนี้เพื่อล็อกอิน คุณต้องเปิดคุ๊กกี้ให้ทำงานก่อนที่จะล็อกอิน
+
diff --git a/wiki/inc/lang/th/mailtext.txt b/wiki/inc/lang/th/mailtext.txt
new file mode 100644
index 0000000..5dec222
--- /dev/null
+++ b/wiki/inc/lang/th/mailtext.txt
@@ -0,0 +1,12 @@
+เพจในโดกุวิกิของคุณได้ถูกเพิ่ม หรือแก้ไข นี่คือรายละเอียด:
+
+วันที่: @DATE@
+บราวเซอร์: @BROWSER@
+ที่อยู่ไอพี: @IPADDRESS@
+ชื่อโฮสต์: @HOSTNAME@
+ฉบับเก่า: @OLDPAGE@
+ฉบับใหม่: @NEWPAGE@
+สรุปการแก้ไข: @SUMMARY@
+ผู้ใช้: @USER@
+
+@DIFF@
diff --git a/wiki/inc/lang/th/newpage.txt b/wiki/inc/lang/th/newpage.txt
new file mode 100644
index 0000000..cab906d
--- /dev/null
+++ b/wiki/inc/lang/th/newpage.txt
@@ -0,0 +1,3 @@
+====== ยังไม่มีหัวข้อนี้ ======
+
+คุณได้กดลิ้งค์เข้ามายังหัวข้อที่ยังไม่ได้สร้าง ถ้าคุณได้รับอนุญาติ คุณอาจจะสร้างมันได้ด้วยการกดปุ่ม "สร้างเพจนี้"
\ No newline at end of file
diff --git a/wiki/inc/lang/th/norev.txt b/wiki/inc/lang/th/norev.txt
new file mode 100644
index 0000000..9127a20
--- /dev/null
+++ b/wiki/inc/lang/th/norev.txt
@@ -0,0 +1,3 @@
+====== ไม่มีฉบับที่ระบุ ======
+
+ฉบับที่ระบุไม่มีอยู่จริง กรุณาใช้ปุ่ม "ฉบับเก่าๆ" เพื่อแสดงรายการรุ่นเก่าๆของเอกสารนี้ิ
\ No newline at end of file
diff --git a/wiki/inc/lang/th/password.txt b/wiki/inc/lang/th/password.txt
new file mode 100644
index 0000000..e463e76
--- /dev/null
+++ b/wiki/inc/lang/th/password.txt
@@ -0,0 +1,6 @@
+สวัสดี@FULLNAME@!
+
+นี่คือข้อมูลผู้ใช้ของคุณสำหรับ @TITLE@ ที่ @DOKUWIKIURL@
+
+ล็อกอิน: @LOGIN@
+รหัสผ่าน : @PASSWORD@
diff --git a/wiki/inc/lang/th/preview.txt b/wiki/inc/lang/th/preview.txt
new file mode 100644
index 0000000..caaf8ad
--- /dev/null
+++ b/wiki/inc/lang/th/preview.txt
@@ -0,0 +1,3 @@
+====== ดูตัวอย่าง ======
+
+นี่คือหน้าตัวอย่างของข้อความที่คุณกรอก จำไว้ว่า: มันยัง **ไม่ได้บันทึก** เก็บไว้!
\ No newline at end of file
diff --git a/wiki/inc/lang/th/pwconfirm.txt b/wiki/inc/lang/th/pwconfirm.txt
new file mode 100644
index 0000000..1cf42c8
--- /dev/null
+++ b/wiki/inc/lang/th/pwconfirm.txt
@@ -0,0 +1,10 @@
+เฮ้ @FULLNAME@!
+
+มีบางคนร้องขอรหัสผ่านใหม่สำหรับ @TITLE@ ของคุณ
+เพื่อล็อกอินที่ @DOKUWIKIURL@
+
+ถ้าคุรไม่ได้ร้องขอรหัสผ่านใหม่ ก็ไม่ต้องสนใจอีเมลนี้
+
+หากต้องการยืนยันว่านี่การร้องขอนี้ถูกส่งโดยคุณจริงๆ กรุณาใช้ลิงค์ดังต่อไปนี้
+
+@CONFIRM@
diff --git a/wiki/inc/lang/th/read.txt b/wiki/inc/lang/th/read.txt
new file mode 100644
index 0000000..ac4f312
--- /dev/null
+++ b/wiki/inc/lang/th/read.txt
@@ -0,0 +1 @@
+หน้านี้มีไว้อ่านอย่างเดียว คุณสามารถอ่านข้อความต้นฉบับ ไม่สามารถแก้ไขได้ ให้สอบถามผู้ดูแลระบบถ้าคุณคิดว่านี่คือข้อผิดพลาด
\ No newline at end of file
diff --git a/wiki/inc/lang/th/recent.txt b/wiki/inc/lang/th/recent.txt
new file mode 100644
index 0000000..1655ae8
--- /dev/null
+++ b/wiki/inc/lang/th/recent.txt
@@ -0,0 +1,3 @@
+====== การเปลี่ยนแปลงเมื่อเร็วๆนี้ ======
+
+เพจเหล่านี้ถูกเปลี่ยนแปลงเมื่อเร็วๆนี้
\ No newline at end of file
diff --git a/wiki/inc/lang/th/register.txt b/wiki/inc/lang/th/register.txt
new file mode 100644
index 0000000..ed4a408
--- /dev/null
+++ b/wiki/inc/lang/th/register.txt
@@ -0,0 +1,3 @@
+====== ลงทะเบียนเป็นผู้ใช้หน้าใหม่ ======
+
+กรอกข้อมูลทั้งหมดด้านล่างเพื่อสร้างบัญชีใหม่ในวิกินี้ ให้แน่ใจว่าคุณให้ **ที่อยู่อีเมลที่ใช้ได้จริง** ถ้าคุณไม่ถูกถามให้กรอกรหัสผา่นที่นี่, รหัสผ่านใหม่จะถูกส่งไปยังที่อยู่ดังกล่าว ชื่อล็อกอินควรจะใช้ได้ถูกต้องตาม[[doku>pagename|pagename]].
\ No newline at end of file
diff --git a/wiki/inc/lang/th/registermail.txt b/wiki/inc/lang/th/registermail.txt
new file mode 100644
index 0000000..4cfaddd
--- /dev/null
+++ b/wiki/inc/lang/th/registermail.txt
@@ -0,0 +1,10 @@
+มีผู้ใช้คนใหม่ได้ลงทะเบียน นี่คือรายละเอียด:
+
+ชื่อผู้ใช้ : @NEWUSER@
+ชื่อเต็ม : @NEWNAME@
+อีเมล : @NEWEMAIL@
+
+วันที่ : @DATE@
+บราวเซอร์ : @BROWSER@
+ที่อยู่ไอพี : @IPADDRESS@
+ชื่อโฮสต์ : @HOSTNAME@
diff --git a/wiki/inc/lang/th/resendpwd.txt b/wiki/inc/lang/th/resendpwd.txt
new file mode 100644
index 0000000..1935abe
--- /dev/null
+++ b/wiki/inc/lang/th/resendpwd.txt
@@ -0,0 +1,3 @@
+====== ส่งรหัสผ่านใหม่ ======
+
+กรุณากรอกชื่อผู้ใช้ในช่องด้านล่างเพื่อร้องขอรหัสผ่านใหม่จากบัญชีของคุณในวิกินี้ ลิงค์ยืนยันจะถูกส่งไปยังที่อยู่อีเมลที่คุณลงทะเบียนไว้
\ No newline at end of file
diff --git a/wiki/inc/lang/th/revisions.txt b/wiki/inc/lang/th/revisions.txt
new file mode 100644
index 0000000..98a49d7
--- /dev/null
+++ b/wiki/inc/lang/th/revisions.txt
@@ -0,0 +1,3 @@
+====== ฉบับเก่า ======
+
+เหล่านี้เป็นรายการฉบับเก่าของเอกสารปัจจุบัน หากต้องการคืนสภาพฉบับเก่า ให้เลือกมันจากด้านล่าง, คลิ๊ก "แก้ไขเพจนี้" แล้วจึงค่อยบันทึกมัน
\ No newline at end of file
diff --git a/wiki/inc/lang/th/searchpage.txt b/wiki/inc/lang/th/searchpage.txt
new file mode 100644
index 0000000..87153b0
--- /dev/null
+++ b/wiki/inc/lang/th/searchpage.txt
@@ -0,0 +1,4 @@
+====== สืบค้น ======
+
+คุณสามารถพบผลลัพธ์การสืบค้นของคุณด้านล่าง @CREATEPAGEINFO@
+
diff --git a/wiki/inc/lang/th/showrev.txt b/wiki/inc/lang/th/showrev.txt
new file mode 100644
index 0000000..f93869f
--- /dev/null
+++ b/wiki/inc/lang/th/showrev.txt
@@ -0,0 +1,2 @@
+**นี่คือเอกสารรุ่น/ฉบับเก่า**
+----
\ No newline at end of file
diff --git a/wiki/inc/lang/th/updateprofile.txt b/wiki/inc/lang/th/updateprofile.txt
new file mode 100644
index 0000000..3e0a8df
--- /dev/null
+++ b/wiki/inc/lang/th/updateprofile.txt
@@ -0,0 +1,3 @@
+====== ปรับปรุงข้อมูลส่วนตัวของบัญชีคุณ ======
+
+คุณเพียงต้องการกรอกช่องที่ต้องการแก้ไขเหล่านี้ให้ครบ แต่ไม่สามารถเปลี่ยนชื่อผู้ใช้ได้
\ No newline at end of file
diff --git a/wiki/inc/lang/th/uploadmail.txt b/wiki/inc/lang/th/uploadmail.txt
new file mode 100644
index 0000000..9d042b9
--- /dev/null
+++ b/wiki/inc/lang/th/uploadmail.txt
@@ -0,0 +1,10 @@
+มีไฟล์ได้ถูกอัพโหลดเข้าไปยังโดกุวิกิของคุณ นี่คือรายละเอียด:
+
+ไฟล์: @MEDIA@
+วันที่: @DATE@
+เบราเซอร์: @BROWSER@
+ที่อยู่ไอพี: @IPADDRESS@
+ชื่อโฮสต์: @HOSTNAME@
+ขนาด: @SIZE@
+MIME Type : @MIME@
+ผู้ใช้: @USER@
diff --git a/wiki/inc/lang/tr/admin.txt b/wiki/inc/lang/tr/admin.txt
new file mode 100644
index 0000000..2292b6e
--- /dev/null
+++ b/wiki/inc/lang/tr/admin.txt
@@ -0,0 +1,3 @@
+====== Yönetim ======
+
+Aşağıda DokuWiki için yapılabilecek yönetim işleri vardır.
diff --git a/wiki/inc/lang/tr/adminplugins.txt b/wiki/inc/lang/tr/adminplugins.txt
new file mode 100644
index 0000000..7c8de9d
--- /dev/null
+++ b/wiki/inc/lang/tr/adminplugins.txt
@@ -0,0 +1 @@
+===== İlave Eklentiler =====
\ No newline at end of file
diff --git a/wiki/inc/lang/tr/backlinks.txt b/wiki/inc/lang/tr/backlinks.txt
new file mode 100644
index 0000000..e219a60
--- /dev/null
+++ b/wiki/inc/lang/tr/backlinks.txt
@@ -0,0 +1,4 @@
+====== Geri linkler ======
+
+Bu sayfaya bağlantı veren sayfaların listesi aşağıdadır.
+
diff --git a/wiki/inc/lang/tr/conflict.txt b/wiki/inc/lang/tr/conflict.txt
new file mode 100644
index 0000000..5049479
--- /dev/null
+++ b/wiki/inc/lang/tr/conflict.txt
@@ -0,0 +1,6 @@
+====== Yeni versiyon mevcut ======
+
+Değiştirdiğiniz dökümanın daha yeni bir versiyonu mevcut. Bu durum, siz dökümanı değiştirirken başka bir kullanıcının da aynı dökümanı değiştirmesi halinde olur.
+
+Aşağıda gösterilen farkları dikkatlice inceleyin, daha sonra hangi versiyonun korunacağına karar verin. Eğer ''Kaydet''i seçerseniz, sizin sürümünüz kaydedilir. Mevcut sürümü korumak için ''İptal''e tıklayın.
+
diff --git a/wiki/inc/lang/tr/denied.txt b/wiki/inc/lang/tr/denied.txt
new file mode 100644
index 0000000..2acfd7a
--- /dev/null
+++ b/wiki/inc/lang/tr/denied.txt
@@ -0,0 +1,4 @@
+====== Yetki Reddedildi ======
+
+Üzgünüz, devam etmek için yetkiniz yok.
+
diff --git a/wiki/inc/lang/tr/diff.txt b/wiki/inc/lang/tr/diff.txt
new file mode 100644
index 0000000..72baa67
--- /dev/null
+++ b/wiki/inc/lang/tr/diff.txt
@@ -0,0 +1,4 @@
+====== Farklar ======
+
+Bu sayfanın seçili sürümü ile mevcut sürümü arasındaki farkları gösterir.
+
diff --git a/wiki/inc/lang/tr/draft.txt b/wiki/inc/lang/tr/draft.txt
new file mode 100644
index 0000000..b1a8881
--- /dev/null
+++ b/wiki/inc/lang/tr/draft.txt
@@ -0,0 +1,5 @@
+====== Taslak Dosyası Bulundu ======
+
+Bu sayfadaki en son oturumunuz düzgün olarak tamamlanmamış. DokuWiki otomatik olarak bir taslak kaydetmiş olduğu için çalışmanıza devam edebilirsiniz.  Aşağıda en son oturumunuzda kaydedilmiş olan taslağı görebilirsiniz.
+
+Bu taslağı //geri getirebilir//, //silebilir// veya düzenleme sürecinden //vazgeçebilirsiniz//.
\ No newline at end of file
diff --git a/wiki/inc/lang/tr/edit.txt b/wiki/inc/lang/tr/edit.txt
new file mode 100644
index 0000000..4f84c4e
--- /dev/null
+++ b/wiki/inc/lang/tr/edit.txt
@@ -0,0 +1,2 @@
+Sayfayı değiştirin ve ''Kaydete'' basın. Wiki sözdizimi için [[wiki:syntax]]'a bakınız. Lütfen sayfayı sadece eğer **geliştirebiliyorsanız** değiştirin. Eğer testler yapmak istiyorsanız, [[playground:playground|playground]] adresini kullanın.
+
diff --git a/wiki/inc/lang/tr/editrev.txt b/wiki/inc/lang/tr/editrev.txt
new file mode 100644
index 0000000..9c70fbe
--- /dev/null
+++ b/wiki/inc/lang/tr/editrev.txt
@@ -0,0 +1,2 @@
+**Sayfanın eski bir sürümünü yüklediniz!** Eğer kaydederseniz, bu veriyle yeni bir sürüm oluşturacaksınız.
+----
diff --git a/wiki/inc/lang/tr/index.txt b/wiki/inc/lang/tr/index.txt
new file mode 100644
index 0000000..e361e87
--- /dev/null
+++ b/wiki/inc/lang/tr/index.txt
@@ -0,0 +1,4 @@
+====== İndeks ======
+
+Bu mevcut tüm sayfaların [[doku>namespaces|isim alanlarına]] göre sıralı bir indeksidir.
+
diff --git a/wiki/inc/lang/tr/install.html b/wiki/inc/lang/tr/install.html
new file mode 100644
index 0000000..de82d72
--- /dev/null
+++ b/wiki/inc/lang/tr/install.html
@@ -0,0 +1,8 @@
+<p>Bu sayfa <a href="http://dokuwiki.org">Dokuwiki</a> kurmanıza yardımcı olmaktadır. Kurulum hakkında bilgi sahibi olmak için <a href="http://dokuwiki.org/installer">bu sayfayı</a> ziyaret edebilirsiniz.</p>
+
+<p>DokuWiki wiki sayfalarını ve wiki sayfalarına ilişkin verileri (resimler, arama indeksi, geçmiş sürümler) dosyalarda tutar. DokuWikiyi sorunsuz olarak kullanmak için bu dosyaların bulunduğu dizinlere <strong>mutlaka</strong> yazma izniniz olması gereklidir.  Bu kurulum betiği yazma izinlerini ayarlayamamaktadır. İzinleri shell, FTP veya kontrol paneliniz (CPanel, Plesk vs.) aracılığı ile düzenleyebilirsiniz.</p>
+
+<p>Kurulum betiği <abbr title="access control list">ACL</abbr>'yi otomatik olarak ayarlamaktadır.  Böylece yönetici izinleri belirlenip, DokuWiki kullanımı kolaylaştırılmaktadır.</p>
+
+<p>Deneyimli kullanıcılar <a href="http://dokuwiki.org/install">bu sayfayı </a>
+ edebilir ve <a href="http://dokuwiki.org/config">bu sayfa yardımıyla</a>  yapılandırma hakkında ekstra bilgi sahibi olabilir.</p>
\ No newline at end of file
diff --git a/wiki/inc/lang/tr/jquery.ui.datepicker.js b/wiki/inc/lang/tr/jquery.ui.datepicker.js
new file mode 100644
index 0000000..8328e21
--- /dev/null
+++ b/wiki/inc/lang/tr/jquery.ui.datepicker.js
@@ -0,0 +1,37 @@
+/* Turkish initialisation for the jQuery UI date picker plugin. */
+/* Written by Izzet Emre Erkan (kara@karalamalar.net). */
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "../widgets/datepicker" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery.datepicker );
+	}
+}( function( datepicker ) {
+
+datepicker.regional.tr = {
+	closeText: "kapat",
+	prevText: "&#x3C;geri",
+	nextText: "ileri&#x3e",
+	currentText: "bugün",
+	monthNames: [ "Ocak","Şubat","Mart","Nisan","Mayıs","Haziran",
+	"Temmuz","Ağustos","Eylül","Ekim","Kasım","Aralık" ],
+	monthNamesShort: [ "Oca","Şub","Mar","Nis","May","Haz",
+	"Tem","Ağu","Eyl","Eki","Kas","Ara" ],
+	dayNames: [ "Pazar","Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartesi" ],
+	dayNamesShort: [ "Pz","Pt","Sa","Ça","Pe","Cu","Ct" ],
+	dayNamesMin: [ "Pz","Pt","Sa","Ça","Pe","Cu","Ct" ],
+	weekHeader: "Hf",
+	dateFormat: "dd.mm.yy",
+	firstDay: 1,
+	isRTL: false,
+	showMonthAfterYear: false,
+	yearSuffix: "" };
+datepicker.setDefaults( datepicker.regional.tr );
+
+return datepicker.regional.tr;
+
+} ) );
diff --git a/wiki/inc/lang/tr/lang.php b/wiki/inc/lang/tr/lang.php
new file mode 100644
index 0000000..4147a13
--- /dev/null
+++ b/wiki/inc/lang/tr/lang.php
@@ -0,0 +1,342 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Selim Farsakoğlu <farsakogluselim@yahoo.de>
+ * @author Aydın Coşkuner <aydinweb@gmail.com>
+ * @author Cihan Kahveci <kahvecicihan@gmail.com>
+ * @author Yavuz Selim <yavuzselim@gmail.com>
+ * @author Caleb Maclennan <caleb@alerque.com>
+ * @author farukerdemoncel@gmail.com
+ * @author Mustafa Aslan <maslan@hotmail.com>
+ * @author huseyin can <huseyincan73@gmail.com>
+ * @author ilker rifat kapaç <irifat@gmail.com>
+ * @author İlker R. Kapaç <irifat@gmail.com>
+ * @author Mete Cuma <mcumax@gmail.com>
+ */
+$lang['encoding']              = 'utf-8';
+$lang['direction']             = 'ltr';
+$lang['doublequoteopening']    = '“';
+$lang['doublequoteclosing']    = '”';
+$lang['singlequoteopening']    = '‘';
+$lang['singlequoteclosing']    = '’';
+$lang['apostrophe']            = '’';
+$lang['btn_edit']              = 'Sayfayı düzenle';
+$lang['btn_source']            = 'Kaynağı göster';
+$lang['btn_show']              = 'Sayfayı göster';
+$lang['btn_create']            = 'Bu sayfayı oluştur';
+$lang['btn_search']            = 'Ara';
+$lang['btn_save']              = 'Kaydet';
+$lang['btn_preview']           = 'Önizleme';
+$lang['btn_top']               = 'Başa dön';
+$lang['btn_newer']             = '<< daha yeniler';
+$lang['btn_older']             = 'daha eskiler >>';
+$lang['btn_revs']              = 'Eski sürümler';
+$lang['btn_recent']            = 'En son değişiklikler';
+$lang['btn_upload']            = 'Yükle';
+$lang['btn_cancel']            = 'İptal';
+$lang['btn_index']             = 'İndeks';
+$lang['btn_secedit']           = 'Düzenle';
+$lang['btn_login']             = 'Giriş yap';
+$lang['btn_logout']            = 'Çıkış yap';
+$lang['btn_admin']             = 'Yönetici';
+$lang['btn_update']            = 'Güncelle';
+$lang['btn_delete']            = 'Sil';
+$lang['btn_back']              = 'Geri';
+$lang['btn_backlink']          = 'Geri linkler';
+$lang['btn_subscribe']         = 'Sayfa Değişikliklerini Bildir';
+$lang['btn_profile']           = 'Kullanıcı Bilgilerini Güncelle';
+$lang['btn_reset']             = 'Sıfırla';
+$lang['btn_resendpwd']         = 'Yeni şifre belirle';
+$lang['btn_draft']             = 'Taslağı düzenle';
+$lang['btn_recover']           = 'Taslağı geri yükle';
+$lang['btn_draftdel']          = 'Taslağı sil';
+$lang['btn_revert']            = 'Geri Yükle';
+$lang['btn_register']          = 'Kayıt ol';
+$lang['btn_apply']             = 'Uygula';
+$lang['btn_media']             = 'Çokluortam Yöneticisi';
+$lang['btn_deleteuser']        = 'Hesabımı Sil';
+$lang['btn_img_backto']        = 'Şuna dön: %s';
+$lang['btn_mediaManager']      = 'Ortam oynatıcısında göster';
+$lang['loggedinas']            = 'Giriş ismi:';
+$lang['user']                  = 'Kullanıcı ismi';
+$lang['pass']                  = 'Parola';
+$lang['newpass']               = 'Yeni Parola';
+$lang['oldpass']               = 'Kullanılan parolayı doğrula';
+$lang['passchk']               = 'Bir kez daha girin';
+$lang['remember']              = 'Beni hatırla';
+$lang['fullname']              = 'Tam isim';
+$lang['email']                 = 'E-posta';
+$lang['profile']               = 'Kullanıcı Bilgileri';
+$lang['badlogin']              = 'Üzgünüz, Kullanıcı adı veya şifre yanlış oldu.';
+$lang['badpassconfirm']        = 'Üzgünüz, parolanız yanlış';
+$lang['minoredit']             = 'Küçük Değişiklikler';
+$lang['draftdate']             = 'Taslak şu saatte otomatik kaydedildi:';
+$lang['nosecedit']             = 'Sayfa yakın zamanda değiştirilmiştir, bölüm bilgisi eski kalmıştır. Bunun için bölüm yerine tüm sayfa yüklenmiştir.';
+$lang['regmissing']            = 'Üzgünüz, tüm alanları doldurmalısınız.';
+$lang['reguexists']            = 'Üzgünüz, bu isime sahip bir kullanıcı zaten mevcut.';
+$lang['regsuccess']            = 'Kullanıcı oluşturuldu ve şifre e-posta adresine gönderildi.';
+$lang['regsuccess2']           = 'Kullanıcı oluşturuldu.';
+$lang['regfail']               = 'Kullanıcı oluşturulamadı.';
+$lang['regmailfail']           = 'Şifrenizi e-posta ile gönderirken bir hata oluşmuş gibi görünüyor. Lütfen yönetici ile temasa geçiniz!';
+$lang['regbadmail']            = 'Verilen e-posta adresi geçersiz gibi görünüyor - bunun bir hata olduğunu düşünüyorsanız yönetici ile temasa geçiniz.';
+$lang['regbadpass']            = 'Girilen parolalar aynı değil. Lütfen tekrar deneyiniz.';
+$lang['regpwmail']             = 'DokuWiki parolanız';
+$lang['reghere']               = 'Daha hesabınız yok mu? Hemen bir tane açtırın!';
+$lang['profna']                = 'Bu wiki kullanıcı bilgilerini değiştirmeyi desteklememektedir';
+$lang['profnochange']          = 'Değişiklik yok, birşey yapılmadı.';
+$lang['profnoempty']           = 'Boş isim veya e-posta adresine izin verilmiyor.';
+$lang['profchanged']           = 'Kullanıcı bilgileri başarıyla değiştirildi.';
+$lang['profnodelete']          = 'Bu wiki kullanıcı silmeyi desteklemiyor';
+$lang['profdeleteuser']        = 'Hesabı Sil';
+$lang['profdeleted']           = 'Bu wiki\'den hesabınız silindi';
+$lang['profconfdelete']        = 'Bu wiki\'den hesabımı silmek istiyorum. <br/>Bu işlem geri alınamaz';
+$lang['profconfdeletemissing'] = 'Onay kutusu işaretlenmedi';
+$lang['proffail']              = 'Kullanıcı bilgileri güncellenmedi.';
+$lang['pwdforget']             = 'Parolanızı mı unuttunuz? Yeni bir parola alın';
+$lang['resendna']              = 'Bu wiki parolayı tekrar göndermeyi desteklememektedir.';
+$lang['resendpwd']             = 'İçin yeni şifre belirle';
+$lang['resendpwdmissing']      = 'Üzgünüz, tüm alanları doldurmalısınız.';
+$lang['resendpwdnouser']       = 'Üzgünüz,  veritabanımızda bu kullanıcıyı bulamadık.';
+$lang['resendpwdbadauth']      = 'Üzgünüz, bu doğrulama kodu doğru değil. Doğrulama linkini tam olarak kullandığınıza emin olun.';
+$lang['resendpwdconfirm']      = 'Doğrulama linki e-posta adresinize gönderildi.';
+$lang['resendpwdsuccess']      = 'Yeni parolanız e-posta adresinize gönderildi.';
+$lang['license']               = 'Aksi belirtilmediği halde, bu wikinin içeriğinin telif hakları şu lisans ile korunmaktadır:';
+$lang['licenseok']             = 'Not: Bu sayfayı değiştirerek yazınızın şu lisans ile yayınlanmasını kabul etmiş olacaksınız:';
+$lang['searchmedia']           = 'Dosya Adı Ara:';
+$lang['searchmedia_in']        = '%s içinde ara';
+$lang['txt_upload']            = 'Yüklenecek dosyayı seç:';
+$lang['txt_filename']          = 'Dosya adı (zorunlu değil):';
+$lang['txt_overwrt']           = 'Mevcut dosyanın üstüne yaz';
+$lang['maxuploadsize']         = 'Yükleme dosya başına en fazla %s';
+$lang['lockedby']              = 'Şu an şunun tarafından kilitli:';
+$lang['lockexpire']            = 'Kilitin açılma tarihi:';
+$lang['js']['willexpire']      = 'Bu sayfayı değiştirme kilidinin süresi yaklaşık bir dakika içinde geçecek.\nÇakışmaları önlemek için önizleme tuşunu kullanarak kilit sayacını sıfırla.';
+$lang['js']['notsavedyet']     = 'Kaydedilmemiş değişiklikler kaybolacak.
+Devam etmek istiyor musunuz?';
+$lang['js']['searchmedia']     = 'Dosyalar için Ara';
+$lang['js']['keepopen']        = 'Seçim yapıldığında bu pencereyi açık tut';
+$lang['js']['hidedetails']     = 'Ayrıntıları gizle';
+$lang['js']['mediatitle']      = 'Bağlantı Ayarları';
+$lang['js']['mediadisplay']    = 'Bağlantı Tipi';
+$lang['js']['mediaalign']      = 'Hizalama';
+$lang['js']['mediasize']       = 'Resim büyüklüğü';
+$lang['js']['mediatarget']     = 'Bağlantı hedefi';
+$lang['js']['mediaclose']      = 'Kapat';
+$lang['js']['mediainsert']     = 'Ekle';
+$lang['js']['mediadisplayimg'] = 'Resmi görüntüle';
+$lang['js']['mediadisplaylnk'] = 'Sadece bağlantıyı görüntüle ';
+$lang['js']['mediasmall']      = 'Küçük versiyon';
+$lang['js']['mediamedium']     = 'Orta versiyon';
+$lang['js']['medialarge']      = 'Büyük versiyon';
+$lang['js']['mediaoriginal']   = 'Orjinal versiyon';
+$lang['js']['medialnk']        = 'Detay sayfasına bağlantı';
+$lang['js']['mediadirect']     = 'Orjinal sayfaya bağlantı';
+$lang['js']['medianolnk']      = 'Bağlantı yok';
+$lang['js']['medianolink']     = 'Resme bağlantı verme';
+$lang['js']['medialeft']       = 'Resmi sola hizala';
+$lang['js']['mediaright']      = 'Resmi sağa hizala';
+$lang['js']['mediacenter']     = 'Resmi ortaya hizala';
+$lang['js']['medianoalign']    = 'Hizalama kullanma';
+$lang['js']['nosmblinks']      = 'Windows paylaşımı sadece Microsoft Internet Explorer ile çalışmaktadır. Yine de hala bağlantıyı kopyalayıp yapıştırarak kullanabilirsiniz. ';
+$lang['js']['linkwiz']         = 'Bağlantı sihirbazı';
+$lang['js']['linkto']          = 'Bağlantı:';
+$lang['js']['del_confirm']     = 'Bu girişi sil?';
+$lang['js']['restore_confirm'] = 'Bu sürüme geri dönmek istediğinizden emin misiniz?';
+$lang['js']['media_diff']      = 'Farkları gör:';
+$lang['js']['media_diff_both'] = 'Yan yana';
+$lang['js']['media_select']    = 'Dosyalar seç...';
+$lang['js']['media_upload_btn'] = 'Yükle';
+$lang['js']['media_done_btn']  = 'Bitti';
+$lang['js']['media_drop']      = 'Yüklemek istediğiniz dosyaları buraya bırakın';
+$lang['js']['media_cancel']    = 'kaldır';
+$lang['js']['media_overwrt']   = 'Var olan dosyaların üzerine yaz';
+$lang['rssfailed']             = 'Bu beslemeyi çekerken hata oluştu: ';
+$lang['nothingfound']          = 'Hiçbir şey yok.';
+$lang['mediaselect']           = 'Çokluortam dosyası seçimi';
+$lang['uploadsucc']            = 'Yükleme tamam';
+$lang['uploadfail']            = 'Yükleme başarısız. Yetki hatası olabilir!';
+$lang['uploadwrong']           = 'Yükleme engellendi. Bu dosya uzantısına izin verilmiyor!';
+$lang['uploadexist']           = 'Dosya zaten var. Hiçbir şey yapılmadı.';
+$lang['uploadbadcontent']      = 'Yüklenen içerik %s uzantısı ile uyuşmuyor.';
+$lang['uploadspam']            = 'Yükleme işlemi spam karalistesi tarafından engellendi.';
+$lang['uploadxss']             = 'Yükleme işlemi muhtemel kötü içerik sebebiyle engellendi.';
+$lang['uploadsize']            = 'Yüklenmek istenen dosya boyutu çok büyük (en fazla %s)';
+$lang['deletesucc']            = '"%s" dosyası silindi.';
+$lang['deletefail']            = '"%s" silinemedi - yetkileri kontrol et.';
+$lang['mediainuse']            = '"%s" dosyası silinmedi, hala kullanımda.';
+$lang['namespaces']            = 'Namespaces';
+$lang['mediafiles']            = 'Şuradaki kullanıma hazır dosyalar:';
+$lang['accessdenied']          = 'Bu sayfayı görüntüleme yetkiniz bulunmamaktadır';
+$lang['mediausage']            = 'Şu ';
+$lang['mediaview']             = 'Özgün dosyayı göster';
+$lang['mediaroot']             = 'Kök dizini';
+$lang['mediaupload']           = 'Dosya bu namespace\'e yüklenir. Alt namespace oluşturmak için "Dosya adı" kısmınının başına alt namespace adını ekleyip ardından iki nokta koyun.';
+$lang['mediaextchange']        = 'Dosya uzantısı .%s\'den .%s\'e çevrildi!';
+$lang['reference']             = 'Şunun için referanslar:';
+$lang['ref_inuse']             = 'Dosya silinemiyor, çünkü şu sayfalar tarafından hala kullanılmakta:';
+$lang['ref_hidden']            = 'Bazı referanslar okuma yetkiniz olmayan sayfalarda';
+$lang['hits']                  = 'tane bulundu';
+$lang['quickhits']             = 'Uyan sayfalar';
+$lang['toc']                   = 'İçindekiler';
+$lang['current']               = 'mevcut';
+$lang['yours']                 = 'Senin Sürümün';
+$lang['diff']                  = 'Kullanılan sürüm ile farkları göster';
+$lang['diff2']                 = 'Seçili sürümler arasındaki farkı göster';
+$lang['difflink']              = 'Karşılaştırma görünümüne bağlantı';
+$lang['diff_type']             = 'farklı görünüş';
+$lang['diff_inline']           = 'Satır içi';
+$lang['diff_side']             = 'Yan yana';
+$lang['diffprevrev']           = 'Önceki sürüm';
+$lang['diffnextrev']           = 'Sonraki sürüm';
+$lang['difflastrev']           = 'Son sürüm';
+$lang['diffbothprevrev']       = 'İki taraf da önceki sürüm';
+$lang['diffbothnextrev']       = 'İki taraf da sonraki sürüm';
+$lang['line']                  = 'Satır';
+$lang['breadcrumb']            = 'İz:';
+$lang['youarehere']            = 'Buradasınız:';
+$lang['lastmod']               = 'Son değiştirilme:';
+$lang['by']                    = 'Değiştiren:';
+$lang['deleted']               = 'silindi';
+$lang['created']               = 'oluşturuldu';
+$lang['restored']              = 'eski sürüme dönüldü (%s)';
+$lang['external_edit']         = 'Dışarıdan düzenle';
+$lang['summary']               = 'Özeti düzenle';
+$lang['noflash']               = 'Bu içeriği göstermek için <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Eklentisi</a> gerekmektedir.';
+$lang['download']              = 'Parçacığı indir';
+$lang['tools']                 = 'Alet';
+$lang['user_tools']            = 'Kullanıcı Aletleri';
+$lang['site_tools']            = 'Site Aletleri';
+$lang['page_tools']            = 'Sayfa Aletleri';
+$lang['skip_to_content']       = 'Bağlanmak için kaydır';
+$lang['sidebar']               = 'kaydırma çubuğu';
+$lang['mail_newpage']          = 'sayfa eklenme:';
+$lang['mail_changed']          = 'sayfa değiştirilme:';
+$lang['mail_subscribe_list']   = 'isimalanındaki değişmiş sayfalar: ';
+$lang['mail_new_user']         = 'yeni kullanıcı';
+$lang['mail_upload']           = 'dosya yüklendi:';
+$lang['changes_type']          = 'görünüşü değiştir';
+$lang['pages_changes']         = 'Sayfalar';
+$lang['media_changes']         = 'Çokluortam dosyaları';
+$lang['both_changes']          = 'Sayfalar ve çoklu ortam dosyaları';
+$lang['qb_bold']               = 'Kalın Yazı';
+$lang['qb_italic']             = 'Eğik Yazı';
+$lang['qb_underl']             = 'Altı Çizgili Yazı';
+$lang['qb_code']               = 'Kod Haline Getir';
+$lang['qb_strike']             = 'Ortası Çizilmiş Yazı';
+$lang['qb_h1']                 = '1. Seviye Başlık';
+$lang['qb_h2']                 = '2. Seviye Başlık';
+$lang['qb_h3']                 = '3. Seviye Başlık';
+$lang['qb_h4']                 = '4. Seviye Başlık';
+$lang['qb_h5']                 = '5. Seviye Başlık';
+$lang['qb_h']                  = 'Başlık';
+$lang['qb_hs']                 = 'Başlığı seç';
+$lang['qb_hplus']              = 'Daha yüksek başlık';
+$lang['qb_hminus']             = 'Daha Düşük Başlık';
+$lang['qb_hequal']             = 'Aynı Seviye Başlık';
+$lang['qb_link']               = 'İç Bağlantı';
+$lang['qb_extlink']            = 'Dış Bağlantı';
+$lang['qb_hr']                 = 'Yatay Çizgi';
+$lang['qb_ol']                 = 'Sıralı liste';
+$lang['qb_ul']                 = 'Sırasız liste';
+$lang['qb_media']              = 'Resim ve başka dosyalar ekle';
+$lang['qb_sig']                = 'İmza Ekle';
+$lang['qb_smileys']            = 'Gülen Yüzler';
+$lang['qb_chars']              = 'Özel Karakterler';
+$lang['upperns']               = 'ebeveyn isimalanına atla';
+$lang['metaedit']              = 'Metaverileri Değiştir';
+$lang['metasaveerr']           = 'Metaveri yazma başarısız ';
+$lang['metasaveok']            = 'Metaveri kaydedildi';
+$lang['img_title']             = 'Başlık:';
+$lang['img_caption']           = 'Serlevha:';
+$lang['img_date']              = 'Tarih:';
+$lang['img_fname']             = 'Dosya Adı:';
+$lang['img_fsize']             = 'Boyut:';
+$lang['img_artist']            = 'Fotoğrafçı:';
+$lang['img_copyr']             = 'Telif Hakkı:';
+$lang['img_format']            = 'Biçim:';
+$lang['img_camera']            = 'Fotoğraf Makinası:';
+$lang['img_keywords']          = 'Anahtar Sözcükler:';
+$lang['img_width']             = 'Genişlik:';
+$lang['img_height']            = 'Yükseklik:';
+$lang['subscr_subscribe_success'] = '%s,  %s için abonelik listesine eklendi.';
+$lang['subscr_subscribe_error'] = '%s, %s için abonelik listesine eklenirken hata ile karşılaşıldı.';
+$lang['subscr_subscribe_noaddress'] = 'Oturum bilginiz ile ilişkilendirilmiş bir adres olmadığı için abonelik listesine dahil olamazsınız.';
+$lang['subscr_unsubscribe_success'] = '%s,  %s için abonelik listesinden çıkarıldı.';
+$lang['subscr_unsubscribe_error'] = '%s, %s için abonelik listesinden çıkarılırken hata ile karşılaşıldı.';
+$lang['subscr_already_subscribed'] = '%s zaten %s listesine abone.';
+$lang['subscr_not_subscribed'] = '%s, %s listesine abone değil.';
+$lang['subscr_m_not_subscribed'] = 'Bu sayfa veya isim alanına (namespace) abone değilsiniz.  ';
+$lang['subscr_m_new_header']   = 'Üyelik ekle';
+$lang['subscr_m_current_header'] = 'Üyeliğini onayla';
+$lang['subscr_m_unsubscribe']  = 'Üyelik iptali';
+$lang['subscr_m_subscribe']    = 'Kayıt ol';
+$lang['subscr_m_receive']      = 'Al';
+$lang['subscr_style_every']    = 'her değişiklikte e-posta gönder';
+$lang['subscr_style_list']     = 'Son e-postadan bu yana değiştirilen sayfaların listesi (her %.2f gün)';
+$lang['authtempfail']          = 'Kullanıcı doğrulama geçici olarak yapılamıyor. Eğer bu durum devam ederse lütfen Wiki yöneticine haber veriniz.';
+$lang['i_chooselang']          = 'Dili seçiniz';
+$lang['i_installer']           = 'Dokuwiki Kurulum Sihirbazı';
+$lang['i_wikiname']            = 'Wiki Adı';
+$lang['i_enableacl']           = 'ACL\'yi etkinleştir (tavsiye edilir)';
+$lang['i_superuser']           = 'Ana Kullanıcı';
+$lang['i_problems']            = 'Kurulum sihirbazı aşağıda gösterilen sorunları buldu. Bunları düzeltmeden devam etmeniz mümkün değil.';
+$lang['i_modified']            = 'Güzenlik sebebiyle bu script sadece yeni ve değiştirilmemiş bir Dokuwiki kurulumunda çalışır. Ya indirdiğiniz paketi yeniden açmalı ya da <a href="http://dokuwiki.org/install"> adresindeki Dokuwiki kurulum kılavuzu</a>na bakmalısınız.';
+$lang['i_funcna']              = '<code>%s</code> PHP fonksiyonu bulunmamaktadır. Barındırma(Hosting) hizmetinde bu özellik kapatılmış olabilir.';
+$lang['i_phpver']              = '<code>%s</code> PHP sürümü, gereken <code>%s</code>  sürümünden daha düşük. PHP kurulumunu yükseltmeniz gerekmektedir.';
+$lang['i_mbfuncoverload']      = 'DokuWiki\'nin çalışması için php.ini dosyasında mbstring.func_overload seçeneği kapalı (değeri 0) olarak ayarlanmalıdır.';
+$lang['i_permfail']            = '<code>%s</code> Dokuwiki tarafından yazılabilir değil. İzin ayarlarını bu klasör için düzeltmeniz gerekmektedir!';
+$lang['i_confexists']          = '<code>%s</code> zaten var';
+$lang['i_writeerr']            = '<code>%s</code> oluşturulamadı. Dosya/Klasör izin ayarlarını gözden geçirip dosyayı elle oluşturmalısınız.';
+$lang['i_badhash']             = 'dokuwiki.php tanınamadı ya da değiştirilmiş (hash=<code>%s</code>)';
+$lang['i_badval']              = '<code>%s</code> - Yanlış veya boş değer';
+$lang['i_success']             = 'Kurulum başarıyla tamamlandı. Şimdi install.php dosyasını silebilirsiniz. <a href="doku.php?id=wiki:welcome">Yeni DokuWikiniz</a>i kullanabilirsiniz.';
+$lang['i_failure']             = 'Ayar dosyalarını yazarken bazı hatalar oluştu. <a href="doku.php?id=wiki:welcome">Yeni DokuWikiniz</a>i kullanmadan önce bu hatalarınızı elle düzeltmeniz gerekebilir.';
+$lang['i_policy']              = 'İlk ACL ayarı';
+$lang['i_pol0']                = 'Tamamen Açık Wiki (herkes okuyabilir, yazabilir ve dosya yükleyebilir)';
+$lang['i_pol1']                = 'Açık Wiki (herkes okuyabilir, ancak  sadece üye olanlar yazabilir ve dosya yükleyebilir)';
+$lang['i_pol2']                = 'Kapalı Wiki (sadece üye olanlar okuyabilir, yazabilir ve dosya yükleyebilir)';
+$lang['i_allowreg']            = 'Kullanıcıların kendi kendilerine üye olmalarına için ver';
+$lang['i_retry']               = 'Tekrar Dene';
+$lang['i_license']             = 'Lütfen içeriği hangi lisans altında yayınlamak istediğniizi belirtin:';
+$lang['i_license_none']        = 'Hiç bir lisans bilgisi gösterme';
+$lang['i_pop_field']           = 'Lütfen DokuWiki deneyimini geliştirmemizde, bize yardım edin:';
+$lang['i_pop_label']           = 'DokuWiki geliştiricilerine ayda bir, anonim kullanım bilgisini gönder';
+$lang['recent_global']         = '<b>%s</b> namespace\'i içerisinde yapılan değişiklikleri görüntülemektesiniz. Wiki\'deki tüm değişiklikleri de <a href="%s">bu adresten</a> görebilirsiniz. ';
+$lang['years']                 = '%d yıl önce';
+$lang['months']                = '%d ay önce';
+$lang['weeks']                 = '%d hafta önce';
+$lang['days']                  = '%d gün önce';
+$lang['hours']                 = '%d saat önce';
+$lang['minutes']               = '%d dakika önce';
+$lang['seconds']               = '%d saniye önce';
+$lang['wordblock']             = 'Değişikliğiniz kaydedilmedi çünkü istenmeyen mesaj içeriyor (spam).';
+$lang['media_uploadtab']       = 'Karşıya yükle';
+$lang['media_searchtab']       = 'Ara';
+$lang['media_file']            = 'Dosya';
+$lang['media_viewtab']         = 'Görünüm';
+$lang['media_edittab']         = 'Düzenle';
+$lang['media_historytab']      = 'Geçmiş';
+$lang['media_list_thumbs']     = 'Küçük resimler';
+$lang['media_list_rows']       = 'Satırlar';
+$lang['media_sort_name']       = 'İsim';
+$lang['media_sort_date']       = 'Tarih';
+$lang['media_namespaces']      = 'İsimalanı seçin';
+$lang['media_files']           = '%s deki dosyalar';
+$lang['media_upload']          = '%s dizinine yükle';
+$lang['media_search']          = '%s dizininde ara';
+$lang['media_view']            = '%s';
+$lang['media_edit']            = 'Düzenle %s';
+$lang['media_history']         = 'Geçmiş %s';
+$lang['media_meta_edited']     = 'üstveri düzenlendi';
+$lang['media_perm_read']       = 'Özür dileriz, dosyaları okumak için yeterli haklara sahip değilsiniz.';
+$lang['media_perm_upload']     = 'Üzgünüm, karşıya dosya yükleme yetkiniz yok.';
+$lang['media_update']          = 'Yeni versiyonu yükleyin';
+$lang['media_restore']         = 'Bu sürümü eski haline getir';
+$lang['currentns']             = 'Geçerli isimalanı';
+$lang['searchresult']          = 'Arama Sonucu';
+$lang['plainhtml']             = 'Yalın HTML';
+$lang['wikimarkup']            = 'Wiki Biçimlendirmesi';
+$lang['email_signature_text'] = 'Bu e-posta aşağıdaki DokuWiki tarafından otomatik olarak oluşturulmuştur
+@DOKUWIKIURL@';
diff --git a/wiki/inc/lang/tr/locked.txt b/wiki/inc/lang/tr/locked.txt
new file mode 100644
index 0000000..1438542
--- /dev/null
+++ b/wiki/inc/lang/tr/locked.txt
@@ -0,0 +1,4 @@
+====== Sayfa kilitli ======
+
+Bu sayfa şu anda başka bir kullanıcının değiştirmesi için kilitli. Kilitin süresi geçene veya bu kullanıcı değiştirmeyi bitirene kadar beklemelisiniz.
+
diff --git a/wiki/inc/lang/tr/login.txt b/wiki/inc/lang/tr/login.txt
new file mode 100644
index 0000000..2ce378d
--- /dev/null
+++ b/wiki/inc/lang/tr/login.txt
@@ -0,0 +1,4 @@
+====== Giriş ======
+
+Şu an giriş yapmış değilsiniz! Giriş yapmak için giriş bilgilerinizi aşağıya yazın. Giriş yapmak için çerezleri açmalısınız.
+
diff --git a/wiki/inc/lang/tr/mailtext.txt b/wiki/inc/lang/tr/mailtext.txt
new file mode 100644
index 0000000..dfcc39e
--- /dev/null
+++ b/wiki/inc/lang/tr/mailtext.txt
@@ -0,0 +1,12 @@
+DokuWikinizde bir sayfa eklendi veya değişti. Detaylar şunlar:
+
+Tarih            : @DATE@
+Tarayıcı         : @BROWSER@
+IP-Adresi        : @IPADDRESS@
+Sunucu adı       : @HOSTNAME@
+Eski Sürüm       : @OLDPAGE@
+Yeni Sürüm       : @NEWPAGE@
+Değiştirme Özeti : @SUMMARY@
+Kullanıcı        : @USER@
+
+@DIFF@
diff --git a/wiki/inc/lang/tr/newpage.txt b/wiki/inc/lang/tr/newpage.txt
new file mode 100644
index 0000000..8a47e6b
--- /dev/null
+++ b/wiki/inc/lang/tr/newpage.txt
@@ -0,0 +1,4 @@
+====== Bu başlık henüz mevcut değil ======
+
+Henüz mevcut olmayan bir başlığın linkiyle geldiniz. ''bu sayfayı oluştur'' tuşuna tıklayarak sayfayı oluşturabilirsiniz.
+
diff --git a/wiki/inc/lang/tr/norev.txt b/wiki/inc/lang/tr/norev.txt
new file mode 100644
index 0000000..e6f97be
--- /dev/null
+++ b/wiki/inc/lang/tr/norev.txt
@@ -0,0 +1,4 @@
+====== Böyle bir sürüm yok ======
+
+Belirtilen sürüm mevcut değil. Bu dökümanın eski sürümlerinin bir listesine ulaşmak için ''Eski sürümler'' tuşunu kullanın.
+
diff --git a/wiki/inc/lang/tr/password.txt b/wiki/inc/lang/tr/password.txt
new file mode 100644
index 0000000..852811d
--- /dev/null
+++ b/wiki/inc/lang/tr/password.txt
@@ -0,0 +1,7 @@
+Merhaba @FULLNAME@!
+
+
+@DOKUWIKIURL@ adresindeki @TITLE@ için kullanıcı bilgin şöyle:
+
+Giriş ismi : @LOGIN@
+Parola : @PASSWORD@
diff --git a/wiki/inc/lang/tr/preview.txt b/wiki/inc/lang/tr/preview.txt
new file mode 100644
index 0000000..71a8a42
--- /dev/null
+++ b/wiki/inc/lang/tr/preview.txt
@@ -0,0 +1,4 @@
+====== Önizleme ======
+
+Bu yazınızın nasıl çıkacağının bir önizlemesi. Unutma: Yazı henüz **kaydedilmedi!**
+
diff --git a/wiki/inc/lang/tr/pwconfirm.txt b/wiki/inc/lang/tr/pwconfirm.txt
new file mode 100644
index 0000000..7e440e8
--- /dev/null
+++ b/wiki/inc/lang/tr/pwconfirm.txt
@@ -0,0 +1,9 @@
+Merhaba @FULLNAME@!
+
+@DOKUWIKIURL@ adresinde kullanılan @TITLE@ hesabı için parola talebinde bulunuldu.
+
+Eğer böyle bir talebiniz olmadıysa, bu e-postayı görmezden gelebilirsiniz.
+
+Onaylamak istiyorsanız aşağıdaki linke tıklayınız.
+
+@CONFIRM@
diff --git a/wiki/inc/lang/tr/read.txt b/wiki/inc/lang/tr/read.txt
new file mode 100644
index 0000000..59314f1
--- /dev/null
+++ b/wiki/inc/lang/tr/read.txt
@@ -0,0 +1,2 @@
+Bu sayfa salt okunur. Kaynağı görebilirsiniz ama değiştiremezsiniz. Bunun yanlış olduğunu düşünüyorsanız yöneticiye danışın.
+
diff --git a/wiki/inc/lang/tr/recent.txt b/wiki/inc/lang/tr/recent.txt
new file mode 100644
index 0000000..99efc8f
--- /dev/null
+++ b/wiki/inc/lang/tr/recent.txt
@@ -0,0 +1,5 @@
+====== Son değişiklikler ======
+
+Aşağıdaki sayfalar yakın zamanda değiştirildi.
+
+
diff --git a/wiki/inc/lang/tr/register.txt b/wiki/inc/lang/tr/register.txt
new file mode 100644
index 0000000..b67e4b5
--- /dev/null
+++ b/wiki/inc/lang/tr/register.txt
@@ -0,0 +1,4 @@
+====== Yeni kullanıcı olarak kaydolun ======
+
+Bu wikide yeni bir hesap açmak için aşağıdaki tüm bilgileri doldurunuz. **Doğru e-posta adresi verdiğinizden** emin olun, yeni parolanız e-postanıza gönderilecek. Giriş adınız geçerli bir [[doku>pagename|sayfa adı]] olmalıdır.
+
diff --git a/wiki/inc/lang/tr/registermail.txt b/wiki/inc/lang/tr/registermail.txt
new file mode 100644
index 0000000..26ff739
--- /dev/null
+++ b/wiki/inc/lang/tr/registermail.txt
@@ -0,0 +1,10 @@
+Yeni bir kullanıcı kayıt oldu. Ayrıntıları aşağıda listelenmiştir:
+
+Kullanıcı adı : @NEWUSER@
+İsim : @NEWNAME@
+E-posta : @NEWEMAIL@
+
+Tarih : @DATE@
+Tarayıcı : @BROWSER@
+IP Numarası : @IPADDRESS@
+Host : @HOSTNAME@
diff --git a/wiki/inc/lang/tr/resendpwd.txt b/wiki/inc/lang/tr/resendpwd.txt
new file mode 100644
index 0000000..1a34396
--- /dev/null
+++ b/wiki/inc/lang/tr/resendpwd.txt
@@ -0,0 +1,3 @@
+====== Yeni Parola Gönderimi ======
+
+Lütfen bu wikide kullanmış olduğunuz kullanıcı adını aşağıdaki forma yazınız. Onay linki, kayıtlı e-posta adresinize gönderilecektir.
diff --git a/wiki/inc/lang/tr/resetpwd.txt b/wiki/inc/lang/tr/resetpwd.txt
new file mode 100644
index 0000000..1ed7586
--- /dev/null
+++ b/wiki/inc/lang/tr/resetpwd.txt
@@ -0,0 +1,3 @@
+	====== Yeni şifre belirle ======
+
+Lütfen bu wiki hesabınız için yeni bir şifre belirleyin.
\ No newline at end of file
diff --git a/wiki/inc/lang/tr/revisions.txt b/wiki/inc/lang/tr/revisions.txt
new file mode 100644
index 0000000..841fba2
--- /dev/null
+++ b/wiki/inc/lang/tr/revisions.txt
@@ -0,0 +1,4 @@
+====== Eski sürümler ======
+
+Bunlar mevcut dökümanın daha eski sürümleridir. Eski bir sürüme çevirmek için, sürümü aşağıdan seçin, ''Sayfayı değiştir''e tıklayın ve kaydedin.
+
diff --git a/wiki/inc/lang/tr/searchpage.txt b/wiki/inc/lang/tr/searchpage.txt
new file mode 100644
index 0000000..05660eb
--- /dev/null
+++ b/wiki/inc/lang/tr/searchpage.txt
@@ -0,0 +1,4 @@
+====== Arama ======
+
+Aşağıda aramanın sonuçları listelenmiştir. @CREATEPAGEINFO@
+
diff --git a/wiki/inc/lang/tr/showrev.txt b/wiki/inc/lang/tr/showrev.txt
new file mode 100644
index 0000000..4cf3d26
--- /dev/null
+++ b/wiki/inc/lang/tr/showrev.txt
@@ -0,0 +1,2 @@
+**Bu, dökümanın eski bir sürümüdür!**
+----
diff --git a/wiki/inc/lang/tr/stopwords.txt b/wiki/inc/lang/tr/stopwords.txt
new file mode 100644
index 0000000..293067a
--- /dev/null
+++ b/wiki/inc/lang/tr/stopwords.txt
@@ -0,0 +1,29 @@
+# Bu indeksleyicinin yok saydığı kelimelerin bir listesidir, satır başına bir kelime yazılır
+# Bu dosyayı değiştirirken UNIX satır sonları (tek satır sonu) kullandığınız emin olun
+# 3 karakterden kısa kelimeleri eklenmesine gerek yoktur, bunlar zaten indekslenmez
+# Bu liste http://www.ranks.nl/stopwords/ altındakilerden derlenmiştir
+about
+are
+and
+you
+your
+them
+their
+com
+for
+from
+into
+how
+that
+the
+this
+was
+what
+when
+where
+who
+will
+with
+und
+the
+www
diff --git a/wiki/inc/lang/tr/subscr_form.txt b/wiki/inc/lang/tr/subscr_form.txt
new file mode 100644
index 0000000..21a8fba
--- /dev/null
+++ b/wiki/inc/lang/tr/subscr_form.txt
@@ -0,0 +1,3 @@
+====== Abonelik Yönetimi ======
+
+Bu sayfa, geçerli isimalanı ve sayfa için aboneliklerinizi düzenlemenize olanak sağlar.
\ No newline at end of file
diff --git a/wiki/inc/lang/tr/updateprofile.txt b/wiki/inc/lang/tr/updateprofile.txt
new file mode 100644
index 0000000..20b07f9
--- /dev/null
+++ b/wiki/inc/lang/tr/updateprofile.txt
@@ -0,0 +1,3 @@
+====== Kullanıcı Bilgilerini Güncelleme ======
+
+İstediğiniz kullanıcı bilgilerini değiştirebilirsiniz. Ancak kullanıcı adınızı değiştirmeniz mümkün değildir.
diff --git a/wiki/inc/lang/tr/uploadmail.txt b/wiki/inc/lang/tr/uploadmail.txt
new file mode 100644
index 0000000..92feef2
--- /dev/null
+++ b/wiki/inc/lang/tr/uploadmail.txt
@@ -0,0 +1,10 @@
+Yeni dosya yüklendi. Ayrıntıları aşağıda listelenmiştir:
+
+Dosya : @MEDIA@
+Tarih : @DATE@
+Tarayıcı : @BROWSER@
+IP Adresi : @IPADDRESS@
+Host : @HOSTNAME@
+Boyut : @SIZE@
+MIME Type : @MIME@
+Kullanıcı : @USER@
diff --git a/wiki/inc/lang/uk/admin.txt b/wiki/inc/lang/uk/admin.txt
new file mode 100644
index 0000000..f698d93
--- /dev/null
+++ b/wiki/inc/lang/uk/admin.txt
@@ -0,0 +1,4 @@
+====== Адміністрування ======
+
+Нижче ви можете знайти перелік адміністративних задач, що наявні в ДокуВікі.
+
diff --git a/wiki/inc/lang/uk/adminplugins.txt b/wiki/inc/lang/uk/adminplugins.txt
new file mode 100644
index 0000000..3689ccd
--- /dev/null
+++ b/wiki/inc/lang/uk/adminplugins.txt
@@ -0,0 +1 @@
+===== Додаткові плагіни =====
\ No newline at end of file
diff --git a/wiki/inc/lang/uk/backlinks.txt b/wiki/inc/lang/uk/backlinks.txt
new file mode 100644
index 0000000..5f293e5
--- /dev/null
+++ b/wiki/inc/lang/uk/backlinks.txt
@@ -0,0 +1,3 @@
+====== Зворотні зв'язки ======
+
+Це перелік сторінок, які, здається, посилаються на поточну сторінку.
diff --git a/wiki/inc/lang/uk/conflict.txt b/wiki/inc/lang/uk/conflict.txt
new file mode 100644
index 0000000..5a89307
--- /dev/null
+++ b/wiki/inc/lang/uk/conflict.txt
@@ -0,0 +1,8 @@
+====== Існує більш нова версія ======
+
+Існує новіша версія документу, що ви редагували. Це може статися, коли інший користувач змінив документ під час вашого редагування.
+
+Уважно перегляньте розбіжності та вирішіть, яку версію залишити. Якщо ви натиснете
+''зберегти'', буде збережена ваша версія. Якщо натиснете ''скасувати'' --- то залишиться
+поточна версія.
+
diff --git a/wiki/inc/lang/uk/denied.txt b/wiki/inc/lang/uk/denied.txt
new file mode 100644
index 0000000..635d31c
--- /dev/null
+++ b/wiki/inc/lang/uk/denied.txt
@@ -0,0 +1,4 @@
+====== Доступ заборонено ======
+
+Вибачте, але у вас не вистачає прав для продовження.
+
diff --git a/wiki/inc/lang/uk/diff.txt b/wiki/inc/lang/uk/diff.txt
new file mode 100644
index 0000000..cfdf9a8
--- /dev/null
+++ b/wiki/inc/lang/uk/diff.txt
@@ -0,0 +1,4 @@
+====== Розбіжності ======
+
+Тут показані розбіжності між вибраною ревізією та поточною версією сторінки.
+
diff --git a/wiki/inc/lang/uk/draft.txt b/wiki/inc/lang/uk/draft.txt
new file mode 100644
index 0000000..f6acca8
--- /dev/null
+++ b/wiki/inc/lang/uk/draft.txt
@@ -0,0 +1,6 @@
+====== Знайдено чернетку ======
+
+Останнє редагування цієї сторінки не було завершено коректно. ДокуВікі автоматично зберегла чернетку під час вашої роботи. Ви можете використати чернетку для продовження редагування. Нижче ви можете побачити дані, збережені з попереднього сеансу.
+
+Будь ласка вирішить, чи ви бажаєте //відновити// останній сеанс редагування, //знищити// збережену чернетку або //скасувати// редагування.
+
diff --git a/wiki/inc/lang/uk/edit.txt b/wiki/inc/lang/uk/edit.txt
new file mode 100644
index 0000000..82dbc1a
--- /dev/null
+++ b/wiki/inc/lang/uk/edit.txt
@@ -0,0 +1 @@
+Відредагуйте сторінку та натисніть ''Зберегти''. Використовуйте [[wiki:syntax|посібник]] з синтаксису для довідки. Будь ласка, змінюйте сторінку лише у тому випадку, коли ви можете **покращити** її. Якщо ви бажаєте щось спробувати, використовуйте спеціальну сторінку [[playground:playground]]
diff --git a/wiki/inc/lang/uk/editrev.txt b/wiki/inc/lang/uk/editrev.txt
new file mode 100644
index 0000000..aae86fa
--- /dev/null
+++ b/wiki/inc/lang/uk/editrev.txt
@@ -0,0 +1,2 @@
+**Ви завантажили стару версію документу!** Якщо ви збережете її, ви створите нову версію з ціми даними.
+----
diff --git a/wiki/inc/lang/uk/index.txt b/wiki/inc/lang/uk/index.txt
new file mode 100644
index 0000000..0ba0d18
--- /dev/null
+++ b/wiki/inc/lang/uk/index.txt
@@ -0,0 +1,4 @@
+====== Зміст ======
+
+Це перелік усіх доступних сторінок, упоряджених за [[doku>namespaces|просторами імен]]
+
diff --git a/wiki/inc/lang/uk/install.html b/wiki/inc/lang/uk/install.html
new file mode 100644
index 0000000..a280427
--- /dev/null
+++ b/wiki/inc/lang/uk/install.html
@@ -0,0 +1,21 @@
+<p>Ця сторінка допомагає при першій установці та налаштуванні <a href="http://dokuwiki.org">ДокуВікі</a>.
+Більше інформації про програму установки можна знайти на <a href="http://dokuwiki.org/installer">сторінці документації</a>.</p>
+
+<p>ДокуВікі використовую звичайні файли для зберігання сторінок вікі та іншої інформації,
+щодо цих сторінок (наприклад, зображень, індексів пошуку, старих ревізій та ін.). Для
+успішного функціонування ДокуВікі <strong>має</strong> мати права на запис для папок, що
+містять ці файли. Ця програма установки не може змінювати права доступу. Звичайно це
+робиться за допомогою інтерпретатора shell, або, якщо ви використовуєте хостинг,
+за допомогою FTP або панелі управління хостингом (наприклад cPanel).</p>
+
+<p>Ця програма установки налаштує вашу ДокуВікі для використання
+<abbr title="список контролю доступу">ACL</abbr>, що, в свою чергу,
+дозволить адміністратору входити до адміністративного меню для установки доданків,
+керування користувачами, керування правами доступу до сторінок Вікі та змін параметрів
+конфігурації. Це не є обов'язковим для роботи ДокуВікі, але зробить життя адміністратора
+значно легшим.</p>
+
+<p>Досвідчені користувачі, або користувачі, що мають особливі вимоги до налагодження, мають
+використовувати ці посилання для детальної інформації, щодо
+<a href="http://dokuwiki.org/install">інструкцій з установки</a>
+та <a href="http://dokuwiki.org/config">параметрів конфігурації</a>.</p>
diff --git a/wiki/inc/lang/uk/jquery.ui.datepicker.js b/wiki/inc/lang/uk/jquery.ui.datepicker.js
new file mode 100644
index 0000000..c82501a
--- /dev/null
+++ b/wiki/inc/lang/uk/jquery.ui.datepicker.js
@@ -0,0 +1,38 @@
+/* Ukrainian (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Maxim Drogobitskiy (maxdao@gmail.com). */
+/* Corrected by Igor Milla (igor.fsp.milla@gmail.com). */
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "../widgets/datepicker" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery.datepicker );
+	}
+}( function( datepicker ) {
+
+datepicker.regional.uk = {
+	closeText: "Закрити",
+	prevText: "&#x3C;",
+	nextText: "&#x3E;",
+	currentText: "Сьогодні",
+	monthNames: [ "Січень","Лютий","Березень","Квітень","Травень","Червень",
+	"Липень","Серпень","Вересень","Жовтень","Листопад","Грудень" ],
+	monthNamesShort: [ "Січ","Лют","Бер","Кві","Тра","Чер",
+	"Лип","Сер","Вер","Жов","Лис","Гру" ],
+	dayNames: [ "неділя","понеділок","вівторок","середа","четвер","п’ятниця","субота" ],
+	dayNamesShort: [ "нед","пнд","вів","срд","чтв","птн","сбт" ],
+	dayNamesMin: [ "Нд","Пн","Вт","Ср","Чт","Пт","Сб" ],
+	weekHeader: "Тиж",
+	dateFormat: "dd.mm.yy",
+	firstDay: 1,
+	isRTL: false,
+	showMonthAfterYear: false,
+	yearSuffix: "" };
+datepicker.setDefaults( datepicker.regional.uk );
+
+return datepicker.regional.uk;
+
+} ) );
diff --git a/wiki/inc/lang/uk/lang.php b/wiki/inc/lang/uk/lang.php
new file mode 100644
index 0000000..e9ed28a
--- /dev/null
+++ b/wiki/inc/lang/uk/lang.php
@@ -0,0 +1,354 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Oleksii <alexey.furashev@gmail.com>
+ * @author Vitaly <vitaly.balashov@smuzzy.com.ua>
+ * @author Oleksiy Voronin <ovoronin@gmail.com>
+ * @author serg_stetsuk <serg_stetsuk@ukr.net>
+ * @author Oleksandr Kunytsia <okunia@gmail.com>
+ * @author Uko <uko@uar.net>
+ * @author Ulrikhe Lukoie <lukoie@gmail.com>
+ * @author Egor Smkv <egorsmkv@gmail.com>
+ * @author Max Lyashuk <m_lyashuk@ukr.net>
+ * @author Pavel <pavelholovko@yandex.ru>
+ * @author Maksim <nikropol@yandex.ru>
+ * @author Nina Zolotova <nina-z@i.ua>
+ * @author Roman <vsmemorial@gmail.com>
+ */
+$lang['encoding']              = 'utf-8';
+$lang['direction']             = 'ltr';
+$lang['doublequoteopening']    = '“';
+$lang['doublequoteclosing']    = '”';
+$lang['singlequoteopening']    = '‘';
+$lang['singlequoteclosing']    = '’';
+$lang['apostrophe']            = '’';
+$lang['btn_edit']              = 'Редагувати';
+$lang['btn_source']            = 'Показати вихідний текст';
+$lang['btn_show']              = 'Показати сторінку';
+$lang['btn_create']            = 'Створити сторінку';
+$lang['btn_search']            = 'Пошук';
+$lang['btn_save']              = 'Зберегти';
+$lang['btn_preview']           = 'Перегляд';
+$lang['btn_top']               = 'Повернутися наверх';
+$lang['btn_newer']             = '<< більш нові';
+$lang['btn_older']             = 'більш старі >>';
+$lang['btn_revs']              = 'Старі ревізії';
+$lang['btn_recent']            = 'Останні зміни';
+$lang['btn_upload']            = 'Завантажити';
+$lang['btn_cancel']            = 'Скасувати';
+$lang['btn_index']             = 'Зміст';
+$lang['btn_secedit']           = 'Редагувати';
+$lang['btn_login']             = 'Увійти';
+$lang['btn_logout']            = 'Вийти';
+$lang['btn_admin']             = 'Керування';
+$lang['btn_update']            = 'Оновити';
+$lang['btn_delete']            = 'Видалити';
+$lang['btn_back']              = 'Назад';
+$lang['btn_backlink']          = 'Посилання сюди';
+$lang['btn_subscribe']         = 'Підписатися';
+$lang['btn_profile']           = 'Оновити профіль';
+$lang['btn_reset']             = 'Очистити';
+$lang['btn_resendpwd']         = 'Встановити новий пароль';
+$lang['btn_draft']             = 'Редагувати чернетку';
+$lang['btn_recover']           = 'Відновити чернетку';
+$lang['btn_draftdel']          = 'Знищити чернетку';
+$lang['btn_revert']            = 'Відновити';
+$lang['btn_register']          = 'Реєстрація';
+$lang['btn_apply']             = 'Застосувати';
+$lang['btn_media']             = 'Керування медіа-файлами';
+$lang['btn_deleteuser']        = 'Видалити мій аккаунт';
+$lang['btn_img_backto']        = 'Повернутися до %s';
+$lang['btn_mediaManager']      = 'Показати в медіа менеджері';
+$lang['loggedinas']            = 'Ви:';
+$lang['user']                  = 'Користувач';
+$lang['pass']                  = 'Пароль';
+$lang['newpass']               = 'Новий пароль';
+$lang['oldpass']               = 'Поточний пароль';
+$lang['passchk']               = 'ще раз';
+$lang['remember']              = 'Запам\'ятати мене';
+$lang['fullname']              = 'Повне ім\'я';
+$lang['email']                 = 'E-Mail';
+$lang['profile']               = 'Профіль користувача';
+$lang['badlogin']              = 'Вибачте, невірне ім\'я чи пароль.';
+$lang['badpassconfirm']        = 'Вибачте, але пароль невірний';
+$lang['minoredit']             = 'Незначні зміни';
+$lang['draftdate']             = 'Чернетка збережена';
+$lang['nosecedit']             = 'Сторінку змінено, дані розділу застарілі. Завантажено сторінку повністю.';
+$lang['regmissing']            = 'Необхідно заповнити всі поля.';
+$lang['reguexists']            = 'Користувач з таким іменем вже існує.';
+$lang['regsuccess']            = 'Користувача створено. Пароль відправлено на e-mail.';
+$lang['regsuccess2']           = 'Користувача створено.';
+$lang['regfail']               = 'Користувач не створений';
+$lang['regmailfail']           = 'При відправленні пароля сталась помилка. Зв’яжіться з адміністратором!';
+$lang['regbadmail']            = 'Схоже, що адреса e-mail невірна - якщо ви вважаєте, що це помилка, зв’яжіться з адміністратором';
+$lang['regbadpass']            = 'Надані паролі не співпадають, спробуйте ще раз.';
+$lang['regpwmail']             = 'Пароль ДокуВікі';
+$lang['reghere']               = 'Ще не маєте облікового запису? Отримайте його негайно';
+$lang['profna']                = 'Ця Вікі не підтримує зміни профілю';
+$lang['profnochange']          = 'Немає змін, немає що робити.';
+$lang['profnoempty']           = 'Ім’я або e-mail не можуть бути пустими.';
+$lang['profchanged']           = 'Профіль успішно змінено.';
+$lang['profnodelete']          = 'Ця вікі не підтримує видалення користувачів.';
+$lang['profdeleteuser']        = 'Видалити аккаунт';
+$lang['profdeleted']           = 'Ваш профіль користувача буде видалено з цієї wiki.';
+$lang['profconfdelete']        = 'Я хочу видалити мій акаунт з цієї вікі.';
+$lang['profconfdeletemissing'] = 'Галочка на "Підтверджено" не поставлена';
+$lang['proffail']              = 'Профіль користувача не вдалося поновити.';
+$lang['pwdforget']             = 'Забули пароль? Отримайте новий';
+$lang['resendna']              = 'Ця Вікі не підтримує повторне відправлення пароля.';
+$lang['resendpwd']             = 'Встановити новий пароль для';
+$lang['resendpwdmissing']      = 'Необхідно заповнити усі поля.';
+$lang['resendpwdnouser']       = 'Такий користувач не існує.';
+$lang['resendpwdbadauth']      = 'Код автентифікації невірний. Перевірте, чи ви використали повне посилання для підтвердження.';
+$lang['resendpwdconfirm']      = 'Посилання для підтвердження відіслано на e-mail.';
+$lang['resendpwdsuccess']      = 'Новий пароль відіслано на e-mail.';
+$lang['license']               = 'Якщо не вказано інше, вміст цієї Вікі підпадає під дію такої ліцензії:';
+$lang['licenseok']             = 'Примітка. Редагуючи ці сторінку, ви погоджуєтесь на розповсюдження інформації за такою ліцензією:';
+$lang['searchmedia']           = 'Пошук файлу:';
+$lang['searchmedia_in']        = 'Шукати у %s';
+$lang['txt_upload']            = 'Виберіть файл для завантаження:';
+$lang['txt_filename']          = 'Завантажити як (не обов\'язкове):';
+$lang['txt_overwrt']           = 'Перезаписати існуючий файл';
+$lang['maxuploadsize']         = 'Відвантаження максимум %s на файл.';
+$lang['lockedby']              = 'Заблоковано:';
+$lang['lockexpire']            = 'Блокування завершується в:';
+$lang['js']['willexpire']      = 'Блокування редагування цієї сторінки закінчується через хвилину.\n Щоб уникнути конфліктів використовуйте кнопку перегляду для продовження блокування.';
+$lang['js']['notsavedyet']     = 'Незбережені зміни будуть втрачені.
+ Дійсно продовжити?';
+$lang['js']['searchmedia']     = 'Шукати файли';
+$lang['js']['keepopen']        = 'Тримати вікно відкритим під час вибору';
+$lang['js']['hidedetails']     = 'Сховати деталі';
+$lang['js']['mediatitle']      = 'Налаштунки посилання';
+$lang['js']['mediadisplay']    = 'Тип посилання';
+$lang['js']['mediaalign']      = 'Вирівнювання';
+$lang['js']['mediasize']       = 'Розмір зображення';
+$lang['js']['mediatarget']     = 'Ціль посилання';
+$lang['js']['mediaclose']      = 'Закрити';
+$lang['js']['mediainsert']     = 'Вставити';
+$lang['js']['mediadisplayimg'] = 'Показати зображення.';
+$lang['js']['mediadisplaylnk'] = 'Показати тільки посилання.';
+$lang['js']['mediasmall']      = 'Зменшена версія';
+$lang['js']['mediamedium']     = 'Середня версія';
+$lang['js']['medialarge']      = 'Велика версія';
+$lang['js']['mediaoriginal']   = 'Оригінальна версія';
+$lang['js']['medialnk']        = 'Посилання на сторінку з описом';
+$lang['js']['mediadirect']     = 'Пряме посилання на оригінал';
+$lang['js']['medianolnk']      = 'Немає посилання';
+$lang['js']['medianolink']     = 'Не посилайтеся на зображення';
+$lang['js']['medialeft']       = 'Вирівняти зображення по лівому краю.';
+$lang['js']['mediaright']      = 'Вирівняти зображення по правому краю.';
+$lang['js']['mediacenter']     = 'Вирівняти зображення по центру.';
+$lang['js']['medianoalign']    = 'Не вирівнювати зображення.';
+$lang['js']['nosmblinks']      = 'Посилання на мережеві папки працює лише в Internet Explorer.
+Ви можете скопіювати посилання і відкрити його за допомогою Internet Explorer.';
+$lang['js']['linkwiz']         = 'Чарівник посилань';
+$lang['js']['linkto']          = 'Посилання на:';
+$lang['js']['del_confirm']     = 'Дійсно знищити обрані елементи?';
+$lang['js']['restore_confirm'] = 'Дійсно відновити цю версію?';
+$lang['js']['media_diff']      = 'Переглянути різницю:';
+$lang['js']['media_diff_both'] = 'Крок за кроком';
+$lang['js']['media_diff_portions'] = 'Прогорнути';
+$lang['js']['media_select']    = 'Оберіть файли';
+$lang['js']['media_upload_btn'] = 'Завантажити';
+$lang['js']['media_done_btn']  = 'Успішно';
+$lang['js']['media_drop']      = 'Перетягніть сюди файли для відвантаження';
+$lang['js']['media_cancel']    = 'видалити';
+$lang['js']['media_overwrt']   = 'Перезаписати існуючі файли';
+$lang['rssfailed']             = 'Виникла помилка під час отримання RSS-стрічки: ';
+$lang['nothingfound']          = 'Нічого не знайдено.';
+$lang['mediaselect']           = 'Вибір медіа-файлу';
+$lang['uploadsucc']            = 'Завантаження пройшло успішно';
+$lang['uploadfail']            = 'Помилка при завантаженні. Можливо неправильні права?';
+$lang['uploadwrong']           = 'Завантаження заборонено. Таке розширення файлу не дозволяється!';
+$lang['uploadexist']           = 'Файл вже існує. Нічого не зроблено.';
+$lang['uploadbadcontent']      = 'Завантажений вміст не відповідає розширенню %s.';
+$lang['uploadspam']            = 'Завантаження заблоковано спам-фільтром.';
+$lang['uploadxss']             = 'Завантаження заблоковано через можливість злонаміреного вмісту.';
+$lang['uploadsize']            = 'Завантажений файл надто великий (максимум %s).';
+$lang['deletesucc']            = 'Файл "%s" знищено.';
+$lang['deletefail']            = 'Неможливо знищити "%s" - перевірте права доступу.';
+$lang['mediainuse']            = '"%s" не знищено - файл використовується.';
+$lang['namespaces']            = 'Простори імен';
+$lang['mediafiles']            = 'Доступні файли';
+$lang['accessdenied']          = 'Вам не дозволено переглядати цю сторінку.';
+$lang['mediausage']            = 'Для посилання на цей файл використовуйте такий синтаксис:';
+$lang['mediaview']             = 'Переглянути початковий файл';
+$lang['mediaroot']             = 'корінь';
+$lang['mediaupload']           = 'Завантаження файлу у поточний простір імен. Щоб створити простори імен, додайте їх в початок імені файлу та розділіть двокрапками.';
+$lang['mediaextchange']        = 'Розширення файлу змінено з .%s на .%s!';
+$lang['reference']             = 'Посилання для';
+$lang['ref_inuse']             = 'Цей файл не може бути знищено, оскільки він використовується такими сторінками:';
+$lang['ref_hidden']            = 'Деякі посилання існують на сторінках, для читання яких у вас немає прав.';
+$lang['hits']                  = 'Збіги';
+$lang['quickhits']             = 'Збіги у назвах сторінок';
+$lang['toc']                   = 'Зміст';
+$lang['current']               = 'поточний';
+$lang['yours']                 = 'Ваша версія';
+$lang['diff']                  = 'показати відмінності від поточної версії';
+$lang['diff2']                 = 'Показати відмінності між вибраними версіями';
+$lang['difflink']              = 'Посилання на цей список змін';
+$lang['diff_type']             = 'Переглянути відмінності:';
+$lang['diff_inline']           = 'Вбудувати';
+$lang['diff_side']             = 'Поряд';
+$lang['diffprevrev']           = 'Попередня ревізія';
+$lang['diffnextrev']           = 'Наступна ревізія';
+$lang['difflastrev']           = 'Остання ревізія';
+$lang['diffbothprevrev']       = 'Порівняння попередніх версій';
+$lang['diffbothnextrev']       = 'По сторонах наступні версії';
+$lang['line']                  = 'Рядок';
+$lang['breadcrumb']            = 'Відвідано:';
+$lang['youarehere']            = 'Ви тут:';
+$lang['lastmod']               = 'Востаннє змінено:';
+$lang['by']                    = 'повз';
+$lang['deleted']               = 'знищено';
+$lang['created']               = 'створено';
+$lang['restored']              = 'відновлено стару ревізію (%s)';
+$lang['external_edit']         = 'зовнішнє редагування';
+$lang['summary']               = 'Підсумок змін';
+$lang['noflash']               = 'Для перегляду цієї сторінки необхідно встановити <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a>.';
+$lang['download']              = 'Завантажити фрагмент';
+$lang['tools']                 = 'Налаштування';
+$lang['user_tools']            = 'Користувальницькькі налаштування';
+$lang['site_tools']            = 'Налаштування сайту';
+$lang['page_tools']            = 'Налаштування сторінки';
+$lang['skip_to_content']       = 'Перейти до змісту';
+$lang['sidebar']               = 'Сайдбар';
+$lang['mail_newpage']          = 'сторінку додано:';
+$lang['mail_changed']          = 'сторінку змінено:';
+$lang['mail_subscribe_list']   = 'сторінки, що змінено у просторі імен:';
+$lang['mail_new_user']         = 'новий користувач:';
+$lang['mail_upload']           = 'завантажено файл:';
+$lang['changes_type']          = 'Переглянути зміни ';
+$lang['pages_changes']         = 'Сторінок';
+$lang['media_changes']         = 'Медіа-файли';
+$lang['both_changes']          = 'Сторінки та медіа-файли';
+$lang['qb_bold']               = 'Напівжирний текст';
+$lang['qb_italic']             = 'Курсив';
+$lang['qb_underl']             = 'Підкреслений текст';
+$lang['qb_code']               = 'Текст коду';
+$lang['qb_strike']             = 'Закреслений текст';
+$lang['qb_h1']                 = 'Заголовок 1-го рівня';
+$lang['qb_h2']                 = 'Заголовок 2-го рівня';
+$lang['qb_h3']                 = 'Заголовок 3-го рівня';
+$lang['qb_h4']                 = 'Заголовок 4-го рівня';
+$lang['qb_h5']                 = 'Заголовок 5-го рівня';
+$lang['qb_h']                  = 'Заголовок';
+$lang['qb_hs']                 = 'Вибрати заголовок';
+$lang['qb_hplus']              = 'Заголовок вищого рівня';
+$lang['qb_hminus']             = 'Заголовок нищого рівня';
+$lang['qb_hequal']             = 'Заголовок того ж рівня';
+$lang['qb_link']               = 'Внутрішнє посилання';
+$lang['qb_extlink']            = 'Зовнішнє посилання';
+$lang['qb_hr']                 = 'Роздільник';
+$lang['qb_ol']                 = 'Елемент нумерованого списку';
+$lang['qb_ul']                 = 'Елемент ненумерованого списку';
+$lang['qb_media']              = 'Додати зображень та інші файли';
+$lang['qb_sig']                = 'Додати підпис';
+$lang['qb_smileys']            = 'Посмішки';
+$lang['qb_chars']              = 'Спеціальні символи';
+$lang['upperns']               = 'Перейти до батьківського простору імен';
+$lang['metaedit']              = 'Редагувати метадані';
+$lang['metasaveerr']           = 'Помилка запису метаданих';
+$lang['metasaveok']            = 'Метадані збережено';
+$lang['img_title']             = 'Назва:';
+$lang['img_caption']           = 'Підпис:';
+$lang['img_date']              = 'Дата:';
+$lang['img_fname']             = 'Ім’я файлу:';
+$lang['img_fsize']             = 'Розмір:';
+$lang['img_artist']            = 'Фотограф:';
+$lang['img_copyr']             = 'Авторські права:';
+$lang['img_format']            = 'Формат:';
+$lang['img_camera']            = 'Камера:';
+$lang['img_keywords']          = 'Ключові слова:';
+$lang['img_width']             = 'Ширини:';
+$lang['img_height']            = 'Висота:';
+$lang['subscr_subscribe_success'] = 'Додано %s до списку підписки для %s';
+$lang['subscr_subscribe_error'] = 'Помилка при додавані %s до списку підписки для %s';
+$lang['subscr_subscribe_noaddress'] = 'Немає адреси, асоційованої з Вашим логіном, тому Ви не можете бути додані до списку підписки.';
+$lang['subscr_unsubscribe_success'] = 'Видалено %s із списку підписки для %s';
+$lang['subscr_unsubscribe_error'] = 'Помилка при видаленні %s зі списку підписки для %s';
+$lang['subscr_already_subscribed'] = '%s вже підписаний до %s';
+$lang['subscr_not_subscribed'] = '%s не підписаний до %s';
+$lang['subscr_m_not_subscribed'] = 'Ви зараз не підписані до цієї сторінки або простору імен.';
+$lang['subscr_m_new_header']   = 'Додати підписку';
+$lang['subscr_m_current_header'] = 'Поточні підписки';
+$lang['subscr_m_unsubscribe']  = 'Відписатися';
+$lang['subscr_m_subscribe']    = 'Підписатися';
+$lang['subscr_m_receive']      = 'Отримувати';
+$lang['subscr_style_every']    = 'повідомляти на пошту про кожну зміну';
+$lang['subscr_style_digest']   = 'лист з дайджестом для зміни кожної сторінки (кожні %.2f днів)';
+$lang['subscr_style_list']     = 'список змінених сторінок від часу отримання останнього листа (кожні %.2f днів)';
+$lang['authtempfail']          = 'Автентифікація користувача тимчасово не доступна. Якщо це буде продовжуватись, будь ласка, повідомте адміністратора.';
+$lang['i_chooselang']          = 'Виберіть мову';
+$lang['i_installer']           = 'Програма установки ДокуВікі';
+$lang['i_wikiname']            = 'Назва Вікі';
+$lang['i_enableacl']           = 'Дозволити використання ACL (рекомендовано)';
+$lang['i_superuser']           = 'Суперкористувач';
+$lang['i_problems']            = 'Програма установки знайшла декілька проблем, що вказані нижче. Ви не можете продовжити, поки не виправите їх';
+$lang['i_modified']            = 'З причин безпеки цей скрипт буде працювати тільки з новою та немодифікованою установкою ДокуВікі.
+Вам слід або ще раз розпакувати файли із завантаженого пакету, або звернутися до повної <a href="http://dokuwiki.org/install">інструкції з установки ДокуВікі</a>';
+$lang['i_funcna']              = 'Функція PHP <code>%s</code> не доступна. Можливо, хостинг-провайдер відключив її з якихось причин?';
+$lang['i_phpver']              = 'Версія PHP <code>%s</code> менша, ніж необхідно - <code>%s</code>. Необхідно оновити PHP.';
+$lang['i_mbfuncoverload']      = 'mbstring.func_overload має бути вимкнена у php.ini щоб запустити DokuWiki.';
+$lang['i_permfail']            = 'ДокуВікі не має прав на запис <code>%s</code>. Необхідно змінити права доступа для цієї папки!';
+$lang['i_confexists']          = '<code>%s</code> вже існує';
+$lang['i_writeerr']            = 'Неможливо створити <code>%s</code>. Необхідно перевірити права доступа для файлу/папки та створити файл вручну.';
+$lang['i_badhash']             = 'Невпізнаний або модифікований dokuwiki.php (hash=<code>%s</code>)';
+$lang['i_badval']              = '<code>%s</code> - невірне або пусте значення.';
+$lang['i_success']             = 'Налаштування завершено. Ви можете знищити файл install.php.
+Перейдіть до <a href="doku.php?id=wiki:welcome">вашої нової ДокуВікі</a>';
+$lang['i_failure']             = 'При збереженні файлу конфігурації виникли помилки. Можливо вам доведеться виправити їх самостійно
+до початку використання <a href="doku.php?id=wiki:welcome">вашої нової ДокуВікі</a>.';
+$lang['i_policy']              = 'Початкова політика ACL';
+$lang['i_pol0']                = 'Відкрита Вікі (читання, запис та завантаження файлів для всіх)';
+$lang['i_pol1']                = 'Публічна Вікі (читання для всіх, запис та завантаження для зареєстрованих користувачів)';
+$lang['i_pol2']                = 'Закрита Вікі (читання, запис та завантаження тільки для зареєстрованих користувачів)';
+$lang['i_allowreg']            = 'Дозволити користувачам реєструватися самостійно.';
+$lang['i_retry']               = 'Повторити';
+$lang['i_license']             = 'Будь ласка, виберіть тип ліцензії, під якою Ві бажаєте опублікувати матеріал:';
+$lang['i_license_none']        = 'Не показувати жодної інформації про ліцензії.';
+$lang['i_pop_field']           = 'Будь ласка, допоможіть нам покращити DokuWiki:';
+$lang['i_pop_label']           = 'Одного разу на місяць надсилати дані про використання розробникам DokuWiki.';
+$lang['recent_global']         = 'Ви переглядаєте зміни в межах простору імен <b>%s</b>. Також можна <a href="%s">переглянути зміни в межах усієї Вікі</a>.';
+$lang['years']                 = '%d років тому';
+$lang['months']                = '%d місяців тому';
+$lang['weeks']                 = '%d тижнів тому';
+$lang['days']                  = '%d днів тому';
+$lang['hours']                 = '%d годин тому';
+$lang['minutes']               = '%d хвилин тому';
+$lang['seconds']               = '%d секунд тому';
+$lang['wordblock']             = 'Ваші зміни не збережено, тому що вони розпізнані як такі, що містять заблокований текст(спам).';
+$lang['media_uploadtab']       = 'Завантажити';
+$lang['media_searchtab']       = 'Пошук';
+$lang['media_file']            = 'Файл';
+$lang['media_viewtab']         = 'Огляд';
+$lang['media_edittab']         = 'Редагувати';
+$lang['media_historytab']      = 'Історія';
+$lang['media_list_thumbs']     = 'Іконки';
+$lang['media_list_rows']       = 'Рядки';
+$lang['media_sort_name']       = 'Ім’я';
+$lang['media_sort_date']       = 'Дата';
+$lang['media_namespaces']      = 'Оберіть простір назв';
+$lang['media_files']           = 'Файли у %s';
+$lang['media_upload']          = 'Завантажити до %s';
+$lang['media_search']          = 'Шукати у %s';
+$lang['media_view']            = '%s';
+$lang['media_viewold']         = '%s до %s';
+$lang['media_edit']            = 'Редагувати %s';
+$lang['media_history']         = 'Історія %s';
+$lang['media_meta_edited']     = 'метаданні відредаговано';
+$lang['media_perm_read']       = 'Вибачте, у вас не достатньо прав для читання цього файлу.';
+$lang['media_perm_upload']     = 'Вибачте, у вас недостатньо прав, щоб завантажувати файли.';
+$lang['media_update']          = 'Завантажити нову версію';
+$lang['media_restore']         = 'Відновити цю версію';
+$lang['media_acl_warning']     = 'Список може бути не повним через обмеження ACL та приховані сторінки.';
+$lang['currentns']             = 'Поточний діапазон імен';
+$lang['searchresult']          = 'Результати пошуку';
+$lang['plainhtml']             = 'Простий HTML';
+$lang['wikimarkup']            = 'Wiki розмітка';
+$lang['page_nonexist_rev']     = 'Сторінка %s відсутня. Може бути створена як <a href="%s">%s</a>.';
+$lang['unable_to_parse_date']  = 'Не можливо розібрати параметр "%s" ';
+$lang['email_signature_text']  = 'Це повідомлення було створене ДокуВікі з
+@DOKUWIKIURL@';
diff --git a/wiki/inc/lang/uk/locked.txt b/wiki/inc/lang/uk/locked.txt
new file mode 100644
index 0000000..367c286
--- /dev/null
+++ b/wiki/inc/lang/uk/locked.txt
@@ -0,0 +1,3 @@
+====== Сторінку заблоковано ======
+
+Цю сторінку заблоковано іншим користувачем для редагування. Зачекайте, поки цей користувач завершить редагування або закінчиться час блокування.
\ No newline at end of file
diff --git a/wiki/inc/lang/uk/login.txt b/wiki/inc/lang/uk/login.txt
new file mode 100644
index 0000000..f45f810
--- /dev/null
+++ b/wiki/inc/lang/uk/login.txt
@@ -0,0 +1,4 @@
+====== Вхід до вікі ======
+
+Ви не ввійшли до системи. Введіть ваші реєстраційні дані для того, щоб увійти. У вашому браузері повинні бути увімкнені файли cookies.
+
diff --git a/wiki/inc/lang/uk/mailtext.txt b/wiki/inc/lang/uk/mailtext.txt
new file mode 100644
index 0000000..4f3072c
--- /dev/null
+++ b/wiki/inc/lang/uk/mailtext.txt
@@ -0,0 +1,12 @@
+Сторінка в вашому ДокуВікі була змінена. Деталі нижче:
+
+Дата         : @DATE@
+Оглядач      : @BROWSER@
+Адреса IP    : @IPADDRESS@
+Ім'я вузла   : @HOSTNAME@
+Стара ревізія: @OLDPAGE@
+Нова ревізія : @NEWPAGE@
+Підсумок змін : @SUMMARY@
+Користувач   : @USER@
+
+@DIFF@
diff --git a/wiki/inc/lang/uk/newpage.txt b/wiki/inc/lang/uk/newpage.txt
new file mode 100644
index 0000000..39cdecc
--- /dev/null
+++ b/wiki/inc/lang/uk/newpage.txt
@@ -0,0 +1,4 @@
+====== Сторінка ще не існує ======
+
+Ви прийшли за посиланням на сторінку, що ще не існує. Якщо ваші права дозволяють, ви можете створити цю сторінку натиснувши кнопку ''Створити сторінку''.
+
diff --git a/wiki/inc/lang/uk/norev.txt b/wiki/inc/lang/uk/norev.txt
new file mode 100644
index 0000000..3c9295f
--- /dev/null
+++ b/wiki/inc/lang/uk/norev.txt
@@ -0,0 +1,4 @@
+====== Немає такої ревізії ======
+
+Вказана ревізія не існує. Використовуйте кнопку ''Старі ревізії'', щоб отримати перелік ревізій цього документу.
+
diff --git a/wiki/inc/lang/uk/password.txt b/wiki/inc/lang/uk/password.txt
new file mode 100644
index 0000000..7db9be3
--- /dev/null
+++ b/wiki/inc/lang/uk/password.txt
@@ -0,0 +1,6 @@
+Доброго дня, @FULLNAME@!
+
+Ваші дані користувача для @TITLE@ на @DOKUWIKIURL@
+
+Login    : @LOGIN@
+Password : @PASSWORD@
diff --git a/wiki/inc/lang/uk/preview.txt b/wiki/inc/lang/uk/preview.txt
new file mode 100644
index 0000000..b4174c7
--- /dev/null
+++ b/wiki/inc/lang/uk/preview.txt
@@ -0,0 +1,4 @@
+====== Попередній перегляд ======
+
+Це попередній перегляд того, як буде виглядати ваш текст. Не забувайте, текст ще **не збережено**!
+
diff --git a/wiki/inc/lang/uk/pwconfirm.txt b/wiki/inc/lang/uk/pwconfirm.txt
new file mode 100644
index 0000000..cd981f1
--- /dev/null
+++ b/wiki/inc/lang/uk/pwconfirm.txt
@@ -0,0 +1,10 @@
+Доброго дня, @FULLNAME@!
+
+Хтось запитав новий пароль для користувача @TITLE@ на @DOKUWIKIURL@
+
+Якщо це були не ви, ігноруйте це повідомлення.
+
+Для підтвердження, що це дійсно ви запитали новий пароль, будь ласка
+перейдіть за наступним посиланням.
+
+@CONFIRM@
diff --git a/wiki/inc/lang/uk/read.txt b/wiki/inc/lang/uk/read.txt
new file mode 100644
index 0000000..59ea6a1
--- /dev/null
+++ b/wiki/inc/lang/uk/read.txt
@@ -0,0 +1,2 @@
+Ця сторінка доступна тільки для перегляду. Ви можете продивитися вихідний текст, але не можете змінювати його. Якщо ви вважаєте, що це не вірно, зверніться до адміністратора.
+
diff --git a/wiki/inc/lang/uk/recent.txt b/wiki/inc/lang/uk/recent.txt
new file mode 100644
index 0000000..645e3d8
--- /dev/null
+++ b/wiki/inc/lang/uk/recent.txt
@@ -0,0 +1,4 @@
+====== Останні зміни ======
+
+Вказані нижче сторінки було змінено нещодавно.
+
diff --git a/wiki/inc/lang/uk/register.txt b/wiki/inc/lang/uk/register.txt
new file mode 100644
index 0000000..8fffc00
--- /dev/null
+++ b/wiki/inc/lang/uk/register.txt
@@ -0,0 +1,4 @@
+====== Реєстрація нового користувача ======
+
+Введіть необхідну інформацію для того, щоб створити нового користувача у цій Вікі. Переконайтеся. що ви ввели **правильну адресу e-mail** - якщо ви не ввели пароль, то новий пароль буде відіслано на цю адресу. Ім'я користувача повинно бути дозволеною [[doku>pagename|назвою сторінки]] вікі.
+
diff --git a/wiki/inc/lang/uk/registermail.txt b/wiki/inc/lang/uk/registermail.txt
new file mode 100644
index 0000000..14f0e4b
--- /dev/null
+++ b/wiki/inc/lang/uk/registermail.txt
@@ -0,0 +1,10 @@
+Зареєстровано нового користувача. Перегляньте деталі:
+
+Користувач  : @NEWUSER@
+Повне ім'я  : @NEWNAME@
+E-Mail      : @NEWEMAIL@
+
+Дата        : @DATE@
+Браузер     : @BROWSER@
+Адреса IP   : @IPADDRESS@
+Назва хосту : @HOSTNAME@
diff --git a/wiki/inc/lang/uk/resendpwd.txt b/wiki/inc/lang/uk/resendpwd.txt
new file mode 100644
index 0000000..208efad
--- /dev/null
+++ b/wiki/inc/lang/uk/resendpwd.txt
@@ -0,0 +1,3 @@
+====== Надіслати новий пароль ======
+
+Заповніть відомості для того, щоб отримати новий пароль у цій Вікі. Новий пароль буде надіслано на e-mail, що вказано у реєстраційних даних. Ім'я користувача повинно бути дозволеним іменем користувача Вікі.
diff --git a/wiki/inc/lang/uk/resetpwd.txt b/wiki/inc/lang/uk/resetpwd.txt
new file mode 100644
index 0000000..b24e884
--- /dev/null
+++ b/wiki/inc/lang/uk/resetpwd.txt
@@ -0,0 +1,3 @@
+====== Встановити новий пароль ======
+
+Будь-ласка, введіть новий пароль для цієї wiki.
\ No newline at end of file
diff --git a/wiki/inc/lang/uk/revisions.txt b/wiki/inc/lang/uk/revisions.txt
new file mode 100644
index 0000000..646de2a
--- /dev/null
+++ b/wiki/inc/lang/uk/revisions.txt
@@ -0,0 +1,4 @@
+====== Старі ревізії ======
+
+Це старі версії поточного документа. Для того, щоб повернутися до старої версії, виберіть її, натисніть ''Редагувати'', та збережіть сторінку.
+
diff --git a/wiki/inc/lang/uk/searchpage.txt b/wiki/inc/lang/uk/searchpage.txt
new file mode 100644
index 0000000..f323c4a
--- /dev/null
+++ b/wiki/inc/lang/uk/searchpage.txt
@@ -0,0 +1,4 @@
+====== Пошук ======
+
+Дивіться результати пошуку нижче. @CREATEPAGEINFO@
+
diff --git a/wiki/inc/lang/uk/showrev.txt b/wiki/inc/lang/uk/showrev.txt
new file mode 100644
index 0000000..2706b35
--- /dev/null
+++ b/wiki/inc/lang/uk/showrev.txt
@@ -0,0 +1,2 @@
+**Це стара версія документу!**
+----
diff --git a/wiki/inc/lang/uk/stopwords.txt b/wiki/inc/lang/uk/stopwords.txt
new file mode 100644
index 0000000..288ab8e
--- /dev/null
+++ b/wiki/inc/lang/uk/stopwords.txt
@@ -0,0 +1,3 @@
+# Це список ігнорованих індексатором слів, одне слово в рядку
+# При редагуванні цього файлу переконайтеся, що використовуєте символи переведення рядку, як в UNIX (одиночні)
+# Слова, коротші за 3 символи включати не треба. Вони ігноруються в будь-якому випадку
diff --git a/wiki/inc/lang/uk/subscr_digest.txt b/wiki/inc/lang/uk/subscr_digest.txt
new file mode 100644
index 0000000..c226e29
--- /dev/null
+++ b/wiki/inc/lang/uk/subscr_digest.txt
@@ -0,0 +1,14 @@
+Доброго дня!
+
+Сторінку @PAGE@ у @TITLE@ було змінено.
+Зміни, які відбулися:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Стара версія: @OLDPAGE@
+Нова версія: @NEWPAGE@
+
+Щоб відмовитися від повідомлень про редагування сторінок, зайдіть під своїм ім'ям на сайт @DOKUWIKIURL@, потім відвідайте сторінку @SUBSCRIBE@
+та відпишіться від повідомлень про зміну сторінки та/або простору імен.
diff --git a/wiki/inc/lang/uk/subscr_form.txt b/wiki/inc/lang/uk/subscr_form.txt
new file mode 100644
index 0000000..1c9d6d2
--- /dev/null
+++ b/wiki/inc/lang/uk/subscr_form.txt
@@ -0,0 +1,3 @@
+====== Керування підписками ======
+
+Ця сторінка дозволяє Вам керувати Вашими підписками для цієї сторінки та простору імен.
\ No newline at end of file
diff --git a/wiki/inc/lang/uk/subscr_list.txt b/wiki/inc/lang/uk/subscr_list.txt
new file mode 100644
index 0000000..6c4001f
--- /dev/null
+++ b/wiki/inc/lang/uk/subscr_list.txt
@@ -0,0 +1,11 @@
+Доброго дня!
+
+Було змінено сторінки простору імен @PAGE@ у @TITLE@.
+Зміни, які вібдулися:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Щоб відмовитися від повідомлень про редагування сторінок, зайдіть під своїм ім'ям на сайт @DOKUWIKIURL@, потім відвідайте сторінку @SUBSCRIBE@
+та відпишіться від повідомлень про зміну сторінки та/або простору імен.
diff --git a/wiki/inc/lang/uk/subscr_single.txt b/wiki/inc/lang/uk/subscr_single.txt
new file mode 100644
index 0000000..658bae5
--- /dev/null
+++ b/wiki/inc/lang/uk/subscr_single.txt
@@ -0,0 +1,17 @@
+Доброго часу!
+
+Сторінку @PAGE@ у @TITLE@ було змінено.
+Зміни, що відбулися:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Дата : @DATE@
+Користувач : @USER@
+Підсумок: @SUMMARY@
+Стара версія: @OLDPAGE@
+Нова версія: @NEWPAGE@
+
+Щоб відмовитися від повідомлень про редагування сторінок, зайдіть під своїм ім'ям на сайт @DOKUWIKIURL@, потім відвідайте сторінку @NEWPAGE@
+та відпишіться від повідомлень про зміну сторінки та/або простору імен.
diff --git a/wiki/inc/lang/uk/updateprofile.txt b/wiki/inc/lang/uk/updateprofile.txt
new file mode 100644
index 0000000..d043f99
--- /dev/null
+++ b/wiki/inc/lang/uk/updateprofile.txt
@@ -0,0 +1,5 @@
+====== Оновити ваш профіль ======
+
+Необхідно заповнити тільки ті поля, які ви бажаєте змінити. Ви не можете змінити ім’я користувача.
+
+
diff --git a/wiki/inc/lang/uk/uploadmail.txt b/wiki/inc/lang/uk/uploadmail.txt
new file mode 100644
index 0000000..ee982c8
--- /dev/null
+++ b/wiki/inc/lang/uk/uploadmail.txt
@@ -0,0 +1,10 @@
+На вашу ДокуВікі завантажено файл. Деталі:
+
+Файл : @MEDIA@
+Дата : @DATE@
+Браузер : @BROWSER@
+IP-Адреса : @IPADDRESS@
+Назва вузла : @HOSTNAME@
+Розмір : @SIZE@
+Тип MIME : @MIME@
+Користувач : @USER@
diff --git a/wiki/inc/lang/vi/admin.txt b/wiki/inc/lang/vi/admin.txt
new file mode 100644
index 0000000..d8ac73e
--- /dev/null
+++ b/wiki/inc/lang/vi/admin.txt
@@ -0,0 +1,3 @@
+====== Quản lý ======
+
+Sau đây là các mục quản lý trong DokuWiki.
diff --git a/wiki/inc/lang/vi/backlinks.txt b/wiki/inc/lang/vi/backlinks.txt
new file mode 100644
index 0000000..eee624d
--- /dev/null
+++ b/wiki/inc/lang/vi/backlinks.txt
@@ -0,0 +1,3 @@
+====== Liên kết đến trang vừa xem ======
+
+Đây là danh sách các trang có liên kết đến trang vừa xem.
diff --git a/wiki/inc/lang/vi/conflict.txt b/wiki/inc/lang/vi/conflict.txt
new file mode 100644
index 0000000..646dcbc
--- /dev/null
+++ b/wiki/inc/lang/vi/conflict.txt
@@ -0,0 +1,5 @@
+====== Có phiên bản mới hơn ======
+
+Trang bạn đang biên soạn có một phiên bản mới hơn. Việc này xảy ra khi một bạn đổi trang ấy khi bạn đang biên soạn trang này.
+
+Xem kỹ những thay đổi dưới đây, rồi quyết định giữ phiên bản nào. Nếu chọn ''Lưu'', phiên bản của bạn được giữ lại. Bấm ''huỷ'' để giữ phiên bản kia.
diff --git a/wiki/inc/lang/vi/denied.txt b/wiki/inc/lang/vi/denied.txt
new file mode 100644
index 0000000..fe6e759
--- /dev/null
+++ b/wiki/inc/lang/vi/denied.txt
@@ -0,0 +1,4 @@
+====== Không được phép vào ======
+
+Rất tiếc là bạn không được phép để tiếp tục.
+
diff --git a/wiki/inc/lang/vi/diff.txt b/wiki/inc/lang/vi/diff.txt
new file mode 100644
index 0000000..10bfd0f
--- /dev/null
+++ b/wiki/inc/lang/vi/diff.txt
@@ -0,0 +1,4 @@
+====== Khác biệt ======
+
+Đây là những khác biệt giữa phiên bạn được chọn và phiên bản hiện tại của trang này.
+
diff --git a/wiki/inc/lang/vi/edit.txt b/wiki/inc/lang/vi/edit.txt
new file mode 100644
index 0000000..1c16f90
--- /dev/null
+++ b/wiki/inc/lang/vi/edit.txt
@@ -0,0 +1 @@
+Biên soạn trang này và bấm ''Lưu''. Xem [[wiki:syntax:vi|cú pháp của Wiki]] để biết cách soạn thảo. Xin bạn biên soạn trang này nếu bạn có thể **cải tiến** nó. Nếu bạn muốn thử nghiệm, bạn có thể thử ở [[playground:playground| chỗ thử]].
diff --git a/wiki/inc/lang/vi/editrev.txt b/wiki/inc/lang/vi/editrev.txt
new file mode 100644
index 0000000..8a2031c
--- /dev/null
+++ b/wiki/inc/lang/vi/editrev.txt
@@ -0,0 +1,2 @@
+**Bạn đã nạp một phiên bản cũ của văn bản!** Nếu lưu nó, bạn sẽ tạo phiên bản mới với dữ kiện này.
+----
diff --git a/wiki/inc/lang/vi/index.txt b/wiki/inc/lang/vi/index.txt
new file mode 100644
index 0000000..708d203
--- /dev/null
+++ b/wiki/inc/lang/vi/index.txt
@@ -0,0 +1,3 @@
+====== Mục lục ======
+
+Đây là mục lục của tất cả các trang, xếp theo thứ tự [[doku>namespaces|namespaces]].
diff --git a/wiki/inc/lang/vi/jquery.ui.datepicker.js b/wiki/inc/lang/vi/jquery.ui.datepicker.js
new file mode 100644
index 0000000..2c208ab
--- /dev/null
+++ b/wiki/inc/lang/vi/jquery.ui.datepicker.js
@@ -0,0 +1,37 @@
+/* Vietnamese initialisation for the jQuery UI date picker plugin. */
+/* Translated by Le Thanh Huy (lthanhhuy@cit.ctu.edu.vn). */
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "../widgets/datepicker" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery.datepicker );
+	}
+}( function( datepicker ) {
+
+datepicker.regional.vi = {
+	closeText: "Đóng",
+	prevText: "&#x3C;Trước",
+	nextText: "Tiếp&#x3E;",
+	currentText: "Hôm nay",
+	monthNames: [ "Tháng Một", "Tháng Hai", "Tháng Ba", "Tháng Tư", "Tháng Năm", "Tháng Sáu",
+	"Tháng Bảy", "Tháng Tám", "Tháng Chín", "Tháng Mười", "Tháng Mười Một", "Tháng Mười Hai" ],
+	monthNamesShort: [ "Tháng 1", "Tháng 2", "Tháng 3", "Tháng 4", "Tháng 5", "Tháng 6",
+	"Tháng 7", "Tháng 8", "Tháng 9", "Tháng 10", "Tháng 11", "Tháng 12" ],
+	dayNames: [ "Chủ Nhật", "Thứ Hai", "Thứ Ba", "Thứ Tư", "Thứ Năm", "Thứ Sáu", "Thứ Bảy" ],
+	dayNamesShort: [ "CN", "T2", "T3", "T4", "T5", "T6", "T7" ],
+	dayNamesMin: [ "CN", "T2", "T3", "T4", "T5", "T6", "T7" ],
+	weekHeader: "Tu",
+	dateFormat: "dd/mm/yy",
+	firstDay: 0,
+	isRTL: false,
+	showMonthAfterYear: false,
+	yearSuffix: "" };
+datepicker.setDefaults( datepicker.regional.vi );
+
+return datepicker.regional.vi;
+
+} ) );
diff --git a/wiki/inc/lang/vi/lang.php b/wiki/inc/lang/vi/lang.php
new file mode 100644
index 0000000..8e49dec
--- /dev/null
+++ b/wiki/inc/lang/vi/lang.php
@@ -0,0 +1,242 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author James Do <jdo@myrealbox.com>
+ */
+$lang['encoding']              = 'utf-8';
+$lang['direction']             = 'ltr';
+$lang['doublequoteopening']    = '“';
+$lang['doublequoteclosing']    = '”';
+$lang['singlequoteopening']    = '‘';
+$lang['singlequoteclosing']    = '’';
+$lang['apostrophe']            = '’';
+$lang['btn_edit']              = 'Biên soạn trang này';
+$lang['btn_source']            = 'Xem mã nguồn';
+$lang['btn_show']              = 'Xem trang';
+$lang['btn_create']            = 'Tạo trang này';
+$lang['btn_search']            = 'Tìm';
+$lang['btn_save']              = 'Lưu';
+$lang['btn_preview']           = 'Duyệt trước';
+$lang['btn_top']               = 'Trở lên trên';
+$lang['btn_newer']             = '<< mới hơn';
+$lang['btn_older']             = 'cũ hơn >>';
+$lang['btn_revs']              = 'Các phiên bản cũ';
+$lang['btn_recent']            = 'Thay đổi gần đây';
+$lang['btn_upload']            = 'Tải lên';
+$lang['btn_cancel']            = 'Huỷ bỏ';
+$lang['btn_index']             = 'Mục lục';
+$lang['btn_secedit']           = 'Biên soạn';
+$lang['btn_login']             = 'Đăng nhập';
+$lang['btn_logout']            = 'Thoát';
+$lang['btn_admin']             = 'Quản lý';
+$lang['btn_update']            = 'Cập nhật';
+$lang['btn_delete']            = 'Xoá';
+$lang['btn_back']              = 'Quay lại';
+$lang['btn_backlink']          = 'Liên kết tới đây';
+$lang['btn_profile']           = 'Cập nhật hồ sơ';
+$lang['btn_reset']             = 'Làm lại';
+$lang['btn_resendpwd']         = 'Gửi mật khẩu mới';
+$lang['btn_draft']             = 'Sửa bản nháp';
+$lang['btn_recover']           = 'Phục hồi bản nháp';
+$lang['btn_draftdel']          = 'Xóa bản nháp';
+$lang['btn_revert']            = 'Phục hồi';
+$lang['btn_register']          = 'Đăng ký';
+$lang['btn_apply']             = 'Chấp nhận';
+$lang['btn_media']             = 'Quản lý tệp tin';
+$lang['loggedinas']            = 'Username đang dùng:';
+$lang['user']                  = 'Username';
+$lang['pass']                  = 'Mật khẩu';
+$lang['newpass']               = 'Mật khẩu mới';
+$lang['oldpass']               = 'Nhập lại mật khẩu hiện tại';
+$lang['passchk']               = 'lần nữa';
+$lang['remember']              = 'Lưu username/password lại';
+$lang['fullname']              = 'Họ và tên';
+$lang['email']                 = 'E-Mail';
+$lang['profile']               = 'Hồ sơ thành viên';
+$lang['badlogin']              = 'Username hoặc password không đúng.';
+$lang['minoredit']             = 'Minor Changes';
+$lang['draftdate']             = 'Bản nháp được tự động lưu lúc';
+$lang['nosecedit']             = 'Các trang web đã được thay đổi trong khi chờ đợi, phần thông tin quá hạn đã được thay thế bằng trang đầy đủ.';
+$lang['regmissing']            = 'Bạn cần điền vào tất cả các trường';
+$lang['reguexists']            = 'Bạn khác đã dùng username này rồi.';
+$lang['regsuccess']            = 'Đã tạo username, và đã gởi password.';
+$lang['regsuccess2']           = 'Thành viên vừa được tạo.';
+$lang['regmailfail']           = 'Không gởi password được. Xin bạn liên hệ với người quản lý.';
+$lang['regbadmail']            = 'Email hình như không đúng. Xin bạn liên hệ với người quản lý.';
+$lang['regbadpass']            = 'Hai mật khẩu đưa ra là không giống nhau, xin vui lòng thử lại.';
+$lang['regpwmail']             = 'Password DokuWiki của bạn là';
+$lang['reghere']               = 'Xin bạn đăng ký username nếu chưa có';
+$lang['profna']                = 'Wiki này không hỗ trợ sửa đổi hồ sơ cá nhân';
+$lang['profnochange']          = 'Không có thay đổi, không có gì để làm.';
+$lang['profnoempty']           = 'Không được để trống tên hoặc địa chỉ email.';
+$lang['profchanged']           = 'Cập nhật hồ sơ thành viên thành công.';
+$lang['pwdforget']             = 'Bạn quên mật khẩu? Tạo lại mật khẩu mới';
+$lang['resendna']              = 'Wiki này không hỗ trợ gửi lại mật khẩu.';
+$lang['resendpwd']             = 'Gửi mật khẩu mới cho';
+$lang['resendpwdmissing']      = 'Xin lỗi, bạn phải điền vào tất cả các trường.';
+$lang['resendpwdnouser']       = 'Xin lỗi, chúng tôi không thể tìm thấy thành viên này trong cơ sở dữ liệu của chúng tôi.';
+$lang['resendpwdbadauth']      = 'Xin lỗi, mã này xác thực không hợp lệ. Hãy chắc chắn rằng bạn sử dụng liên kết xác nhận đầy đủ.';
+$lang['resendpwdconfirm']      = 'Một liên kết xác nhận đã được gửi bằng email.';
+$lang['resendpwdsuccess']      = 'Mật khẩu mới của bạn đã được gửi bằng email.';
+$lang['license']               = 'Trừ khi có ghi chú khác, nội dung trên wiki này được cấp phép theo giấy phép sau đây:';
+$lang['licenseok']             = 'Lưu ý: Bằng cách chỉnh sửa trang này, bạn đồng ý cấp giấy phép nội dung của bạn theo giấy phép sau:';
+$lang['searchmedia']           = 'Tìm tên file:';
+$lang['searchmedia_in']        = 'Tìm ở %s';
+$lang['txt_upload']            = 'Chọn tệp để tải lên:';
+$lang['txt_filename']          = 'Điền wikiname (tuỳ ý):';
+$lang['txt_overwrt']           = 'Ghi đè file trùng';
+$lang['lockedby']              = 'Đang khoá bởi:';
+$lang['lockexpire']            = 'Sẽ được mở khóa vào lúc:';
+$lang['js']['willexpire']      = 'Trong một phút nữa bài viết sẽ được mở khóa để cho phép người khác chỉnh sửa.\nĐể tránh xung đột, bạn nên bấm nút Duyệt trước để lập lại thời gian khoá bài';
+$lang['js']['notsavedyet']     = 'Hiện có những thay đổi chưa được bảo lưu, và sẽ mất.\nBạn thật sự muốn tiếp tục?';
+$lang['js']['searchmedia']     = 'Tìm kiếm tập tin';
+$lang['js']['keepopen']        = 'Giữ cửa sổ đang mở trên lựa chọn';
+$lang['js']['hidedetails']     = 'Ẩn thông tin chi tiết';
+$lang['js']['mediatitle']      = 'Thiết lập liên kết';
+$lang['js']['mediadisplay']    = 'Kiểu liên kết';
+$lang['js']['mediaalign']      = 'Sắp hàng';
+$lang['js']['mediasize']       = 'Cỡ ảnh';
+$lang['js']['mediatarget']     = 'Đích của liên kết';
+$lang['js']['mediaclose']      = 'Đóng';
+$lang['js']['mediainsert']     = 'Chèn';
+$lang['js']['mediadisplayimg'] = 'Hiển thị ảnh.';
+$lang['js']['mediadisplaylnk'] = 'Chỉ hiển thị liên kết.';
+$lang['js']['mediasmall']      = 'Nhỏ';
+$lang['js']['mediamedium']     = 'Vừa';
+$lang['js']['medialarge']      = 'To';
+$lang['js']['mediaoriginal']   = 'Kích cỡ gốc';
+$lang['js']['medialnk']        = 'Liên kết tới trang chi tiết';
+$lang['js']['mediadirect']     = 'Liên kết trực tiếp tới ảnh gốc';
+$lang['js']['medianolnk']      = 'Không liên kết';
+$lang['js']['medianolink']     = 'Không liên kết tới ảnh';
+$lang['js']['medialeft']       = 'Căn ảnh sang trái.';
+$lang['js']['mediaright']      = 'Căn ảnh sang phải.';
+$lang['js']['mediacenter']     = 'Cản ảnh ra giữa.';
+$lang['js']['medianoalign']    = 'Không căn.';
+$lang['js']['nosmblinks']      = 'Nối với các Windows shares chỉ có hiệu lực với Microsoft Internet Explorer.\nBạn vẫn có thể sao và chép các mốc nối.';
+$lang['js']['linkwiz']         = 'Hộp thoại liên kết';
+$lang['js']['linkto']          = 'Liên kết tới:';
+$lang['js']['del_confirm']     = 'Xoá mục này?';
+$lang['js']['restore_confirm'] = 'Sẵn sàng phục hồi phiên bản này?';
+$lang['js']['media_diff']      = 'So sánh:';
+$lang['js']['media_select']    = 'Chọn nhiều file…';
+$lang['js']['media_upload_btn'] = 'Tải lên';
+$lang['js']['media_done_btn']  = 'Xong';
+$lang['js']['media_drop']      = 'Kéo các file vào đây để tải lên';
+$lang['js']['media_overwrt']   = 'Ghi đè các file trùng';
+$lang['rssfailed']             = 'Nguồn này gặp phải lỗi';
+$lang['nothingfound']          = 'Không tìm được gì';
+$lang['mediaselect']           = 'Xem';
+$lang['uploadsucc']            = 'Tải lên thành công';
+$lang['uploadfail']            = 'Tải lên thất bại. Có thể vì không đủ quyền?';
+$lang['uploadwrong']           = 'Tải lên bị từ chối. Cấm tải loại tệp này';
+$lang['uploadexist']           = 'Tệp tin bị trùng. Chưa có gì xảy ra.';
+$lang['namespaces']            = 'Thư mục';
+$lang['mediafiles']            = 'Tệp có sẵn ở';
+$lang['accessdenied']          = 'Bạn không được phép xem trang này.';
+$lang['mediausage']            = 'Sử dụng cú pháp sau đây để dẫn đến tập tin này:';
+$lang['mediaview']             = 'Xem tệp gốc';
+$lang['mediaroot']             = 'thư mục gốc';
+$lang['mediaupload']           = 'Tải một tập tin lên thư mục hiện tại ở đây. Để tạo thư mục con, thêm nó vào trước tên tập tin của bạn, phân cách bằng dấu hai chấm sau khi bạn chọn các tập tin. File còn có thể được lựa chọn bằng cách kéo và thả.';
+$lang['mediaextchange']        = 'Phần mở rộng thay đổi từ .%s thành .%s!';
+$lang['ref_inuse']             = 'Không thể xóa tập tin vì nó đang được sử dụng cho các trang sau:';
+$lang['ref_hidden']            = 'Một số tài liệu sử dụng cho trang này bạn không được cấp phép truy cập.';
+$lang['hits']                  = 'Trùng';
+$lang['quickhits']             = 'Trang trùng hợp';
+$lang['toc']                   = 'Nội dung';
+$lang['current']               = 'hiện tại';
+$lang['yours']                 = 'Phiên bản hiện tại';
+$lang['diff']                  = 'cho xem khác biệt với phiên bản hiện tại';
+$lang['diff2']                 = 'Sự khác biệt giữa các bản được lựa chọn';
+$lang['difflink']              = 'Liên kết để xem bản so sánh này';
+$lang['diff_type']             = 'Xem sự khác biệt:';
+$lang['diff_inline']           = 'Nội tuyến';
+$lang['diff_side']             = 'Xếp cạnh nhau';
+$lang['line']                  = 'Dòng';
+$lang['breadcrumb']            = 'Trang đã xem:';
+$lang['youarehere']            = 'Bạn đang ở đây:';
+$lang['lastmod']               = 'Thời điểm thay đổi:';
+$lang['by']                    = 'do';
+$lang['deleted']               = 'bị xoá';
+$lang['created']               = 'được tạo ra';
+$lang['restored']              = 'phiên bản cũ đã được khôi phục (%s)';
+$lang['external_edit']         = 'external edit';
+$lang['summary']               = 'Tóm tắt biên soạn';
+$lang['noflash']               = '<a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> cần được cài để có thể xem nội dung này.';
+$lang['mail_newpage']          = 'Trang được thêm:';
+$lang['mail_changed']          = 'Trang thay đổi:';
+$lang['changes_type']          = 'Xem thay đổi của';
+$lang['pages_changes']         = 'Trang';
+$lang['media_changes']         = 'Tệp media';
+$lang['both_changes']          = 'Cả trang và các tập tin media';
+$lang['qb_bold']               = 'Chữ đậm';
+$lang['qb_italic']             = 'Chữ nghiêng';
+$lang['qb_underl']             = 'Chữ gạch dưới';
+$lang['qb_code']               = 'Chữ mã nguồn';
+$lang['qb_strike']             = 'Strike-through Text';
+$lang['qb_h1']                 = 'Đầu đề cấp 1';
+$lang['qb_h2']                 = 'Đầu đề cấp 2';
+$lang['qb_h3']                 = 'Đầu đề cấp 3';
+$lang['qb_h4']                 = 'Đầu đề cấp 4';
+$lang['qb_h5']                 = 'Đầu đề cấp 5';
+$lang['qb_link']               = 'Mốc nối nội tại';
+$lang['qb_extlink']            = 'Mốc nối ra ngoài';
+$lang['qb_hr']                 = 'Gạch ngang';
+$lang['qb_ol']                 = 'Điểm trong danh sách có thứ tự';
+$lang['qb_ul']                 = 'Điểm trong danh sách không đánh số';
+$lang['qb_media']              = 'Thêm ảnh và tệp khác';
+$lang['qb_sig']                = 'Đặt chữ ký';
+$lang['metaedit']              = 'Sửa Metadata';
+$lang['metasaveerr']           = 'Thất bại khi viết metadata';
+$lang['metasaveok']            = 'Metadata đã được lưu';
+$lang['btn_img_backto']            = 'Quay lại %s';
+$lang['img_title']             = 'Tiêu đề:';
+$lang['img_caption']           = 'Ghi chú:';
+$lang['img_date']              = 'Ngày:';
+$lang['img_fname']             = 'Tên file:';
+$lang['img_fsize']             = 'Kích cỡ:';
+$lang['img_artist']            = 'Người chụp:';
+$lang['img_copyr']             = 'Bản quyền:';
+$lang['img_format']            = 'Định dạng:';
+$lang['img_camera']            = 'Camera:';
+$lang['img_keywords']          = 'Từ khóa:';
+$lang['img_width']             = 'Rộng:';
+$lang['img_height']            = 'Cao:';
+$lang['btn_mediaManager']           = 'Xem trong trình quản lý tệp media';
+$lang['i_chooselang']          = 'Chọn ngôn ngữ';
+$lang['i_retry']               = 'Thử lại';
+$lang['years']                 = 'cách đây %d năm';
+$lang['months']                = 'cách đây %d tháng';
+$lang['weeks']                 = 'cách đây %d tuần';
+$lang['days']                  = 'cách đây %d ngày';
+$lang['hours']                 = 'cách đây %d giờ';
+$lang['minutes']               = 'cách đây %d phút';
+$lang['seconds']               = 'cách đây %d giây';
+$lang['wordblock']             = 'Thay đổi của bạn đã không được lưu lại bởi vì nó có chứa văn bản bị chặn (spam).';
+$lang['media_uploadtab']       = 'Tải lên';
+$lang['media_searchtab']       = 'Tìm';
+$lang['media_file']            = 'Tệp';
+$lang['media_viewtab']         = 'Xem';
+$lang['media_edittab']         = 'Sửa';
+$lang['media_historytab']      = 'Lịch sử';
+$lang['media_list_thumbs']     = 'Ảnh thu nhỏ';
+$lang['media_list_rows']       = 'Dòng';
+$lang['media_sort_name']       = 'Tên';
+$lang['media_sort_date']       = 'Ngày';
+$lang['media_namespaces']      = 'Chọn thư mục';
+$lang['media_files']           = 'Các tệp trong %s';
+$lang['media_upload']          = 'Tải lên %s';
+$lang['media_search']          = 'Tìm ở %s';
+$lang['media_view']            = '%s';
+$lang['media_viewold']         = '%s ở %s';
+$lang['media_edit']            = 'Sửa %s';
+$lang['media_history']         = 'Lịch sử của %s';
+$lang['media_meta_edited']     = 'đã sửa metadata';
+$lang['media_perm_read']       = 'Sorry, bạn không đủ quyền truy cập.';
+$lang['media_perm_upload']     = 'Xin lỗi, bạn không đủ quyền để upload file lên.';
+$lang['media_update']          = 'Tải lên phiên bản mới';
+$lang['media_restore']         = 'Phục hồi phiên bản này';
+$lang['email_signature_text'] = 'Điện thư này tạo bởi DokuWiki ở
+@DOKUWIKIURL@';
diff --git a/wiki/inc/lang/vi/locked.txt b/wiki/inc/lang/vi/locked.txt
new file mode 100644
index 0000000..acb0981
--- /dev/null
+++ b/wiki/inc/lang/vi/locked.txt
@@ -0,0 +1,3 @@
+====== Trang bị khoá ======
+
+Trang này đang bị khoá để một bạn khác biên soạn. Bạn cần đợi cho đến khi nào bạn kia đã biên soạn xong, hoặc khoá hết hạn.
diff --git a/wiki/inc/lang/vi/login.txt b/wiki/inc/lang/vi/login.txt
new file mode 100644
index 0000000..71a8b1a
--- /dev/null
+++ b/wiki/inc/lang/vi/login.txt
@@ -0,0 +1,3 @@
+====== Đăng nhập ======
+
+Hiện bạn chưa đăng nhập! Hãy khai báo thông tin đăng nhập vào ô ở phía dưới. Máy của bạn cần đặt chế độ nhận cookies để đăng nhập.
diff --git a/wiki/inc/lang/vi/mailtext.txt b/wiki/inc/lang/vi/mailtext.txt
new file mode 100644
index 0000000..bcbb656
--- /dev/null
+++ b/wiki/inc/lang/vi/mailtext.txt
@@ -0,0 +1,12 @@
+Một trang trên DokuWiki của bạn vừa được bổ sung hoặc thay đổi. Sau đây là chi tiết:
+
+Date        : @DATE@
+Browser     : @BROWSER@
+IP-Address  : @IPADDRESS@
+Hostname    : @HOSTNAME@
+Old Revision: @OLDPAGE@
+New Revision: @NEWPAGE@
+Edit Summary: @SUMMARY@
+User        : @USER@
+
+@DIFF@
diff --git a/wiki/inc/lang/vi/newpage.txt b/wiki/inc/lang/vi/newpage.txt
new file mode 100644
index 0000000..93f474b
--- /dev/null
+++ b/wiki/inc/lang/vi/newpage.txt
@@ -0,0 +1,3 @@
+====== Chưa có đề tài này ======
+
+Bạn kết nối vào một đề tài chưa có. Bạn có tạo đề tài này bằng cách bấm vào nút ''Tạo trang này'' ở góc trên, bên trái cửa sổ này. Nếu bạn không thấy nút này, thay vào đó là nút ''Xem mã nguồn'' chứng tỏ bạn không có quyền biên tập trang này, hãy đăng nhập thử xem bạn có quyền biên tập trang không. Nếu bạn nghĩ đây là một lỗi, hãy báo cho người quản trị.
diff --git a/wiki/inc/lang/vi/norev.txt b/wiki/inc/lang/vi/norev.txt
new file mode 100644
index 0000000..224bd1d
--- /dev/null
+++ b/wiki/inc/lang/vi/norev.txt
@@ -0,0 +1,3 @@
+====== Phiên bản chưa có ======
+
+Chưa có phiên bản được chỉ định. Xin bấm nút ''Phiên bản cũ'' để xem danh sách các phiên bản của văn bản này.
diff --git a/wiki/inc/lang/vi/password.txt b/wiki/inc/lang/vi/password.txt
new file mode 100644
index 0000000..9f80429
--- /dev/null
+++ b/wiki/inc/lang/vi/password.txt
@@ -0,0 +1,6 @@
+Thân chào bạn @FULLNAME@!
+
+Đây là chi tiết để bạn đăng nhập @TITLE@ tại @DOKUWIKIURL@:
+
+Username: @LOGIN@
+Password: @PASSWORD@
diff --git a/wiki/inc/lang/vi/preview.txt b/wiki/inc/lang/vi/preview.txt
new file mode 100644
index 0000000..f02a251
--- /dev/null
+++ b/wiki/inc/lang/vi/preview.txt
@@ -0,0 +1,3 @@
+====== Xem trước ======
+
+Văn bản của bạn sẽ thể hiện như sau. Nên nhớ: Văn bản này **chưa được lưu**!
diff --git a/wiki/inc/lang/vi/read.txt b/wiki/inc/lang/vi/read.txt
new file mode 100644
index 0000000..eec6996
--- /dev/null
+++ b/wiki/inc/lang/vi/read.txt
@@ -0,0 +1 @@
+Trang này chỉ được đọc thôi. Bạn có thể xem mã nguồn, nhưng không được thay đổi. Hãy báo lại người quản lý nếu hệ thống hoạt động không đúng.
diff --git a/wiki/inc/lang/vi/recent.txt b/wiki/inc/lang/vi/recent.txt
new file mode 100644
index 0000000..fe6628f
--- /dev/null
+++ b/wiki/inc/lang/vi/recent.txt
@@ -0,0 +1,3 @@
+====== Thay đổi gần đây ======
+
+Những trang sau được thay đổi gần đây.
diff --git a/wiki/inc/lang/vi/register.txt b/wiki/inc/lang/vi/register.txt
new file mode 100644
index 0000000..f7d35c8
--- /dev/null
+++ b/wiki/inc/lang/vi/register.txt
@@ -0,0 +1,3 @@
+====== Đăng ký mới ======
+
+Xin điền vào mọi thông tin sau đây để tạo một username mới cho wiki này. Bạn cần cung cấp **e-mail chính xác** - để gởi password mới của bạn đến đấy. Username cần là một [[doku>pagename|pagename]] hợp lệ.
diff --git a/wiki/inc/lang/vi/revisions.txt b/wiki/inc/lang/vi/revisions.txt
new file mode 100644
index 0000000..b9e9779
--- /dev/null
+++ b/wiki/inc/lang/vi/revisions.txt
@@ -0,0 +1,3 @@
+====== Phiên bản cũ ======
+
+Sau đây là các phiên bản cũ của văn bản này. Để quay về một phiên bản cũ, bạn hãy chọn nó từ danh sách dưới đây, sau đó bấm vào nút ''Phục hồi'' hoặc nhấp nút ''Biên soạn trang này'' và lưu nó lại.
diff --git a/wiki/inc/lang/vi/searchpage.txt b/wiki/inc/lang/vi/searchpage.txt
new file mode 100644
index 0000000..cbba3fa
--- /dev/null
+++ b/wiki/inc/lang/vi/searchpage.txt
@@ -0,0 +1,4 @@
+====== Tìm ======
+
+Sau đây là kết quả mà bạn đã tìm. @CREATEPAGEINFO@
+
diff --git a/wiki/inc/lang/vi/showrev.txt b/wiki/inc/lang/vi/showrev.txt
new file mode 100644
index 0000000..a146f4e
--- /dev/null
+++ b/wiki/inc/lang/vi/showrev.txt
@@ -0,0 +1,2 @@
+**Đây là một phiên bản cũ cùa văn kiện!**
+----
diff --git a/wiki/inc/lang/zh-tw/admin.txt b/wiki/inc/lang/zh-tw/admin.txt
new file mode 100644
index 0000000..5916e71
--- /dev/null
+++ b/wiki/inc/lang/zh-tw/admin.txt
@@ -0,0 +1,3 @@
+====== 管理選單 ======
+
+以下為 DokuWiki 的管理設定。
\ No newline at end of file
diff --git a/wiki/inc/lang/zh-tw/adminplugins.txt b/wiki/inc/lang/zh-tw/adminplugins.txt
new file mode 100644
index 0000000..6d21ac2
--- /dev/null
+++ b/wiki/inc/lang/zh-tw/adminplugins.txt
@@ -0,0 +1 @@
+===== 附加元件 =====
\ No newline at end of file
diff --git a/wiki/inc/lang/zh-tw/backlinks.txt b/wiki/inc/lang/zh-tw/backlinks.txt
new file mode 100644
index 0000000..6a8bf88
--- /dev/null
+++ b/wiki/inc/lang/zh-tw/backlinks.txt
@@ -0,0 +1,4 @@
+====== 反向連結 ======
+
+這是引用、連結到目前頁面的頁面清單。
+
diff --git a/wiki/inc/lang/zh-tw/conflict.txt b/wiki/inc/lang/zh-tw/conflict.txt
new file mode 100644
index 0000000..4f31f66
--- /dev/null
+++ b/wiki/inc/lang/zh-tw/conflict.txt
@@ -0,0 +1,5 @@
+====== 已存在更新版本 ======
+
+此檔案已存在更新的版本。這是因為有其他使用者在您編輯時變更了這份文件。
+
+請仔細檢查以下差異,再決定保留哪份。您可選擇「儲存」您的版本或「取消」保留目前版本。
\ No newline at end of file
diff --git a/wiki/inc/lang/zh-tw/denied.txt b/wiki/inc/lang/zh-tw/denied.txt
new file mode 100644
index 0000000..23f306d
--- /dev/null
+++ b/wiki/inc/lang/zh-tw/denied.txt
@@ -0,0 +1,4 @@
+====== 權限拒絕 ======
+
+抱歉,您沒有足夠權限繼續執行。
+
diff --git a/wiki/inc/lang/zh-tw/diff.txt b/wiki/inc/lang/zh-tw/diff.txt
new file mode 100644
index 0000000..e2c0500
--- /dev/null
+++ b/wiki/inc/lang/zh-tw/diff.txt
@@ -0,0 +1,3 @@
+====== 差異處 ======
+
+這裏顯示兩個版本的差異處。
\ No newline at end of file
diff --git a/wiki/inc/lang/zh-tw/draft.txt b/wiki/inc/lang/zh-tw/draft.txt
new file mode 100644
index 0000000..f14702e
--- /dev/null
+++ b/wiki/inc/lang/zh-tw/draft.txt
@@ -0,0 +1,5 @@
+====== 發現草稿檔案 ======
+
+您上次的編輯程序並未正確完成。DokuWiki 已在您編輯時自動儲存了一份草稿使您可以繼續編輯。以下是上次的編輯資料。
+
+請決定要//復原//您遺失的編輯文件,//刪除//這份草稿,或者//取消//編輯程序。
diff --git a/wiki/inc/lang/zh-tw/edit.txt b/wiki/inc/lang/zh-tw/edit.txt
new file mode 100644
index 0000000..f6b7479
--- /dev/null
+++ b/wiki/inc/lang/zh-tw/edit.txt
@@ -0,0 +1 @@
+編輯本頁後,請按下「儲存」按鈕。若要參看語法說明,請到[[wiki:syntax|語法]]頁。請只在能讓本文品質**更好**時才編輯。如果只是要測試,請移玉步至 [[playground:playground|遊樂場]]。
\ No newline at end of file
diff --git a/wiki/inc/lang/zh-tw/editrev.txt b/wiki/inc/lang/zh-tw/editrev.txt
new file mode 100644
index 0000000..98a800a
--- /dev/null
+++ b/wiki/inc/lang/zh-tw/editrev.txt
@@ -0,0 +1,2 @@
+**您目前載入的是本份文件的舊版!** 您如果存檔,這些舊版資料就會變成最新版本。
+----
diff --git a/wiki/inc/lang/zh-tw/index.txt b/wiki/inc/lang/zh-tw/index.txt
new file mode 100644
index 0000000..31e60ac
--- /dev/null
+++ b/wiki/inc/lang/zh-tw/index.txt
@@ -0,0 +1,3 @@
+====== 網站地圖 ======
+
+這個網站地圖列出了所有允許的頁面,依 [[doku>namespaces|分類名稱]] 排序。
\ No newline at end of file
diff --git a/wiki/inc/lang/zh-tw/install.html b/wiki/inc/lang/zh-tw/install.html
new file mode 100644
index 0000000..9a0d1dc
--- /dev/null
+++ b/wiki/inc/lang/zh-tw/install.html
@@ -0,0 +1,8 @@
+<p>本頁面旨在幫助您完成第一次安装和設定 <a href="http://dokuwiki.org">Dokuwiki</a>。關於安裝工具的更多訊息請參閱 <a href="http://dokuwiki.org/installer">官方文檔頁面</a>。</p>
+
+<p>DokuWiki 使用普通檔案來儲存 wiki 頁面,以及與頁面相關的訊息(例如:圖像、搜尋索引、修訂記錄等)。為了正常運作,DokuWiki <strong>必須</strong> 擁有針對那些路徑和檔案的寫入權限。本安裝工具無法設定目錄權限,這通常要透過命令行、FTP 或您主機上的控制台(如cPanel)進行。</p>
+
+<p>本安裝工具將設定您的 DokuWiki 用於 <abbr title="訪問控制列表">ACL</abbr> 的設定檔,它能讓管理員登入並使用「管理」功能來安裝附加元件、管理使用者、管理訪問權限和其他設定設定。它並不是 DokuWiki 正常運作所必須,但安裝之後將更方便管理。</p>
+
+<p>有經驗的或有特殊需求的使用者,請參閱更詳細的 <a href="http://dokuwiki.org/install">安裝指南</a>
+和 <a href="http://dokuwiki.org/config">設定</a>。</p>
\ No newline at end of file
diff --git a/wiki/inc/lang/zh-tw/jquery.ui.datepicker.js b/wiki/inc/lang/zh-tw/jquery.ui.datepicker.js
new file mode 100644
index 0000000..c20754b
--- /dev/null
+++ b/wiki/inc/lang/zh-tw/jquery.ui.datepicker.js
@@ -0,0 +1,37 @@
+/* Chinese initialisation for the jQuery UI date picker plugin. */
+/* Written by Ressol (ressol@gmail.com). */
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "../widgets/datepicker" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery.datepicker );
+	}
+}( function( datepicker ) {
+
+datepicker.regional[ "zh-TW" ] = {
+	closeText: "關閉",
+	prevText: "&#x3C;上月",
+	nextText: "下月&#x3E;",
+	currentText: "今天",
+	monthNames: [ "一月","二月","三月","四月","五月","六月",
+	"七月","八月","九月","十月","十一月","十二月" ],
+	monthNamesShort: [ "一月","二月","三月","四月","五月","六月",
+	"七月","八月","九月","十月","十一月","十二月" ],
+	dayNames: [ "星期日","星期一","星期二","星期三","星期四","星期五","星期六" ],
+	dayNamesShort: [ "周日","周一","周二","周三","周四","周五","周六" ],
+	dayNamesMin: [ "日","一","二","三","四","五","六" ],
+	weekHeader: "周",
+	dateFormat: "yy/mm/dd",
+	firstDay: 1,
+	isRTL: false,
+	showMonthAfterYear: true,
+	yearSuffix: "年" };
+datepicker.setDefaults( datepicker.regional[ "zh-TW" ] );
+
+return datepicker.regional[ "zh-TW" ];
+
+} ) );
diff --git a/wiki/inc/lang/zh-tw/lang.php b/wiki/inc/lang/zh-tw/lang.php
new file mode 100644
index 0000000..e7384cf
--- /dev/null
+++ b/wiki/inc/lang/zh-tw/lang.php
@@ -0,0 +1,348 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author chinsan <chinsan@mail2000.com.tw>
+ * @author Li-Jiun Huang <ljhuang.tw@gmail.com>
+ * @author http://www.chinese-tools.com/tools/converter-simptrad.html
+ * @author Wayne San <waynesan@zerozone.tw>
+ * @author Cheng-Wei Chien <e.cwchien@gmail.com>
+ * @author Shuo-Ting Jian <shoting@gmail.com>
+ * @author syaoranhinata@gmail.com
+ * @author Ichirou Uchiki <syaoranhinata@gmail.com>
+ * @author tsangho <ou4222@gmail.com>
+ * @author Danny Lin <danny0838@gmail.com>
+ * @author Stan <talktostan@gmail.com>
+ * @author June-Hao Hou <junehao@gmail.com>
+ * @author lioujheyu <lioujheyu@gmail.com>
+ * @author Liou, Jhe-Yu <lioujheyu@gmail.com>
+ */
+$lang['encoding']              = 'utf-8';
+$lang['direction']             = 'ltr';
+$lang['doublequoteopening']    = '“';
+$lang['doublequoteclosing']    = '”';
+$lang['singlequoteopening']    = '‘';
+$lang['singlequoteclosing']    = '’';
+$lang['apostrophe']            = '’';
+$lang['btn_edit']              = '編輯本頁';
+$lang['btn_source']            = '顯示原始碼';
+$lang['btn_show']              = '顯示頁面';
+$lang['btn_create']            = '建立此頁';
+$lang['btn_search']            = '搜尋';
+$lang['btn_save']              = '儲存';
+$lang['btn_preview']           = '預覽';
+$lang['btn_top']               = '回到頁頂';
+$lang['btn_newer']             = '<< 較新';
+$lang['btn_older']             = '較舊 >>';
+$lang['btn_revs']              = '舊版';
+$lang['btn_recent']            = '最近更新';
+$lang['btn_upload']            = '上傳';
+$lang['btn_cancel']            = '取消';
+$lang['btn_index']             = '網站地圖';
+$lang['btn_secedit']           = '編輯此段';
+$lang['btn_login']             = '登入';
+$lang['btn_logout']            = '登出';
+$lang['btn_admin']             = '管理選單';
+$lang['btn_update']            = '更新設定';
+$lang['btn_delete']            = '刪除';
+$lang['btn_back']              = '回上一步';
+$lang['btn_backlink']          = '反向連結';
+$lang['btn_subscribe']         = '訂閱更動通知';
+$lang['btn_profile']           = '更新個人資料';
+$lang['btn_reset']             = '資料重設';
+$lang['btn_resendpwd']         = '設定新密碼';
+$lang['btn_draft']             = '編輯草稿';
+$lang['btn_recover']           = '復原草稿';
+$lang['btn_draftdel']          = '捨棄草稿';
+$lang['btn_revert']            = '復原';
+$lang['btn_register']          = '註冊';
+$lang['btn_apply']             = '套用';
+$lang['btn_media']             = '多媒體管理器';
+$lang['btn_deleteuser']        = '移除我的帳號';
+$lang['btn_img_backto']        = '回上一頁 %s';
+$lang['btn_mediaManager']      = '在多媒體管理器中檢視';
+$lang['loggedinas']            = '登入成:';
+$lang['user']                  = '帳號';
+$lang['pass']                  = '密碼';
+$lang['newpass']               = '新密碼';
+$lang['oldpass']               = '目前密碼';
+$lang['passchk']               = '確認密碼';
+$lang['remember']              = '記住帳號密碼';
+$lang['fullname']              = '姓名';
+$lang['email']                 = '電郵';
+$lang['profile']               = '使用者個人資料';
+$lang['badlogin']              = '很抱歉,您的使用者名稱或密碼可能有錯誤。';
+$lang['badpassconfirm']        = '抱歉,這密碼是錯的';
+$lang['minoredit']             = '小修改';
+$lang['draftdate']             = '草稿已自動存檔於';
+$lang['nosecedit']             = '在您編輯期間,其他使用者修改過本頁面。區段資料已逾時,因此系統載入了全頁,以取代之。';
+$lang['regmissing']            = '很抱歉,所有欄位都要填寫。';
+$lang['reguexists']            = '很抱歉,有人已使用了這個帳號。';
+$lang['regsuccess']            = '使用者帳號已建立,密碼已寄發至該電郵。';
+$lang['regsuccess2']           = '使用者帳號已建立。';
+$lang['regmailfail']           = '寄出密碼信似乎有問題,請跟管理員聯絡!';
+$lang['regbadmail']            = '您輸入的電郵地址似乎不正確。若您覺得是正確的,請與管理員聯絡。';
+$lang['regbadpass']            = '兩次輸入的密碼不一致,請再試一次。';
+$lang['regpwmail']             = '您的 DokuWiki 帳號密碼';
+$lang['reghere']               = '您還沒有帳號嗎?註冊一個吧。';
+$lang['profna']                = '本 wiki 不支援修改個人資料。';
+$lang['profnochange']          = '並未作任何變更。';
+$lang['profnoempty']           = '帳號或電郵地址不可空白!';
+$lang['profchanged']           = '個人資料已更新。';
+$lang['profnodelete']          = '本 wiki 不支援刪除使用者';
+$lang['profdeleteuser']        = '刪除帳號';
+$lang['profdeleted']           = '您的使用者帳號已從本 wiki 刪除';
+$lang['profconfdelete']        = '我想把帳號從本 wiki 刪除(不能復原)';
+$lang['profconfdeletemissing'] = '未勾選確認方塊';
+$lang['pwdforget']             = '忘記密碼了?索取新密碼!';
+$lang['resendna']              = '本 wiki 不支援重寄密碼。';
+$lang['resendpwd']             = '設定新密碼供';
+$lang['resendpwdmissing']      = '抱歉,您必須填寫所有欄位。';
+$lang['resendpwdnouser']       = '抱歉,資料庫內找不到這個使用者。';
+$lang['resendpwdbadauth']      = '抱歉,認證碼無效。請確認您使用了完整的確認連結。';
+$lang['resendpwdconfirm']      = '確認連結已通過郵件發送給您了。';
+$lang['resendpwdsuccess']      = '您的新密碼已寄出。';
+$lang['license']               = '若無特別註明,本 wiki 上的內容都是採用以下授權方式:';
+$lang['licenseok']             = '注意:編輯此頁面表示您同意用以下授權方式發布您撰寫的內容:';
+$lang['searchmedia']           = '搜尋檔名:';
+$lang['searchmedia_in']        = '在 %s 裏搜尋';
+$lang['txt_upload']            = '請選擇要上傳的檔案:';
+$lang['txt_filename']          = '請輸入要上傳至本 wiki 的檔案名稱 (非必要):';
+$lang['txt_overwrt']           = '是否要覆蓋原有檔案';
+$lang['maxuploadsize']         = '每個上傳檔案不可大於 %s 。';
+$lang['lockedby']              = '目前已被下列人員鎖定:';
+$lang['lockexpire']            = '預計解除鎖定於:';
+$lang['js']['willexpire']      = '本頁的編輯鎖定將在一分鐘內到期。要避免發生衝突,請按「預覽」鍵重設鎖定計時。';
+$lang['js']['notsavedyet']     = '未儲存的變更將會遺失,繼續嗎?';
+$lang['js']['searchmedia']     = '搜尋檔案';
+$lang['js']['keepopen']        = '選擇時保持視窗開啟';
+$lang['js']['hidedetails']     = '隱藏詳細內容';
+$lang['js']['mediatitle']      = '連結設定';
+$lang['js']['mediadisplay']    = '連結類型';
+$lang['js']['mediaalign']      = '校正';
+$lang['js']['mediasize']       = '圖像大小';
+$lang['js']['mediatarget']     = '連結目標';
+$lang['js']['mediaclose']      = '關閉';
+$lang['js']['mediainsert']     = '插入';
+$lang['js']['mediadisplayimg'] = '顯示此圖像';
+$lang['js']['mediadisplaylnk'] = '只顯示連結';
+$lang['js']['mediasmall']      = '小型版本';
+$lang['js']['mediamedium']     = '中型版本';
+$lang['js']['medialarge']      = '大型版本';
+$lang['js']['mediaoriginal']   = '原始版本';
+$lang['js']['medialnk']        = '連向內容頁面';
+$lang['js']['mediadirect']     = '連向原始圖片';
+$lang['js']['medianolnk']      = '不連結';
+$lang['js']['medianolink']     = '不連結圖像';
+$lang['js']['medialeft']       = '圖像靠左對齊';
+$lang['js']['mediaright']      = '圖像靠右對齊';
+$lang['js']['mediacenter']     = '圖像置中對齊';
+$lang['js']['medianoalign']    = '不對齊';
+$lang['js']['nosmblinks']      = '只有在 Microsoft IE 下才能執行「連結到 Windows shares」。
+不過您仍可複製及貼上這個連結。';
+$lang['js']['linkwiz']         = '建立連結精靈';
+$lang['js']['linkto']          = '連結至:';
+$lang['js']['del_confirm']     = '確定刪除選取的項目?';
+$lang['js']['restore_confirm'] = '確定還原到這個版本?';
+$lang['js']['media_diff']      = '檢視差異:';
+$lang['js']['media_diff_both'] = '並排';
+$lang['js']['media_diff_opacity'] = '重疊';
+$lang['js']['media_diff_portions'] = '滑動';
+$lang['js']['media_select']    = '選擇檔案……';
+$lang['js']['media_upload_btn'] = '上傳';
+$lang['js']['media_done_btn']  = '完成';
+$lang['js']['media_drop']      = '拖拉檔案到此上傳';
+$lang['js']['media_cancel']    = '刪除';
+$lang['js']['media_overwrt']   = '覆蓋已存在的檔案';
+$lang['rssfailed']             = '擷取 RSS 饋送檔時發生錯誤:';
+$lang['nothingfound']          = '沒找到任何結果。';
+$lang['mediaselect']           = '媒體檔案';
+$lang['uploadsucc']            = '已上傳';
+$lang['uploadfail']            = '無法上傳。是否因權限錯誤?';
+$lang['uploadwrong']           = '拒絕上傳。這個副檔名被禁止了!';
+$lang['uploadexist']           = '檔案已存在,未處理。';
+$lang['uploadbadcontent']      = '上傳檔案的內容不符合 %s 檔的副檔名。';
+$lang['uploadspam']            = '是次上傳被垃圾訊息黑名單阻檔了。';
+$lang['uploadxss']             = '因可能含有惡意內容,是次上傳已被阻檔。';
+$lang['uploadsize']            = '上傳的檔案太大了 (最大為:%s)';
+$lang['deletesucc']            = '檔案 "%s" 已刪除。';
+$lang['deletefail']            = '檔案 "%s" 無法刪除,請檢查權限定。';
+$lang['mediainuse']            = '檔案 "%s" 仍在使用,並未刪除。';
+$lang['namespaces']            = '分類名稱';
+$lang['mediafiles']            = '可用的檔案有';
+$lang['accessdenied']          = '您不可以檢視此頁面。';
+$lang['mediausage']            = '使用以下的語法來連結此檔案:';
+$lang['mediaview']             = '檢視原始檔案';
+$lang['mediaroot']             = 'root';
+$lang['mediaupload']           = '上傳檔案至目前分類名稱之下。要建立子分類名稱,請將其名稱加在「上傳並重命名為」檔案名的前面,並用英文冒號隔開。';
+$lang['mediaextchange']        = '檔案類型已由 .%s 變更作 .%s !';
+$lang['reference']             = '引用到本頁的,合計有';
+$lang['ref_inuse']             = '此檔案無法刪除,因以下頁面正在使用它:';
+$lang['ref_hidden']            = '一些參考內容位於您沒有讀取權限的頁面中';
+$lang['hits']                  = '個符合';
+$lang['quickhits']             = '符合的頁面名稱';
+$lang['toc']                   = '目錄表';
+$lang['current']               = '目前版本';
+$lang['yours']                 = '您的版本';
+$lang['diff']                  = '顯示與目前版本的差異';
+$lang['diff2']                 = '顯示選擇版本間的差異';
+$lang['difflink']              = '連向這個比對檢視';
+$lang['diff_type']             = '檢視差異:';
+$lang['diff_inline']           = '行內';
+$lang['diff_side']             = '並排';
+$lang['diffprevrev']           = '前次修改
+';
+$lang['diffnextrev']           = '下次修改';
+$lang['difflastrev']           = '最後一次修改
+';
+$lang['line']                  = '行';
+$lang['breadcrumb']            = '足跡:';
+$lang['youarehere']            = '您在這裏:';
+$lang['lastmod']               = '上一次變更:';
+$lang['by']                    = '由';
+$lang['deleted']               = '移除';
+$lang['created']               = '建立';
+$lang['restored']              = '還原成舊版 (%s)';
+$lang['external_edit']         = '外部編輯';
+$lang['summary']               = '編輯摘要';
+$lang['noflash']               = '顯示此內容需要 <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash 附加元件</a>。';
+$lang['download']              = '下載程式碼片段';
+$lang['tools']                 = '工具';
+$lang['user_tools']            = '使用者工具';
+$lang['site_tools']            = '網站工具';
+$lang['page_tools']            = '頁面工具';
+$lang['skip_to_content']       = '跳至內容';
+$lang['sidebar']               = '側欄';
+$lang['mail_newpage']          = '增加的頁面:';
+$lang['mail_changed']          = '變更的頁面:';
+$lang['mail_subscribe_list']   = '分類名稱中變更的頁面:';
+$lang['mail_new_user']         = '新使用者:';
+$lang['mail_upload']           = '已上傳檔案:';
+$lang['changes_type']          = '檢視最近更新類型';
+$lang['pages_changes']         = '頁面';
+$lang['media_changes']         = '多媒體檔案';
+$lang['both_changes']          = '頁面和多媒體檔案';
+$lang['qb_bold']               = '粗體';
+$lang['qb_italic']             = '斜體';
+$lang['qb_underl']             = '底線';
+$lang['qb_code']               = '程式碼';
+$lang['qb_strike']             = '刪除線';
+$lang['qb_h1']                 = 'H1 標題';
+$lang['qb_h2']                 = 'H2 標題';
+$lang['qb_h3']                 = 'H3 標題';
+$lang['qb_h4']                 = 'H4 標題';
+$lang['qb_h5']                 = 'H5 標題';
+$lang['qb_h']                  = '標題';
+$lang['qb_hs']                 = '選擇標題';
+$lang['qb_hplus']              = '較大標題';
+$lang['qb_hminus']             = '較小標題';
+$lang['qb_hequal']             = '同等標題';
+$lang['qb_link']               = '內部連結';
+$lang['qb_extlink']            = '外部連結';
+$lang['qb_hr']                 = '水平線';
+$lang['qb_ol']                 = '有序列表項目';
+$lang['qb_ul']                 = '無序列表項目';
+$lang['qb_media']              = '加入圖片或檔案 (開新視窗)';
+$lang['qb_sig']                = '插入簽名';
+$lang['qb_smileys']            = '表情符號';
+$lang['qb_chars']              = '特殊字元';
+$lang['upperns']               = '前往父分類名稱';
+$lang['metaedit']              = '編輯後設資料';
+$lang['metasaveerr']           = '後設資料無法寫入';
+$lang['metasaveok']            = '後設資料已儲存';
+$lang['img_title']             = '標題:';
+$lang['img_caption']           = '照片說明:';
+$lang['img_date']              = '日期:';
+$lang['img_fname']             = '檔名:';
+$lang['img_fsize']             = '大小:';
+$lang['img_artist']            = '攝影者:';
+$lang['img_copyr']             = '版權:';
+$lang['img_format']            = '格式:';
+$lang['img_camera']            = '相機:';
+$lang['img_keywords']          = '關鍵字:';
+$lang['img_width']             = '寬度:';
+$lang['img_height']            = '高度:';
+$lang['subscr_subscribe_success'] = '已將 %s 加入至 %s 的訂閱列表';
+$lang['subscr_subscribe_error'] = '將 %s 加入至 %s 的訂閱列表時發生錯誤';
+$lang['subscr_subscribe_noaddress'] = '沒有與您登入相關的地址,無法將您加入訂閱列表';
+$lang['subscr_unsubscribe_success'] = '已將 %s 移除自 %s 的訂閱列表';
+$lang['subscr_unsubscribe_error'] = '將 %s 移除自 %s 的訂閱列表時發生錯誤';
+$lang['subscr_already_subscribed'] = '%s 已經獲 %s 訂閱了';
+$lang['subscr_not_subscribed'] = '%s 尚未獲 %s 訂閱';
+$lang['subscr_m_not_subscribed'] = '您尚未訂閱目前的頁面或分類名稱。';
+$lang['subscr_m_new_header']   = '加入訂閱';
+$lang['subscr_m_current_header'] = '目前訂閱';
+$lang['subscr_m_unsubscribe']  = '取消訂閱';
+$lang['subscr_m_subscribe']    = '訂閱';
+$lang['subscr_m_receive']      = '接收';
+$lang['subscr_style_every']    = '每次更改都發送信件';
+$lang['subscr_style_digest']   = '對每個頁面發送更改的摘要信件 (每 %.2f 天)';
+$lang['subscr_style_list']     = '自上次發信以來更改的頁面的列表 (每 %.2f 天)';
+$lang['authtempfail']          = '暫不提供帳號認證。若本狀況持續,請通知本 wiki 管理員。';
+$lang['i_chooselang']          = '選擇您的語系';
+$lang['i_installer']           = 'DokuWiki 安裝工具';
+$lang['i_wikiname']            = '本 wiki 的名稱';
+$lang['i_enableacl']           = '啟用 ACL (建議)';
+$lang['i_superuser']           = '超級使用者';
+$lang['i_problems']            = '安裝程式發現如下的問題。您必須修正它們才能繼續。';
+$lang['i_modified']            = '出於安全考量,本腳本只能用於安裝全新且未修改的 Dokuwiki。
+您可以重新解壓下載的封包或查閱完整的<a href=\"http://dokuwiki.org/install\">Dokuwiki 安裝指南</a>';
+$lang['i_funcna']              = 'PHP 函數 <code>%s</code> 無法使用。也許您的主機供應者基於某些理由停用了它?';
+$lang['i_phpver']              = '您的 PHP 版本 <code>%s</code> 比需要的版本 <code>%s</code> 還低。您必須更新您的PHP。';
+$lang['i_permfail']            = '<code>%s</code> 無法經由 DokuWiki 寫入。您必須修正該目錄的權限!';
+$lang['i_confexists']          = '<code>%s</code> 已經存在';
+$lang['i_writeerr']            = '無法建立 <code>%s</code>。您必須檢查目錄/檔案的權限並手動建立該檔案。';
+$lang['i_badhash']             = '無法辨識或已遭修改的 dokuwiki.php (hash=<code>%s</code>)';
+$lang['i_badval']              = '<code>%s</code> —— 非法或空白的值';
+$lang['i_success']             = '設定已完成。您現在可以刪除 install.php 檔案。繼續到
+<a href="doku.php?id=wiki:welcome">您的新 DokuWiki</a>.';
+$lang['i_failure']             = '寫入設定檔時發生了一些錯誤。您必須在使用<a href="doku.php?id=wiki:welcome">您的新 Dokuwiki</a> 之前手動修正它們。';
+$lang['i_policy']              = '初步的 ACL 政策';
+$lang['i_pol0']                = '開放的 wiki (任何人可讀取、寫入、上傳)';
+$lang['i_pol1']                = '公開的 wiki (任何人可讀取,註冊使用者可寫入與上傳)';
+$lang['i_pol2']                = '封閉的 wiki (只有註冊使用者可讀取、寫入、上傳)';
+$lang['i_allowreg']            = '允許使用者自行註冊';
+$lang['i_retry']               = '重試';
+$lang['i_license']             = '請選擇您想要的內容發佈授權方式:';
+$lang['i_license_none']        = '不要顯示任何關於授權方式的訊息';
+$lang['i_pop_field']           = '請協助我們改進 Dokuwiki:';
+$lang['i_pop_label']           = '每月向 Dokuwiki 開發者發送匿名的使用數據';
+$lang['recent_global']         = '您正在閱讀分類名稱: <b>%s</b> 中的變更。您亦可觀看本 wiki <a href="%s">所有的最近更新</a>。';
+$lang['years']                 = '%d 年前';
+$lang['months']                = '%d 個月前';
+$lang['weeks']                 = '%d 週前';
+$lang['days']                  = '%d 天前';
+$lang['hours']                 = '%d 個小時前';
+$lang['minutes']               = '%d 分鐘前';
+$lang['seconds']               = '%d 秒鐘前';
+$lang['wordblock']             = '無法儲存您的更改,因它含有受阻擋的文字 (垃圾訊息)。';
+$lang['media_uploadtab']       = '上傳';
+$lang['media_searchtab']       = '搜尋';
+$lang['media_file']            = '檔案';
+$lang['media_viewtab']         = '檢視';
+$lang['media_edittab']         = '編輯';
+$lang['media_historytab']      = '歷史紀錄';
+$lang['media_list_thumbs']     = '縮圖';
+$lang['media_list_rows']       = '列表';
+$lang['media_sort_name']       = '名稱';
+$lang['media_sort_date']       = '日期';
+$lang['media_namespaces']      = '選擇分類名稱';
+$lang['media_files']           = '在 %s 中的檔案';
+$lang['media_upload']          = '上傳至 %s';
+$lang['media_search']          = '在 %s 中搜尋';
+$lang['media_view']            = '%s';
+$lang['media_viewold']         = '%s 在 %s';
+$lang['media_edit']            = '編輯 %s';
+$lang['media_history']         = '%s 的歷史紀錄';
+$lang['media_meta_edited']     = '元資料已編輯';
+$lang['media_perm_read']       = '抱歉,您沒有足夠權限讀取檔案。';
+$lang['media_perm_upload']     = '抱歉,您沒有足夠權限上傳檔案。';
+$lang['media_update']          = '上傳新的版本';
+$lang['media_restore']         = '還原這個版本';
+$lang['currentns']             = '目前的命名空間';
+$lang['searchresult']          = '搜尋結果';
+$lang['plainhtml']             = '純 HTML';
+$lang['wikimarkup']            = 'Wiki 語法標記';
+$lang['email_signature_text'] = '本信件由以下 DokuWiki 網站產生
+@DOKUWIKIURL@';
diff --git a/wiki/inc/lang/zh-tw/locked.txt b/wiki/inc/lang/zh-tw/locked.txt
new file mode 100644
index 0000000..819e59e
--- /dev/null
+++ b/wiki/inc/lang/zh-tw/locked.txt
@@ -0,0 +1,3 @@
+====== 頁面鎖定 ======
+
+其他使用者正在編輯本頁,您必須等他完成編輯或等鎖定時間過去。
diff --git a/wiki/inc/lang/zh-tw/login.txt b/wiki/inc/lang/zh-tw/login.txt
new file mode 100644
index 0000000..b82f08a
--- /dev/null
+++ b/wiki/inc/lang/zh-tw/login.txt
@@ -0,0 +1,4 @@
+====== 登入 ======
+
+您尚未登入,請輸入您的使用者名稱和密碼。 另外,瀏覽器需要啟用 cookies 以登入本 wiki。
+
diff --git a/wiki/inc/lang/zh-tw/mailtext.txt b/wiki/inc/lang/zh-tw/mailtext.txt
new file mode 100644
index 0000000..7ffb83e
--- /dev/null
+++ b/wiki/inc/lang/zh-tw/mailtext.txt
@@ -0,0 +1,12 @@
+您的 DokuWiki 有個新增或變動的頁面。詳細資料如下:
+
+日期     : @DATE@
+瀏覽器   : @BROWSER@
+IP 位址   : @IPADDRESS@
+主機名稱 : @HOSTNAME@
+舊版本   : @OLDPAGE@
+新版本   : @NEWPAGE@
+編輯摘要 : @SUMMARY@
+使用者   : @USER@
+
+@DIFF@
diff --git a/wiki/inc/lang/zh-tw/mailwrap.html b/wiki/inc/lang/zh-tw/mailwrap.html
new file mode 100644
index 0000000..d257190
--- /dev/null
+++ b/wiki/inc/lang/zh-tw/mailwrap.html
@@ -0,0 +1,13 @@
+<html>
+<head>
+<title>@TITLE@</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+</head>
+<body>
+
+@HTMLBODY@
+
+<br /><hr />
+<small>@EMAILSIGNATURE@</small>
+</body>
+</html>
\ No newline at end of file
diff --git a/wiki/inc/lang/zh-tw/newpage.txt b/wiki/inc/lang/zh-tw/newpage.txt
new file mode 100644
index 0000000..06ccd3d
--- /dev/null
+++ b/wiki/inc/lang/zh-tw/newpage.txt
@@ -0,0 +1,3 @@
+====== 此主題不存在 ======
+
+您來到了一個未建立頁面的主題。如果權限允許,您可以用 「建立此頁」按鈕建立頁面。 
\ No newline at end of file
diff --git a/wiki/inc/lang/zh-tw/norev.txt b/wiki/inc/lang/zh-tw/norev.txt
new file mode 100644
index 0000000..2a32ba6
--- /dev/null
+++ b/wiki/inc/lang/zh-tw/norev.txt
@@ -0,0 +1,3 @@
+====== 無此版本 ======
+
+該版本的文件不存在。請用「舊版」按鈕檢視該文件所有舊版本清單。
\ No newline at end of file
diff --git a/wiki/inc/lang/zh-tw/password.txt b/wiki/inc/lang/zh-tw/password.txt
new file mode 100644
index 0000000..9898f24
--- /dev/null
+++ b/wiki/inc/lang/zh-tw/password.txt
@@ -0,0 +1,6 @@
+@FULLNAME@ 您好!
+
+這是您在位於 @DOKUWIKIURL@ 之 @TITLE@ 的使用者資料
+
+帳號 : @LOGIN@
+密碼 : @PASSWORD@
diff --git a/wiki/inc/lang/zh-tw/preview.txt b/wiki/inc/lang/zh-tw/preview.txt
new file mode 100644
index 0000000..95d4b10
--- /dev/null
+++ b/wiki/inc/lang/zh-tw/preview.txt
@@ -0,0 +1,4 @@
+====== 預覽 ======
+
+以下是該文件的預覽。請記住:**您還未儲存它**!
+
diff --git a/wiki/inc/lang/zh-tw/pwconfirm.txt b/wiki/inc/lang/zh-tw/pwconfirm.txt
new file mode 100644
index 0000000..93ed569
--- /dev/null
+++ b/wiki/inc/lang/zh-tw/pwconfirm.txt
@@ -0,0 +1,9 @@
+@FULLNAME@ 您好!
+
+感謝您在 @TITLE@ ( @DOKUWIKIURL@ ) 註冊了使用者帳號。我們收到請求,希望能允許此帳號使用新密碼。
+
+如果您沒有發送此請求,請忽略這封郵件。
+
+若您真的要使用新密碼,請拜訪以下的連結。
+
+@CONFIRM@
diff --git a/wiki/inc/lang/zh-tw/read.txt b/wiki/inc/lang/zh-tw/read.txt
new file mode 100644
index 0000000..4a472cd
--- /dev/null
+++ b/wiki/inc/lang/zh-tw/read.txt
@@ -0,0 +1 @@
+本頁是唯讀的,您可以看到原始碼,但不能更動它。您如果覺得它不應被鎖上,請詢問管理員。
\ No newline at end of file
diff --git a/wiki/inc/lang/zh-tw/recent.txt b/wiki/inc/lang/zh-tw/recent.txt
new file mode 100644
index 0000000..2831429
--- /dev/null
+++ b/wiki/inc/lang/zh-tw/recent.txt
@@ -0,0 +1,5 @@
+====== 最近更新 ======
+
+以下的頁面是最近才更新的:
+
+
diff --git a/wiki/inc/lang/zh-tw/register.txt b/wiki/inc/lang/zh-tw/register.txt
new file mode 100644
index 0000000..6f2a75c
--- /dev/null
+++ b/wiki/inc/lang/zh-tw/register.txt
@@ -0,0 +1,3 @@
+====== 註冊新使用者 ======
+
+若要註冊本 wiki 的帳號,請填寫下列資料。請確定您提供的是**合法的電郵地址**。如果您不必填寫密碼,系統就會為您自動產生登入密碼,並寄送到該電郵地址。登入名稱須符合正確[[doku>pagename|頁面名稱]]之條件。
diff --git a/wiki/inc/lang/zh-tw/registermail.txt b/wiki/inc/lang/zh-tw/registermail.txt
new file mode 100644
index 0000000..22b7ff8
--- /dev/null
+++ b/wiki/inc/lang/zh-tw/registermail.txt
@@ -0,0 +1,10 @@
+有新的使用者註冊。詳細資料如下:
+
+帳號     : @NEWUSER@
+姓名     : @NEWNAME@
+電郵   : @NEWEMAIL@
+
+日期     : @DATE@
+瀏覽器   : @BROWSER@
+IP 位址   : @IPADDRESS@
+主機名稱 : @HOSTNAME@
diff --git a/wiki/inc/lang/zh-tw/resendpwd.txt b/wiki/inc/lang/zh-tw/resendpwd.txt
new file mode 100644
index 0000000..46078a3
--- /dev/null
+++ b/wiki/inc/lang/zh-tw/resendpwd.txt
@@ -0,0 +1,3 @@
+====== 寄送新密碼 ======
+
+請在以下欄位輸入您的帳號,新密碼將會寄送到您註冊時填寫的電郵地址。
\ No newline at end of file
diff --git a/wiki/inc/lang/zh-tw/resetpwd.txt b/wiki/inc/lang/zh-tw/resetpwd.txt
new file mode 100644
index 0000000..ef0bff2
--- /dev/null
+++ b/wiki/inc/lang/zh-tw/resetpwd.txt
@@ -0,0 +1,3 @@
+====== 設定新密碼 ======
+
+請為您的帳號輸入新密碼。
\ No newline at end of file
diff --git a/wiki/inc/lang/zh-tw/revisions.txt b/wiki/inc/lang/zh-tw/revisions.txt
new file mode 100644
index 0000000..64daa99
--- /dev/null
+++ b/wiki/inc/lang/zh-tw/revisions.txt
@@ -0,0 +1,3 @@
+====== 舊版 ======
+
+以下是該文件的舊版本。如要還原成某個舊版次,就點下它,然後按「編輯本頁」,並存檔起來就可以了。
\ No newline at end of file
diff --git a/wiki/inc/lang/zh-tw/searchpage.txt b/wiki/inc/lang/zh-tw/searchpage.txt
new file mode 100644
index 0000000..9e2c13a
--- /dev/null
+++ b/wiki/inc/lang/zh-tw/searchpage.txt
@@ -0,0 +1,4 @@
+====== 搜尋精靈 ======
+
+提示:您可以在下面找到您的搜尋結果。@CREATEPAGEINFO@
+
diff --git a/wiki/inc/lang/zh-tw/showrev.txt b/wiki/inc/lang/zh-tw/showrev.txt
new file mode 100644
index 0000000..306aa6e
--- /dev/null
+++ b/wiki/inc/lang/zh-tw/showrev.txt
@@ -0,0 +1,2 @@
+**這是本文件的舊版!**
+----
diff --git a/wiki/inc/lang/zh-tw/stopwords.txt b/wiki/inc/lang/zh-tw/stopwords.txt
new file mode 100644
index 0000000..e549250
--- /dev/null
+++ b/wiki/inc/lang/zh-tw/stopwords.txt
@@ -0,0 +1,31 @@
+# 本清單列出製作索引檔 (index) 時不要列入的關鍵字,格式為每字 (詞) 佔一行。
+# 在修改本清單時,請注意要用 UNIX 格式的換行符號 (newline) 處理,而非 DOS 的 CR-LR 。
+# (如果在 MS Windows 環境使用的話,可使用 vim win32 版、 UltraEdit 或其他類似編輯器修改。)
+#
+# 還有,不必把小於 3 個字元 (英數字元) 都包括進來。
+# 目前本清單的內容是以 http://www.ranks.nl/stopwords/ 為基礎,發展而成的。
+about
+are
+and
+you
+your
+them
+their
+com
+for
+from
+into
+how
+that
+the
+this
+was
+what
+when
+where
+who
+will
+with
+und
+the
+www
diff --git a/wiki/inc/lang/zh-tw/subscr_digest.txt b/wiki/inc/lang/zh-tw/subscr_digest.txt
new file mode 100644
index 0000000..2ab0bc0
--- /dev/null
+++ b/wiki/inc/lang/zh-tw/subscr_digest.txt
@@ -0,0 +1,15 @@
+您好!
+
+本 wiki ( @TITLE@ ) 的頁面 @PAGE@ 已更改。
+更改內容如下:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+舊版本:@OLDPAGE@
+新版本:@NEWPAGE@
+
+要取消頁面提醒,請登入本 wiki @DOKUWIKIURL@
+然後拜訪 @SUBSCRIBE@
+並取消訂閱頁面或分類名稱的更改。
diff --git a/wiki/inc/lang/zh-tw/subscr_form.txt b/wiki/inc/lang/zh-tw/subscr_form.txt
new file mode 100644
index 0000000..ba3f161
--- /dev/null
+++ b/wiki/inc/lang/zh-tw/subscr_form.txt
@@ -0,0 +1,3 @@
+====== 訂閱管理 ======
+
+在此頁裏,您可以管理在目前頁面及分類名稱之訂閱。
\ No newline at end of file
diff --git a/wiki/inc/lang/zh-tw/subscr_list.txt b/wiki/inc/lang/zh-tw/subscr_list.txt
new file mode 100644
index 0000000..8cbb24c
--- /dev/null
+++ b/wiki/inc/lang/zh-tw/subscr_list.txt
@@ -0,0 +1,12 @@
+您好!
+
+本 wiki ( @TITLE@ ) 的 @PAGE@ 分類名稱頁面已更改。
+更改內容如下:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+要取消頁面提醒,請登入本 wiki @DOKUWIKIURL@
+然後拜訪 @SUBSCRIBE@
+並取消訂閱頁面或分類名稱的更改。
diff --git a/wiki/inc/lang/zh-tw/subscr_single.txt b/wiki/inc/lang/zh-tw/subscr_single.txt
new file mode 100644
index 0000000..db9ed2d
--- /dev/null
+++ b/wiki/inc/lang/zh-tw/subscr_single.txt
@@ -0,0 +1,18 @@
+您好!
+
+本 wiki ( @TITLE@ ) 的頁面 @PAGE@ 已更改。
+更改內容如下:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+時間     : @DATE@
+使用者   : @USER@
+編輯摘要 : @SUMMARY@
+舊版本   : @OLDPAGE@
+新版本   : @NEWPAGE@
+
+要取消頁面提醒,請登入本 wiki @DOKUWIKIURL@
+然後拜訪 @NEWPAGE@
+並取消訂閱頁面或分類名稱的更改。
diff --git a/wiki/inc/lang/zh-tw/updateprofile.txt b/wiki/inc/lang/zh-tw/updateprofile.txt
new file mode 100644
index 0000000..a7a2ad8
--- /dev/null
+++ b/wiki/inc/lang/zh-tw/updateprofile.txt
@@ -0,0 +1,3 @@
+====== 更新個人資料 ======
+
+您只需修改想更新的欄位就好,帳號名稱不能變更。
\ No newline at end of file
diff --git a/wiki/inc/lang/zh-tw/uploadmail.txt b/wiki/inc/lang/zh-tw/uploadmail.txt
new file mode 100644
index 0000000..9572681
--- /dev/null
+++ b/wiki/inc/lang/zh-tw/uploadmail.txt
@@ -0,0 +1,10 @@
+有人把檔案上傳到您的 DokuWiki。詳細資料如下:
+
+檔名     : @MEDIA@
+日期     : @DATE@
+瀏覽器   : @BROWSER@
+IP 位址   : @IPADDRESS@
+主機名稱 : @HOSTNAME@
+大小     : @SIZE@
+MIME類型 : @MIME@
+使用者   : @USER@
diff --git a/wiki/inc/lang/zh/admin.txt b/wiki/inc/lang/zh/admin.txt
new file mode 100644
index 0000000..bf6476e
--- /dev/null
+++ b/wiki/inc/lang/zh/admin.txt
@@ -0,0 +1,3 @@
+====== 管理 ======
+
+在下面您能找到 DokuWiki 中可用管理任务的列表。
\ No newline at end of file
diff --git a/wiki/inc/lang/zh/adminplugins.txt b/wiki/inc/lang/zh/adminplugins.txt
new file mode 100644
index 0000000..66cee45
--- /dev/null
+++ b/wiki/inc/lang/zh/adminplugins.txt
@@ -0,0 +1 @@
+===== 附加插件 =====
\ No newline at end of file
diff --git a/wiki/inc/lang/zh/backlinks.txt b/wiki/inc/lang/zh/backlinks.txt
new file mode 100644
index 0000000..19e3fee
--- /dev/null
+++ b/wiki/inc/lang/zh/backlinks.txt
@@ -0,0 +1,3 @@
+====== 反向链接 ======
+
+这里是能够反向链接到当前页面的其他页面列表。
\ No newline at end of file
diff --git a/wiki/inc/lang/zh/conflict.txt b/wiki/inc/lang/zh/conflict.txt
new file mode 100644
index 0000000..92eedf4
--- /dev/null
+++ b/wiki/inc/lang/zh/conflict.txt
@@ -0,0 +1,5 @@
+====== 存在一个更新的版本 ======
+
+您编辑的文档存在一个更新的版本。这种情况的发生是因为在您编辑时有另一个用户更改了该文档。
+
+请仔细检查下面列出的差别,并决定保留哪个版本。如果您选择“保存”,您的版本将被保留。点击“取消”将保留当前版本。
diff --git a/wiki/inc/lang/zh/denied.txt b/wiki/inc/lang/zh/denied.txt
new file mode 100644
index 0000000..94721e4
--- /dev/null
+++ b/wiki/inc/lang/zh/denied.txt
@@ -0,0 +1,4 @@
+====== 拒绝授权 ======
+
+对不起,您没有足够权限,无法继续。
+
diff --git a/wiki/inc/lang/zh/diff.txt b/wiki/inc/lang/zh/diff.txt
new file mode 100644
index 0000000..19e8ef7
--- /dev/null
+++ b/wiki/inc/lang/zh/diff.txt
@@ -0,0 +1,3 @@
+====== 差别 ======
+
+这里会显示出您选择的修订版和当前版本之间的差别。
\ No newline at end of file
diff --git a/wiki/inc/lang/zh/draft.txt b/wiki/inc/lang/zh/draft.txt
new file mode 100644
index 0000000..615cb07
--- /dev/null
+++ b/wiki/inc/lang/zh/draft.txt
@@ -0,0 +1,7 @@
+====== 发现草稿 ======
+
+您在本页最后的编辑过程没有正常结束。DokuWiki 在您的编辑过程中自动保存了一份草稿,您现在可以使用它继续编辑。 下面是最后编辑时的数据。
+
+请决定您希望 //恢复// 您丢失的编辑数据,//删除// 自动保存的草稿,或者 //取消// 本编辑过程。
+
+
diff --git a/wiki/inc/lang/zh/edit.txt b/wiki/inc/lang/zh/edit.txt
new file mode 100644
index 0000000..846e898
--- /dev/null
+++ b/wiki/inc/lang/zh/edit.txt
@@ -0,0 +1 @@
+编辑本页后请点击“保存”。请参阅 [[wiki:syntax]] 了解维基语法。只有在您能 **改进** 该页面的前提下才编辑它。如果您想尝试一些东西,请先到 [[playground:playground|playground]] 热身。
\ No newline at end of file
diff --git a/wiki/inc/lang/zh/editrev.txt b/wiki/inc/lang/zh/editrev.txt
new file mode 100644
index 0000000..82013cb
--- /dev/null
+++ b/wiki/inc/lang/zh/editrev.txt
@@ -0,0 +1,2 @@
+**您载入了该文档旧的修订版!** 如果您保存了它,您就会用这些数据创建一份新的修订版。
+----
\ No newline at end of file
diff --git a/wiki/inc/lang/zh/index.txt b/wiki/inc/lang/zh/index.txt
new file mode 100644
index 0000000..efb07b9
--- /dev/null
+++ b/wiki/inc/lang/zh/index.txt
@@ -0,0 +1,3 @@
+====== 索引 ======
+
+这是根据 [[doku>namespaces|命名空间]] 排列的所有可访问页面的索引。
\ No newline at end of file
diff --git a/wiki/inc/lang/zh/install.html b/wiki/inc/lang/zh/install.html
new file mode 100644
index 0000000..448f6bd
--- /dev/null
+++ b/wiki/inc/lang/zh/install.html
@@ -0,0 +1,8 @@
+<p>本页面旨在帮助您完成第一次安装和配置 <a href="http://dokuwiki.org">Dokuwiki</a>。关于安装工具的更多信息请参阅其 <a href="http://dokuwiki.org/installer">官方文档页面</a>。</p>
+
+<p>DokuWiki 使用普通的文件保存维基页面和其他与这些页面挂钩的信息(例如:图像,搜索索引,修订记录等)。为了能正常运行,DokuWiki <strong>必须</strong> 拥有针对那些路径和文件的写权限。本安装工具不能用于设置这些权限。对权限的操作通常通过命令行或使用您的网络服务提供商的 FTP 或控制面板(例如 cPanel)进行操作。</p>
+
+<p>本安装工具将设置您的 DokuWiki 配置 <abbr title="访问控制列表">ACL</abbr>,它能让管理员登录并使用“管理”功能来安装插件,管理用户,管理访问权限和其他配置设置。它并不是 DokuWiki 正常运行所必须的,但安装之后它将更方便您的管理。</p>
+
+<p>有经验的用户或有特殊需求的用户请参阅更详细的 <a href="http://dokuwiki.org/install">安装指南</a>
+和 <a href="http://dokuwiki.org/config">配置设置</a>。</p>
diff --git a/wiki/inc/lang/zh/jquery.ui.datepicker.js b/wiki/inc/lang/zh/jquery.ui.datepicker.js
new file mode 100644
index 0000000..91f99b4
--- /dev/null
+++ b/wiki/inc/lang/zh/jquery.ui.datepicker.js
@@ -0,0 +1,37 @@
+/* Chinese initialisation for the jQuery UI date picker plugin. */
+/* Written by Cloudream (cloudream@gmail.com). */
+( function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+
+		// AMD. Register as an anonymous module.
+		define( [ "../widgets/datepicker" ], factory );
+	} else {
+
+		// Browser globals
+		factory( jQuery.datepicker );
+	}
+}( function( datepicker ) {
+
+datepicker.regional[ "zh-CN" ] = {
+	closeText: "关闭",
+	prevText: "&#x3C;上月",
+	nextText: "下月&#x3E;",
+	currentText: "今天",
+	monthNames: [ "一月","二月","三月","四月","五月","六月",
+	"七月","八月","九月","十月","十一月","十二月" ],
+	monthNamesShort: [ "一月","二月","三月","四月","五月","六月",
+	"七月","八月","九月","十月","十一月","十二月" ],
+	dayNames: [ "星期日","星期一","星期二","星期三","星期四","星期五","星期六" ],
+	dayNamesShort: [ "周日","周一","周二","周三","周四","周五","周六" ],
+	dayNamesMin: [ "日","一","二","三","四","五","六" ],
+	weekHeader: "周",
+	dateFormat: "yy-mm-dd",
+	firstDay: 1,
+	isRTL: false,
+	showMonthAfterYear: true,
+	yearSuffix: "年" };
+datepicker.setDefaults( datepicker.regional[ "zh-CN" ] );
+
+return datepicker.regional[ "zh-CN" ];
+
+} ) );
diff --git a/wiki/inc/lang/zh/lang.php b/wiki/inc/lang/zh/lang.php
new file mode 100644
index 0000000..3de6a2f
--- /dev/null
+++ b/wiki/inc/lang/zh/lang.php
@@ -0,0 +1,370 @@
+<?php
+
+/**
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author lempel <riverlempel@hotmail.com>
+ * @author ZDYX <zhangduyixiong@gmail.com>
+ * @author http://www.chinese-tools.com/tools/converter-tradsimp.html
+ * @author George Sheraton <guxd@163.com>
+ * @author Simon zhan <simonzhan@21cn.com>
+ * @author ben <ben@livetom.com>
+ * @author lainme <lainme993@gmail.com>
+ * @author caii <zhoucaiqi@gmail.com>
+ * @author Hiphen Lee <jacob.b.leung@gmail.com>
+ * @author Shuo-Ting Jian <shoting@gmail.com>
+ * @author Rachel <rzhang0802@gmail.com>
+ * @author Donald <donaldtcong@gmail.com>
+ * @author Yangyu Huang <yangyu.huang@gmail.com>
+ * @author anjianshi <anjianshi@gmail.com>
+ * @author oott123 <ip.192.168.1.1@qq.com>
+ * @author Cupen <Cupenoruler@foxmail.com>
+ * @author xiqingongzi <Xiqingongzi@Gmail.com>
+ * @author qinghao <qingxianhao@gmail.com>
+ * @author Yuwei Sun <yuwei@hrz.tu-chemnitz.de>
+ * @author Errol <errol@hotmail.com>
+ * @author Garfield <garfield_550@outlook.com>
+ * @author JellyChen <451453325@qq.com>
+ * @author tai <tai_tang@126.com>
+ * @author 高博 <bobnemo1983@gmail.com>
+ * @author hznupeter <qiujiongtao@163.com>
+ * @author kuma <kuma000@qq.com>
+ * @author phy25 <git@phy25.com>
+ */
+$lang['encoding']              = 'utf-8';
+$lang['direction']             = 'ltr';
+$lang['doublequoteopening']    = '“';
+$lang['doublequoteclosing']    = '”';
+$lang['singlequoteopening']    = '‘';
+$lang['singlequoteclosing']    = '’';
+$lang['apostrophe']            = '’';
+$lang['btn_edit']              = '编辑本页';
+$lang['btn_source']            = '显示源文件';
+$lang['btn_show']              = '显示页面';
+$lang['btn_create']            = '创建该页面';
+$lang['btn_search']            = '搜索';
+$lang['btn_save']              = '保存';
+$lang['btn_preview']           = '预览';
+$lang['btn_top']               = '回到顶部';
+$lang['btn_newer']             = '<< 较新的';
+$lang['btn_older']             = '较旧的 >>';
+$lang['btn_revs']              = '修订记录';
+$lang['btn_recent']            = '最近更改';
+$lang['btn_upload']            = '上传';
+$lang['btn_cancel']            = '取消';
+$lang['btn_index']             = '网站地图';
+$lang['btn_secedit']           = '编辑';
+$lang['btn_login']             = '登录';
+$lang['btn_logout']            = '退出';
+$lang['btn_admin']             = '管理';
+$lang['btn_update']            = '更新';
+$lang['btn_delete']            = '删除';
+$lang['btn_back']              = '返回';
+$lang['btn_backlink']          = '反向链接';
+$lang['btn_subscribe']         = '订阅本页更改';
+$lang['btn_profile']           = '更新个人信息';
+$lang['btn_reset']             = '重设';
+$lang['btn_resendpwd']         = '设置新密码';
+$lang['btn_draft']             = '编辑草稿';
+$lang['btn_recover']           = '恢复草稿';
+$lang['btn_draftdel']          = '删除草稿';
+$lang['btn_revert']            = '恢复';
+$lang['btn_register']          = '注册';
+$lang['btn_apply']             = '应用';
+$lang['btn_media']             = '媒体管理器';
+$lang['btn_deleteuser']        = '移除我的账户';
+$lang['btn_img_backto']        = '返回到 %s';
+$lang['btn_mediaManager']      = '在媒体管理器中查看';
+$lang['loggedinas']            = '登录为:';
+$lang['user']                  = '用户名';
+$lang['pass']                  = '密码';
+$lang['newpass']               = '请输入新密码';
+$lang['oldpass']               = '请输入当前密码';
+$lang['passchk']               = '请再输一次';
+$lang['remember']              = '记住我';
+$lang['fullname']              = '全名';
+$lang['email']                 = 'E-Mail';
+$lang['profile']               = '用户信息';
+$lang['badlogin']              = '对不起,用户名或密码错误。';
+$lang['badpassconfirm']        = '对不起,密码错误';
+$lang['minoredit']             = '细微修改';
+$lang['draftdate']             = '草稿自动保存于';
+$lang['nosecedit']             = '在您编辑期间本页刚被他人修改过,局部信息已过期,故载入全页。';
+$lang['regmissing']            = '对不起,您必须填写所有的字段。';
+$lang['reguexists']            = '对不起,该用户名已经存在。';
+$lang['regsuccess']            = '新用户已建立,密码将通过电子邮件发送给您。';
+$lang['regsuccess2']           = '新用户已建立';
+$lang['regfail']               = '用户不能被创建。';
+$lang['regmailfail']           = '发送密码邮件时产生错误。请联系管理员!';
+$lang['regbadmail']            = '您输入的邮件地址有问题——如果您认为这是系统错误,请联系管理员。';
+$lang['regbadpass']            = '您输入的密码与系统产生的不符,请重试。';
+$lang['regpwmail']             = '您的 DokuWiki 密码';
+$lang['reghere']               = '还没有账号?立即注册';
+$lang['profna']                = '本维基不允许修改个人信息';
+$lang['profnochange']          = '没有改动,不进行操作。';
+$lang['profnoempty']           = '不允许使用空的用户名或邮件地址。';
+$lang['profchanged']           = '用户信息更新成功。';
+$lang['profnodelete']          = '这个 wiki 不支持删除用户';
+$lang['profdeleteuser']        = '删除账号';
+$lang['profdeleted']           = '你的用户已经从这个 wiki 中删除';
+$lang['profconfdelete']        = '我希望删除我的账户。<br/>这项操作无法撤销。';
+$lang['profconfdeletemissing'] = '确认框未勾选';
+$lang['proffail']              = '用户设置没有更新。';
+$lang['pwdforget']             = '忘记密码?立即获取新密码';
+$lang['resendna']              = '本维基不支持二次发送密码。';
+$lang['resendpwd']             = '设置新密码用于';
+$lang['resendpwdmissing']      = '对不起,您必须填写所有的区域。';
+$lang['resendpwdnouser']       = '对不起,在我们的用户数据中找不到该用户。';
+$lang['resendpwdbadauth']      = '对不起,该认证码错误。请使用完整的确认链接。';
+$lang['resendpwdconfirm']      = '确认链接已经通过邮件发送给您了。';
+$lang['resendpwdsuccess']      = '您的新密码已经通过邮件发送给您了。';
+$lang['license']               = '除额外注明的地方外,本维基上的内容按下列许可协议发布:';
+$lang['licenseok']             = '当您选择开始编辑本页,即寓示你同意将你贡献的内容按下列许可协议发布:';
+$lang['searchmedia']           = '查找文件名:';
+$lang['searchmedia_in']        = '在%s中查找';
+$lang['txt_upload']            = '选择要上传的文件:';
+$lang['txt_filename']          = '上传并重命名为(可选):';
+$lang['txt_overwrt']           = '覆盖已存在的同名文件';
+$lang['maxuploadsize']         = '上传限制。每个文件 %s';
+$lang['lockedby']              = '目前已被下列人员锁定:';
+$lang['lockexpire']            = '预计锁定解除于:';
+$lang['js']['willexpire']      = '您对本页的独有编辑权将于一分钟之后解除。\n为了防止与其他人的编辑冲突,请使用预览按钮重设计时器。';
+$lang['js']['notsavedyet']     = '未保存的更改将丢失。
+真的要继续?';
+$lang['js']['searchmedia']     = '查找文件';
+$lang['js']['keepopen']        = '选中后不自动关闭窗口';
+$lang['js']['hidedetails']     = '隐藏详细信息';
+$lang['js']['mediatitle']      = '链接设置';
+$lang['js']['mediadisplay']    = '链接类型';
+$lang['js']['mediaalign']      = '对齐';
+$lang['js']['mediasize']       = '图片大小';
+$lang['js']['mediatarget']     = '链接目标';
+$lang['js']['mediaclose']      = '关闭';
+$lang['js']['mediainsert']     = '插入';
+$lang['js']['mediadisplayimg'] = '显示图片。';
+$lang['js']['mediadisplaylnk'] = '仅显示链接。';
+$lang['js']['mediasmall']      = '小尺寸';
+$lang['js']['mediamedium']     = '中等尺寸';
+$lang['js']['medialarge']      = '大尺寸';
+$lang['js']['mediaoriginal']   = '原始版本';
+$lang['js']['medialnk']        = '到详细页面的链接';
+$lang['js']['mediadirect']     = '到原始文件的直接链接';
+$lang['js']['medianolnk']      = '没有链接';
+$lang['js']['medianolink']     = '不要链接图片';
+$lang['js']['medialeft']       = '左对齐图片。';
+$lang['js']['mediaright']      = '右对齐图片。';
+$lang['js']['mediacenter']     = '居中对齐图片。';
+$lang['js']['medianoalign']    = '不使用对齐。';
+$lang['js']['nosmblinks']      = '连接到 Windows 共享功能只有在 IE 浏览器中才能正常使用。
+但您仍能复制并粘贴该链接。';
+$lang['js']['linkwiz']         = '链接向导';
+$lang['js']['linkto']          = '链接到:';
+$lang['js']['del_confirm']     = '真的要删除选中的项目吗?';
+$lang['js']['restore_confirm'] = '确实要恢复这个版本么?';
+$lang['js']['media_diff']      = '查看差异:';
+$lang['js']['media_diff_both'] = '肩并肩';
+$lang['js']['media_diff_opacity'] = '叠加';
+$lang['js']['media_diff_portions'] = '滑块';
+$lang['js']['media_select']    = '选择文件……';
+$lang['js']['media_upload_btn'] = '上传';
+$lang['js']['media_done_btn']  = '完成';
+$lang['js']['media_drop']      = '拖拽文件到此处来上传';
+$lang['js']['media_cancel']    = '删除';
+$lang['js']['media_overwrt']   = '覆盖已存在的文件';
+$lang['rssfailed']             = '获取该 RSS 信息时产生错误:';
+$lang['nothingfound']          = '什么都没有找到。';
+$lang['mediaselect']           = '媒体文件';
+$lang['uploadsucc']            = '上传成功';
+$lang['uploadfail']            = '上传失败。也许是上传权限错误。';
+$lang['uploadwrong']           = '上传失败。该扩展名被禁止。';
+$lang['uploadexist']           = '文件已存在。不进行操作。';
+$lang['uploadbadcontent']      = '上传的文件与扩展名 %s 不符。';
+$lang['uploadspam']            = '上传操作被垃圾信息黑名单阻止。';
+$lang['uploadxss']             = '上传操作因可能存在恶意内容而被阻止。';
+$lang['uploadsize']            = '上传的文件过大。(最大 %s)';
+$lang['deletesucc']            = '文件“%s”已经被删除。';
+$lang['deletefail']            = '无法删除“%s”- 请检查权限。';
+$lang['mediainuse']            = '文件“%s”无法删除 - 它正被使用中。';
+$lang['namespaces']            = '命名空间';
+$lang['mediafiles']            = '可用的文件';
+$lang['accessdenied']          = '您没有权限浏览此页面。';
+$lang['mediausage']            = '使用下列字符链接到该文件:';
+$lang['mediaview']             = '查看该文件';
+$lang['mediaroot']             = '根目录';
+$lang['mediaupload']           = '上传文件至当前的命名空间。要创建次级命名空间,将其名称加在“上传并重命名为”文件名的前面,并用英文冒号隔开';
+$lang['mediaextchange']        = '文件的扩展名由 .%s 改为了 .%s!';
+$lang['reference']             = '相关的';
+$lang['ref_inuse']             = '该文件无法删除,因为它正被下列页面使用:';
+$lang['ref_hidden']            = '一些相关的页面您并没有权限阅读';
+$lang['hits']                  = '符合';
+$lang['quickhits']             = '匹配的页面名称';
+$lang['toc']                   = '目录';
+$lang['current']               = '当前版本';
+$lang['yours']                 = '您的版本';
+$lang['diff']                  = '显示与当前版本的差别';
+$lang['diff2']                 = '显示跟目前版本的差异';
+$lang['difflink']              = '到此差别页面的链接';
+$lang['diff_type']             = '查看差异:';
+$lang['diff_inline']           = '行内显示';
+$lang['diff_side']             = '并排显示';
+$lang['diffprevrev']           = '前一修订版';
+$lang['diffnextrev']           = '后一修订版';
+$lang['difflastrev']           = '上一修订版';
+$lang['diffbothprevrev']       = '两侧同时换到之前的修订记录';
+$lang['diffbothnextrev']       = '两侧同时换到之后的修订记录';
+$lang['line']                  = '行';
+$lang['breadcrumb']            = '您的足迹:';
+$lang['youarehere']            = '您在这里:';
+$lang['lastmod']               = '最后更改:';
+$lang['by']                    = '由';
+$lang['deleted']               = '移除';
+$lang['created']               = '创建';
+$lang['restored']              = '已恢复为旧版 (%s)';
+$lang['external_edit']         = '外部编辑';
+$lang['summary']               = '编辑摘要';
+$lang['noflash']               = '需要 <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash 插件</a> 来播放本内容。 ';
+$lang['download']              = '下载片段';
+$lang['tools']                 = '工具';
+$lang['user_tools']            = '用户工具';
+$lang['site_tools']            = '站点工具';
+$lang['page_tools']            = '页面工具';
+$lang['skip_to_content']       = '跳至内容';
+$lang['sidebar']               = '侧边栏';
+$lang['mail_newpage']          = '添加页面:';
+$lang['mail_changed']          = '更改页面:';
+$lang['mail_subscribe_list']   = '命名空间中改变的页面:';
+$lang['mail_new_user']         = '新用户:';
+$lang['mail_upload']           = '已上传的文件:';
+$lang['changes_type']          = '查看何种更改';
+$lang['pages_changes']         = '页面';
+$lang['media_changes']         = '媒体文件';
+$lang['both_changes']          = '页面和媒体文件';
+$lang['qb_bold']               = '粗体';
+$lang['qb_italic']             = '斜体';
+$lang['qb_underl']             = '下划线';
+$lang['qb_code']               = '代码';
+$lang['qb_strike']             = '删除线';
+$lang['qb_h1']                 = '标题 H1';
+$lang['qb_h2']                 = '标题 H2 ';
+$lang['qb_h3']                 = '标题 H3';
+$lang['qb_h4']                 = '标题 H4';
+$lang['qb_h5']                 = '标题 H5';
+$lang['qb_h']                  = '标题';
+$lang['qb_hs']                 = '选择标题';
+$lang['qb_hplus']              = '上级标题';
+$lang['qb_hminus']             = '下级标题';
+$lang['qb_hequal']             = '同级标题';
+$lang['qb_link']               = '内部链接';
+$lang['qb_extlink']            = '外部链接';
+$lang['qb_hr']                 = '水平线';
+$lang['qb_ol']                 = '数字列表项目';
+$lang['qb_ul']                 = '普通列表项目';
+$lang['qb_media']              = '插入图像或其他文件';
+$lang['qb_sig']                = '插入签名';
+$lang['qb_smileys']            = '表情符号';
+$lang['qb_chars']              = '特殊字符';
+$lang['upperns']               = '跳转到父级名空间';
+$lang['metaedit']              = '编辑元数据';
+$lang['metasaveerr']           = '写入元数据失败';
+$lang['metasaveok']            = '元数据已保存';
+$lang['img_title']             = '标题:';
+$lang['img_caption']           = '说明:';
+$lang['img_date']              = '日期:';
+$lang['img_fname']             = '名称:';
+$lang['img_fsize']             = '大小:';
+$lang['img_artist']            = '摄影师:';
+$lang['img_copyr']             = '版权:';
+$lang['img_format']            = '格式:';
+$lang['img_camera']            = '相机:';
+$lang['img_keywords']          = '关键字:';
+$lang['img_width']             = '宽度:';
+$lang['img_height']            = '高度:';
+$lang['subscr_subscribe_success'] = '添加 %s 到 %s 的订阅列表';
+$lang['subscr_subscribe_error'] = '添加 %s 到 %s 的订阅列表中出现错误';
+$lang['subscr_subscribe_noaddress'] = '没有与您登录信息相关联的地址,您无法被添加到订阅列表';
+$lang['subscr_unsubscribe_success'] = '%s 被移出 %s 的订阅列表';
+$lang['subscr_unsubscribe_error'] = '%s 被移出 %s 的订阅列表中出现错误';
+$lang['subscr_already_subscribed'] = '%s 已经订阅了 %s';
+$lang['subscr_not_subscribed'] = '%s 没有订阅 %s';
+$lang['subscr_m_not_subscribed'] = '您现在没有订阅当前页面或者命名空间。';
+$lang['subscr_m_new_header']   = '添加订阅';
+$lang['subscr_m_current_header'] = '当前订阅';
+$lang['subscr_m_unsubscribe']  = '退订';
+$lang['subscr_m_subscribe']    = '订阅';
+$lang['subscr_m_receive']      = '接收';
+$lang['subscr_style_every']    = '对每次更改发送邮件';
+$lang['subscr_style_digest']   = '对每个页面发送更改的摘要邮件(每 %.2f 天)';
+$lang['subscr_style_list']     = '自上封邮件以来更改的页面的列表(每 %.2f 天)';
+$lang['authtempfail']          = '用户认证暂时无法使用。如果该状态一直存在,请通知维基管理员。';
+$lang['i_chooselang']          = '选择您的语言';
+$lang['i_installer']           = 'DokuWiki 安装工具';
+$lang['i_wikiname']            = '维基名称';
+$lang['i_enableacl']           = '启用 ACL(推荐)';
+$lang['i_superuser']           = '超级用户';
+$lang['i_problems']            = '安装工具发现一些问题,已在下面列出。您必须先修复这些问题,才能继续安装。';
+$lang['i_modified']            = '由于安全上的考虑,该脚本只能用于全新且做任何改动的 DokuWiki 安装包。
+                         您可以重新解压下载的程序包,或查阅完整的
+                         <a href="http://dokuwiki.org/install">Dokuwiki 安装指南</a>';
+$lang['i_funcna']              = 'PHP 功能 <code>%s</code> 无法使用。也许您的服务器提供商因为某些原因禁用了它。';
+$lang['i_phpver']              = '您的 PHP 版本 <code>%s</code> 低于最低要求的 <code>%s</code>。您需要升级您的 PHP 版本。';
+$lang['i_mbfuncoverload']      = '为了运行DokuWiki,您必须在php.ini中禁用mbstring.func_overload。';
+$lang['i_permfail']            = 'DokuWiki 无法写入 <code>%s</code>。您需要修改该路径的权限设定!';
+$lang['i_confexists']          = '<code>%s</code> 已经存在';
+$lang['i_writeerr']            = '无法创建 <code>%s</code>。您需要检查该路径/文件的权限设定并手动创建该文件。';
+$lang['i_badhash']             = '无法识别的或被修改的 dokuwiki.php(值=<code>%s</code>)';
+$lang['i_badval']              = '<code>%s</code> - 非法或空值';
+$lang['i_success']             = '配置成功完成。您现在可以删除 install.php 了。继续进入
+                        <a href="doku.php?id=wiki:welcome">您全新的 DokuWiki</a>。';
+$lang['i_failure']             = '写入配置文件的时候产生一些错误。在使用 <a href="doku.php?id=wiki:welcome">您全新安装的 DokuWiki</a> 前
+                         您需要手动修复它们。';
+$lang['i_policy']              = '初始的 ACL 政策';
+$lang['i_pol0']                = '开放的维基(任何人都有读、写、上传的权限)';
+$lang['i_pol1']                = '公共的维基(任何人都有读的权限,只有注册用户才有写和上传的权限)';
+$lang['i_pol2']                = '关闭的维基(只有注册用户才有读、写、上传的权限)';
+$lang['i_allowreg']            = '允许用户自行注册';
+$lang['i_retry']               = '重试';
+$lang['i_license']             = '请选择您希望的内容发布许可协议:';
+$lang['i_license_none']        = '不要显示任何许可协议信息';
+$lang['i_pop_field']           = '请帮助我们改进 DokuWiki 的体验:';
+$lang['i_pop_label']           = '每个月向 DokuWiki 开发者发送匿名的使用数据';
+$lang['recent_global']         = '您当前看到的是<b>%s</b> 名称空间的变动。你还可以在<a href="%s">查看整个维基的近期变动</a>。';
+$lang['years']                 = '%d年前';
+$lang['months']                = '%d月前';
+$lang['weeks']                 = '%d周前';
+$lang['days']                  = '%d天前';
+$lang['hours']                 = '%d小时前';
+$lang['minutes']               = '%d分钟前';
+$lang['seconds']               = '%d秒前';
+$lang['wordblock']             = '您的更改没有被保存,因为它包含被屏蔽的文字(垃圾信息)。';
+$lang['media_uploadtab']       = '上传';
+$lang['media_searchtab']       = '搜索';
+$lang['media_file']            = '文件';
+$lang['media_viewtab']         = '查看';
+$lang['media_edittab']         = '编辑';
+$lang['media_historytab']      = '历史';
+$lang['media_list_thumbs']     = '缩图';
+$lang['media_list_rows']       = '列表';
+$lang['media_sort_name']       = '按名称';
+$lang['media_sort_date']       = '按日期';
+$lang['media_namespaces']      = '选择命名空间';
+$lang['media_files']           = '在 %s 中的文件';
+$lang['media_upload']          = '上传到 <strong>%s</strong> 命名空间。';
+$lang['media_search']          = '在 <strong>%s</strong> 命名空间中搜索。';
+$lang['media_view']            = '%s';
+$lang['media_viewold']         = '%s 在 %s';
+$lang['media_edit']            = '编辑 %s';
+$lang['media_history']         = '%s 的历史纪录';
+$lang['media_meta_edited']     = '元数据已编辑';
+$lang['media_perm_read']       = '抱歉,您没有足够权限读取这些文件。';
+$lang['media_perm_upload']     = '抱歉,您没有足够权限来上传文件。';
+$lang['media_update']          = '上传新版本';
+$lang['media_restore']         = '恢复这个版本';
+$lang['media_acl_warning']     = '此列表可能不完全是由ACL限制和隐藏的页面。';
+$lang['currentns']             = '当前命名空间';
+$lang['searchresult']          = '搜索结果';
+$lang['plainhtml']             = '纯HTML';
+$lang['wikimarkup']            = 'Wiki Markup 语言';
+$lang['page_nonexist_rev']     = '页面在 %s 不存在。它曾创建于 <a href="%s">%s</a>。';
+$lang['unable_to_parse_date']  = '无法解析参数 "%s"。';
+$lang['email_signature_text']  = '本邮件由 DokuWiki 自动创建
+@DOKUWIKIURL@';
diff --git a/wiki/inc/lang/zh/locked.txt b/wiki/inc/lang/zh/locked.txt
new file mode 100644
index 0000000..321e4a0
--- /dev/null
+++ b/wiki/inc/lang/zh/locked.txt
@@ -0,0 +1,3 @@
+====== 页面已锁定 ======
+
+本页面目前正被其他用户编辑。您要等到该用户完成编辑或锁定因过期而自动解除后才能编辑。
\ No newline at end of file
diff --git a/wiki/inc/lang/zh/login.txt b/wiki/inc/lang/zh/login.txt
new file mode 100644
index 0000000..8ff8b38
--- /dev/null
+++ b/wiki/inc/lang/zh/login.txt
@@ -0,0 +1,3 @@
+====== 登录 ======
+
+您尚未登录!请在下方输入您的用户名和密码进行登录。 您的浏览器需要支持 Cookies 才能正常登录。
diff --git a/wiki/inc/lang/zh/mailtext.txt b/wiki/inc/lang/zh/mailtext.txt
new file mode 100644
index 0000000..f5e6081
--- /dev/null
+++ b/wiki/inc/lang/zh/mailtext.txt
@@ -0,0 +1,12 @@
+您的 DokuWiki 中有一个页面被添加或更改了。以下是详细资料:
+
+日期        : @DATE@
+浏览器      : @BROWSER@
+IP 地址     : @IPADDRESS@
+机器名称    : @HOSTNAME@
+修订记录    : @OLDPAGE@
+最新修订    : @NEWPAGE@
+编辑摘要    : @SUMMARY@
+用户        : @USER@
+
+@DIFF@
diff --git a/wiki/inc/lang/zh/mailwrap.html b/wiki/inc/lang/zh/mailwrap.html
new file mode 100644
index 0000000..d257190
--- /dev/null
+++ b/wiki/inc/lang/zh/mailwrap.html
@@ -0,0 +1,13 @@
+<html>
+<head>
+<title>@TITLE@</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+</head>
+<body>
+
+@HTMLBODY@
+
+<br /><hr />
+<small>@EMAILSIGNATURE@</small>
+</body>
+</html>
\ No newline at end of file
diff --git a/wiki/inc/lang/zh/newpage.txt b/wiki/inc/lang/zh/newpage.txt
new file mode 100644
index 0000000..6f96b56
--- /dev/null
+++ b/wiki/inc/lang/zh/newpage.txt
@@ -0,0 +1,3 @@
+====== 该主题尚不存在 ======
+
+您访问的页面并不存在。如果允许,您可以使用“创建该页面”按钮来创建它。
\ No newline at end of file
diff --git a/wiki/inc/lang/zh/norev.txt b/wiki/inc/lang/zh/norev.txt
new file mode 100644
index 0000000..3fe5aab
--- /dev/null
+++ b/wiki/inc/lang/zh/norev.txt
@@ -0,0 +1,3 @@
+====== 没有该修订版 ======
+
+您指定的修订版并不存在。请使用“修订记录”按钮查看本页面的修订记录列表。
\ No newline at end of file
diff --git a/wiki/inc/lang/zh/password.txt b/wiki/inc/lang/zh/password.txt
new file mode 100644
index 0000000..39095a1
--- /dev/null
+++ b/wiki/inc/lang/zh/password.txt
@@ -0,0 +1,5 @@
+@FULLNAME@ 您好!
+
+这是您在 @TITLE@(@DOKUWIKIURL@)的用户资料
+用户名:@LOGIN@
+密码:@PASSWORD@
diff --git a/wiki/inc/lang/zh/preview.txt b/wiki/inc/lang/zh/preview.txt
new file mode 100644
index 0000000..dbb3de6
--- /dev/null
+++ b/wiki/inc/lang/zh/preview.txt
@@ -0,0 +1,3 @@
+====== 预览 ======
+
+这是该文件的效果预览。请记住:它**并没有被保存**!
diff --git a/wiki/inc/lang/zh/pwconfirm.txt b/wiki/inc/lang/zh/pwconfirm.txt
new file mode 100644
index 0000000..1b31636
--- /dev/null
+++ b/wiki/inc/lang/zh/pwconfirm.txt
@@ -0,0 +1,9 @@
+@FULLNAME@ 您好!
+
+有人请求为您在 @DOKUWIKIURL@ 注册的用户名 @TITLE@ 发送新密码
+
+如果您没有请求发送新密码,请忽略这封邮件。
+
+为了确认发送新密码请求的确来自您,请使用下面的链接。
+
+@CONFIRM@
diff --git a/wiki/inc/lang/zh/read.txt b/wiki/inc/lang/zh/read.txt
new file mode 100644
index 0000000..eb47765
--- /dev/null
+++ b/wiki/inc/lang/zh/read.txt
@@ -0,0 +1,2 @@
+本页面只读。您可以查看源文件,但不能更改它。如果您觉得这是系统错误,请联系管理员。
+
diff --git a/wiki/inc/lang/zh/recent.txt b/wiki/inc/lang/zh/recent.txt
new file mode 100644
index 0000000..95634d0
--- /dev/null
+++ b/wiki/inc/lang/zh/recent.txt
@@ -0,0 +1,5 @@
+====== 最近更新 ======
+
+以下的页面是最近才更新的:
+
+
diff --git a/wiki/inc/lang/zh/register.txt b/wiki/inc/lang/zh/register.txt
new file mode 100644
index 0000000..7410ff1
--- /dev/null
+++ b/wiki/inc/lang/zh/register.txt
@@ -0,0 +1,3 @@
+====== 注册新用户 ======
+
+填写以下资料来创建一个新帐户。请确定您提供的是 **正确的 E-mail 地址** - 如果您没有被要求在这里输入密码,那么新密码将通过您的邮件地址发送给您。 用于登录的用户名必须合法,请参阅 [[doku>pagename|pagename]]。
diff --git a/wiki/inc/lang/zh/registermail.txt b/wiki/inc/lang/zh/registermail.txt
new file mode 100644
index 0000000..56568dc
--- /dev/null
+++ b/wiki/inc/lang/zh/registermail.txt
@@ -0,0 +1,10 @@
+新用户已创建。下面是详细信息:
+
+用户名      : @NEWUSER@
+全名        : @NEWNAME@
+E-mail      : @NEWEMAIL@
+
+日期        : @DATE@
+浏览器      : @BROWSER@
+IP 地址     : @IPADDRESS@
+机器名称    : @HOSTNAME@
diff --git a/wiki/inc/lang/zh/resendpwd.txt b/wiki/inc/lang/zh/resendpwd.txt
new file mode 100644
index 0000000..f98e469
--- /dev/null
+++ b/wiki/inc/lang/zh/resendpwd.txt
@@ -0,0 +1,5 @@
+====== 发送新密码 ======
+
+请在下列区域中输入您的用户名来获取新密码。 一封包含确认链接的邮件将发送给您注册的邮件地址。
+
+
diff --git a/wiki/inc/lang/zh/resetpwd.txt b/wiki/inc/lang/zh/resetpwd.txt
new file mode 100644
index 0000000..a9d59fd
--- /dev/null
+++ b/wiki/inc/lang/zh/resetpwd.txt
@@ -0,0 +1,3 @@
+====== 设置新密码 ======
+
+请为您在本维基上的账户设置一个新密码。
\ No newline at end of file
diff --git a/wiki/inc/lang/zh/revisions.txt b/wiki/inc/lang/zh/revisions.txt
new file mode 100644
index 0000000..89d2a78
--- /dev/null
+++ b/wiki/inc/lang/zh/revisions.txt
@@ -0,0 +1,3 @@
+====== 修订记录 ======
+
+以下是当前文档的修订记录。如果要回复到某个旧的修订版,请在下面选择它,并点击“编辑本页”,之后保存即可。
\ No newline at end of file
diff --git a/wiki/inc/lang/zh/searchpage.txt b/wiki/inc/lang/zh/searchpage.txt
new file mode 100644
index 0000000..0ea6cb5
--- /dev/null
+++ b/wiki/inc/lang/zh/searchpage.txt
@@ -0,0 +1,4 @@
+====== 搜索 ======
+
+下面将显示您的搜索结果。@CREATEPAGEINFO@
+
diff --git a/wiki/inc/lang/zh/showrev.txt b/wiki/inc/lang/zh/showrev.txt
new file mode 100644
index 0000000..770fecc
--- /dev/null
+++ b/wiki/inc/lang/zh/showrev.txt
@@ -0,0 +1,2 @@
+**这是本文档旧的修订版!**
+----
diff --git a/wiki/inc/lang/zh/stopwords.txt b/wiki/inc/lang/zh/stopwords.txt
new file mode 100644
index 0000000..0a18e46
--- /dev/null
+++ b/wiki/inc/lang/zh/stopwords.txt
@@ -0,0 +1,29 @@
+# 这是一个索引器忽略的单词列表,每行一个单词
+# 这个文件需要使用UNIX行结尾(单换行符)
+# 不需要包括短于3字符的词,这些都会被忽略
+# 这个列表是基于此改进的 http://www.ranks.nl/stopwords/
+about
+are
+and
+you
+your
+them
+their
+com
+for
+from
+into
+how
+that
+the
+this
+was
+what
+when
+where
+who
+will
+with
+und
+the
+www
diff --git a/wiki/inc/lang/zh/subscr_digest.txt b/wiki/inc/lang/zh/subscr_digest.txt
new file mode 100644
index 0000000..53326ae
--- /dev/null
+++ b/wiki/inc/lang/zh/subscr_digest.txt
@@ -0,0 +1,15 @@
+您好!
+
+@TITLE@ 中的页面 @PAGE@ 已经更改。
+这里是更改的内容:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+旧版本:@OLDPAGE@
+新版本:@NEWPAGE@
+
+要取消页面提醒,从 @DOKUWIKIURL@ 登录维基,然后浏览
+@SUBSCRIBE@
+并退订页面以及/或者命名空间的更改。
diff --git a/wiki/inc/lang/zh/subscr_form.txt b/wiki/inc/lang/zh/subscr_form.txt
new file mode 100644
index 0000000..65bfd40
--- /dev/null
+++ b/wiki/inc/lang/zh/subscr_form.txt
@@ -0,0 +1,3 @@
+====== 订阅管理 ======
+
+这个页面允许您管理在当前页面和命名空间的订阅。
\ No newline at end of file
diff --git a/wiki/inc/lang/zh/subscr_list.txt b/wiki/inc/lang/zh/subscr_list.txt
new file mode 100644
index 0000000..79846f6
--- /dev/null
+++ b/wiki/inc/lang/zh/subscr_list.txt
@@ -0,0 +1,12 @@
+您好!
+
+@TITLE@ 中的命名空间 @PAGE@ 的页面已经更改。
+这里是更改的页面:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+要取消页面提醒,从 @DOKUWIKIURL@ 登录维基,然后浏览
+@SUBSCRIBE@
+并退订页面以及/或者命名空间的更改。
diff --git a/wiki/inc/lang/zh/subscr_single.txt b/wiki/inc/lang/zh/subscr_single.txt
new file mode 100644
index 0000000..9c1adc8
--- /dev/null
+++ b/wiki/inc/lang/zh/subscr_single.txt
@@ -0,0 +1,18 @@
+您好!
+
+@TITLE@ 中的页面 @PAGE@ 已经更改。
+这里是更改的内容:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+时间:@DATE@
+用户:@USER@
+编辑摘要:@SUMMARY@
+旧版本:@OLDPAGE@
+新版本:@NEWPAGE@
+
+要取消页面提醒,从 @DOKUWIKIURL@ 登录维基,然后浏览
+@SUBSCRIBE@
+并退订页面以及/或者命名空间的更改。
diff --git a/wiki/inc/lang/zh/updateprofile.txt b/wiki/inc/lang/zh/updateprofile.txt
new file mode 100644
index 0000000..0075788
--- /dev/null
+++ b/wiki/inc/lang/zh/updateprofile.txt
@@ -0,0 +1,5 @@
+====== 更新您帐户的信息 ======
+
+您只需要填写希望更改的区域即可。您不能更改用户名。
+
+
diff --git a/wiki/inc/lang/zh/uploadmail.txt b/wiki/inc/lang/zh/uploadmail.txt
new file mode 100644
index 0000000..a5ce539
--- /dev/null
+++ b/wiki/inc/lang/zh/uploadmail.txt
@@ -0,0 +1,12 @@
+您好!
+
+一个文件被上传到您的 DokuWiki 站点。下面是详细信息:
+
+文件名 : @MEDIA@
+日期 : @DATE@
+浏览器 : @BROWSER@
+IP 地址 : @IPADDRESS@
+主机名 : @HOSTNAME@
+大小 : @SIZE@
+MIME 类型 : @MIME@
+用户 : @USER@
diff --git a/wiki/inc/load.php b/wiki/inc/load.php
new file mode 100644
index 0000000..2131b9d
--- /dev/null
+++ b/wiki/inc/load.php
@@ -0,0 +1,159 @@
+<?php
+/**
+ * Load all internal libraries and setup class autoloader
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+
+// setup class autoloader
+spl_autoload_register('load_autoload');
+
+// require all the common libraries
+// for a few of these order does matter
+require_once(DOKU_INC.'inc/actions.php');
+require_once(DOKU_INC.'inc/changelog.php');
+require_once(DOKU_INC.'inc/common.php');
+require_once(DOKU_INC.'inc/confutils.php');
+require_once(DOKU_INC.'inc/pluginutils.php');
+require_once(DOKU_INC.'inc/events.php');
+require_once(DOKU_INC.'inc/form.php');
+require_once(DOKU_INC.'inc/fulltext.php');
+require_once(DOKU_INC.'inc/html.php');
+require_once(DOKU_INC.'inc/httputils.php');
+require_once(DOKU_INC.'inc/indexer.php');
+require_once(DOKU_INC.'inc/infoutils.php');
+require_once(DOKU_INC.'inc/io.php');
+require_once(DOKU_INC.'inc/mail.php');
+require_once(DOKU_INC.'inc/media.php');
+require_once(DOKU_INC.'inc/pageutils.php');
+require_once(DOKU_INC.'inc/parserutils.php');
+require_once(DOKU_INC.'inc/search.php');
+require_once(DOKU_INC.'inc/subscription.php');
+require_once(DOKU_INC.'inc/template.php');
+require_once(DOKU_INC.'inc/toolbar.php');
+require_once(DOKU_INC.'inc/utf8.php');
+require_once(DOKU_INC.'inc/auth.php');
+require_once(DOKU_INC.'inc/compatibility.php');
+
+/**
+ * spl_autoload_register callback
+ *
+ * Contains a static list of DokuWiki's core classes and automatically
+ * require()s their associated php files when an object is instantiated.
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @todo   add generic loading of renderers and auth backends
+ *
+ * @param string $name
+ *
+ * @return bool
+ */
+function load_autoload($name){
+    static $classes = null;
+    if(is_null($classes)) $classes = array(
+        'DokuHTTPClient'        => DOKU_INC.'inc/HTTPClient.php',
+        'HTTPClient'            => DOKU_INC.'inc/HTTPClient.php',
+        'JSON'                  => DOKU_INC.'inc/JSON.php',
+        'Diff'                  => DOKU_INC.'inc/DifferenceEngine.php',
+        'UnifiedDiffFormatter'  => DOKU_INC.'inc/DifferenceEngine.php',
+        'TableDiffFormatter'    => DOKU_INC.'inc/DifferenceEngine.php',
+        'cache'                 => DOKU_INC.'inc/cache.php',
+        'cache_parser'          => DOKU_INC.'inc/cache.php',
+        'cache_instructions'    => DOKU_INC.'inc/cache.php',
+        'cache_renderer'        => DOKU_INC.'inc/cache.php',
+        'Doku_Event'            => DOKU_INC.'inc/events.php',
+        'Doku_Event_Handler'    => DOKU_INC.'inc/events.php',
+        'Input'                 => DOKU_INC.'inc/Input.class.php',
+        'JpegMeta'              => DOKU_INC.'inc/JpegMeta.php',
+        'SimplePie'             => DOKU_INC.'inc/SimplePie.php',
+        'FeedParser'            => DOKU_INC.'inc/FeedParser.php',
+        'IXR_Server'            => DOKU_INC.'inc/IXR_Library.php',
+        'IXR_Client'            => DOKU_INC.'inc/IXR_Library.php',
+        'IXR_Error'             => DOKU_INC.'inc/IXR_Library.php',
+        'IXR_IntrospectionServer' => DOKU_INC.'inc/IXR_Library.php',
+        'Doku_Plugin_Controller'=> DOKU_INC.'inc/plugincontroller.class.php',
+        'Doku_Parser_Mode'      => DOKU_INC.'inc/parser/parser.php',
+        'Doku_Parser_Mode_Plugin' => DOKU_INC.'inc/parser/parser.php',
+        'SafeFN'                => DOKU_INC.'inc/SafeFN.class.php',
+        'Sitemapper'            => DOKU_INC.'inc/Sitemapper.php',
+        'PassHash'              => DOKU_INC.'inc/PassHash.class.php',
+        'Mailer'                => DOKU_INC.'inc/Mailer.class.php',
+        'RemoteAPI'             => DOKU_INC.'inc/remote.php',
+        'RemoteAPICore'         => DOKU_INC.'inc/RemoteAPICore.php',
+        'Subscription'          => DOKU_INC.'inc/subscription.php',
+
+        'DokuWiki_PluginInterface' => DOKU_INC.'inc/PluginInterface.php',
+        'DokuWiki_PluginTrait'     => DOKU_INC.'inc/PluginTrait.php',
+        'DokuWiki_Plugin'          => DOKU_INC.'inc/Plugin.php',
+
+
+        'DokuWiki_Action_Plugin' => DOKU_PLUGIN.'action.php',
+        'DokuWiki_Admin_Plugin'  => DOKU_PLUGIN.'admin.php',
+        'DokuWiki_Syntax_Plugin' => DOKU_PLUGIN.'syntax.php',
+        'DokuWiki_Remote_Plugin' => DOKU_PLUGIN.'remote.php',
+        'DokuWiki_Auth_Plugin'   => DOKU_PLUGIN.'auth.php',
+        'DokuWiki_CLI_Plugin'    => DOKU_PLUGIN.'cli.php',
+
+        'Doku_Renderer'          => DOKU_INC.'inc/parser/renderer.php',
+        'Doku_Renderer_xhtml'    => DOKU_INC.'inc/parser/xhtml.php',
+        'Doku_Renderer_code'     => DOKU_INC.'inc/parser/code.php',
+        'Doku_Renderer_xhtmlsummary' => DOKU_INC.'inc/parser/xhtmlsummary.php',
+        'Doku_Renderer_metadata' => DOKU_INC.'inc/parser/metadata.php',
+
+        'DokuCLI'                => DOKU_INC.'inc/cli.php',
+        'DokuCLI_Options'        => DOKU_INC.'inc/cli.php',
+        'DokuCLI_Colors'         => DOKU_INC.'inc/cli.php',
+
+    );
+
+    if(isset($classes[$name])){
+        require ($classes[$name]);
+        return true;
+    }
+
+    // namespace to directory conversion
+    $name = str_replace('\\', '/', $name);
+
+    // plugin namespace
+    if(substr($name, 0, 16) == 'dokuwiki/plugin/') {
+        $name = str_replace('/test/', '/_test/', $name); // no underscore in test namespace
+        $file = DOKU_PLUGIN . substr($name, 16) . '.php';
+        if(file_exists($file)) {
+            require $file;
+            return true;
+        }
+    }
+
+    // template namespace
+    if(substr($name, 0, 18) == 'dokuwiki/template/') {
+        $name = str_replace('/test/', '/_test/', $name); // no underscore in test namespace
+        $file = DOKU_INC.'lib/tpl/' . substr($name, 18) . '.php';
+        if(file_exists($file)) {
+            require $file;
+            return true;
+        }
+    }
+
+    // our own namespace
+    if(substr($name, 0, 9) == 'dokuwiki/') {
+        $file = DOKU_INC . 'inc/' . substr($name, 9) . '.php';
+        if(file_exists($file)) {
+            require $file;
+            return true;
+        }
+    }
+
+    // Plugin loading
+    if(preg_match('/^(auth|helper|syntax|action|admin|renderer|remote|cli)_plugin_('.DOKU_PLUGIN_NAME_REGEX.')(?:_([^_]+))?$/',
+                  $name, $m)) {
+        // try to load the wanted plugin file
+        $c = ((count($m) === 4) ? "/{$m[3]}" : '');
+        $plg = DOKU_PLUGIN . "{$m[2]}/{$m[1]}$c.php";
+        if(file_exists($plg)){
+            require $plg;
+        }
+        return true;
+    }
+    return false;
+}
+
diff --git a/wiki/inc/mail.php b/wiki/inc/mail.php
new file mode 100644
index 0000000..f72dbde
--- /dev/null
+++ b/wiki/inc/mail.php
@@ -0,0 +1,348 @@
+<?php
+/**
+ * Mail functions
+ *
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author     Andreas Gohr <andi@splitbrain.org>
+ */
+
+if(!defined('DOKU_INC')) die('meh.');
+
+// end of line for mail lines - RFC822 says CRLF but postfix (and other MTAs?)
+// think different
+if(!defined('MAILHEADER_EOL')) define('MAILHEADER_EOL',"\n");
+#define('MAILHEADER_ASCIIONLY',1);
+
+/**
+ * Patterns for use in email detection and validation
+ *
+ * NOTE: there is an unquoted '/' in RFC2822_ATEXT, it must remain unquoted to be used in the parser
+ * the pattern uses non-capturing groups as captured groups aren't allowed in the parser
+ * select pattern delimiters with care!
+ *
+ * May not be completly RFC conform!
+ * @link http://www.faqs.org/rfcs/rfc2822.html (paras 3.4.1 & 3.2.4)
+ *
+ * @author Chris Smith <chris@jalakai.co.uk>
+ * Check if a given mail address is valid
+ */
+if (!defined('RFC2822_ATEXT')) define('RFC2822_ATEXT',"0-9a-zA-Z!#$%&'*+/=?^_`{|}~-");
+if (!defined('PREG_PATTERN_VALID_EMAIL')) define('PREG_PATTERN_VALID_EMAIL', '['.RFC2822_ATEXT.']+(?:\.['.RFC2822_ATEXT.']+)*@(?i:[0-9a-z][0-9a-z-]*\.)+(?i:[a-z]{2,63})');
+
+/**
+ * Prepare mailfrom replacement patterns
+ *
+ * Also prepares a mailfromnobody config that contains an autoconstructed address
+ * if the mailfrom one is userdependent and this might not be wanted (subscriptions)
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+function mail_setup(){
+    global $conf;
+    global $USERINFO;
+    /** @var Input $INPUT */
+    global $INPUT;
+
+    // auto constructed address
+    $host = @parse_url(DOKU_URL,PHP_URL_HOST);
+    if(!$host) $host = 'example.com';
+    $noreply = 'noreply@'.$host;
+
+    $replace = array();
+    if(!empty($USERINFO['mail'])){
+        $replace['@MAIL@'] = $USERINFO['mail'];
+    }else{
+        $replace['@MAIL@'] = $noreply;
+    }
+
+    // use 'noreply' if no user
+    $replace['@USER@'] = $INPUT->server->str('REMOTE_USER', 'noreply', true);
+
+    if(!empty($USERINFO['name'])){
+        $replace['@NAME@'] = $USERINFO['name'];
+    }else{
+        $replace['@NAME@'] = '';
+    }
+
+    // apply replacements
+    $from = str_replace(array_keys($replace),
+                        array_values($replace),
+                        $conf['mailfrom']);
+
+    // any replacements done? set different mailfromnone
+    if($from != $conf['mailfrom']){
+        $conf['mailfromnobody'] = $noreply;
+    }else{
+        $conf['mailfromnobody'] = $from;
+    }
+    $conf['mailfrom'] = $from;
+}
+
+/**
+ * UTF-8 autoencoding replacement for PHPs mail function
+ *
+ * Email address fields (To, From, Cc, Bcc can contain a textpart and an address
+ * like this: 'Andreas Gohr <andi@splitbrain.org>' - the text part is encoded
+ * automatically. You can seperate receivers by commas.
+ *
+ * @param string $to      Receiver of the mail (multiple seperated by commas)
+ * @param string $subject Mailsubject
+ * @param string $body    Messagebody
+ * @param string $from    Sender address
+ * @param string $cc      CarbonCopy receiver (multiple seperated by commas)
+ * @param string $bcc     BlindCarbonCopy receiver (multiple seperated by commas)
+ * @param string $headers Additional Headers (seperated by MAILHEADER_EOL
+ * @param string $params  Additonal Sendmail params (passed to mail())
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @see    mail()
+ *
+ * @deprecated User the Mailer:: class instead
+ */
+function mail_send($to, $subject, $body, $from='', $cc='', $bcc='', $headers=null, $params=null){
+    dbg_deprecated('class Mailer::');
+    $message = compact('to','subject','body','from','cc','bcc','headers','params');
+    return trigger_event('MAIL_MESSAGE_SEND',$message,'_mail_send_action');
+}
+
+/**
+ * @param $data
+ * @return bool
+ *
+ * @deprecated User the Mailer:: class instead
+ */
+function _mail_send_action($data) {
+    dbg_deprecated('class Mailer::');
+    // retrieve parameters from event data, $to, $subject, $body, $from, $cc, $bcc, $headers, $params
+    $to = $data['to'];
+    $subject = $data['subject'];
+    $body = $data['body'];
+
+    // add robustness in case plugin removes any of these optional values
+    $from = isset($data['from']) ? $data['from'] : '';
+    $cc = isset($data['cc']) ? $data['cc'] : '';
+    $bcc = isset($data['bcc']) ? $data['bcc'] : '';
+    $headers = isset($data['headers']) ? $data['headers'] : null;
+    $params = isset($data['params']) ? $data['params'] : null;
+
+    // discard mail request if no recipients are available
+    if(trim($to) === '' && trim($cc) === '' && trim($bcc) === '') return false;
+
+    // end additional code to support event ... original mail_send() code from here
+
+    if(defined('MAILHEADER_ASCIIONLY')){
+        $subject = utf8_deaccent($subject);
+        $subject = utf8_strip($subject);
+    }
+
+    if(!utf8_isASCII($subject)) {
+        $enc_subj = '=?UTF-8?Q?'.mail_quotedprintable_encode($subject,0).'?=';
+        // Spaces must be encoded according to rfc2047. Use the "_" shorthand
+        $enc_subj = preg_replace('/ /', '_', $enc_subj);
+
+        // quoted printable has length restriction, use base64 if needed
+        if(strlen($subject) > 74){
+            $enc_subj = '=?UTF-8?B?'.base64_encode($subject).'?=';
+        }
+
+        $subject = $enc_subj;
+    }
+
+    $header  = '';
+
+    // No named recipients for To: in Windows (see FS#652)
+    $usenames = (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') ? false : true;
+
+    $to = mail_encode_address($to,'',$usenames);
+    $header .= mail_encode_address($from,'From');
+    $header .= mail_encode_address($cc,'Cc');
+    $header .= mail_encode_address($bcc,'Bcc');
+    $header .= 'MIME-Version: 1.0'.MAILHEADER_EOL;
+    $header .= 'Content-Type: text/plain; charset=UTF-8'.MAILHEADER_EOL;
+    $header .= 'Content-Transfer-Encoding: quoted-printable'.MAILHEADER_EOL;
+    $header .= $headers;
+    $header  = trim($header);
+
+    $body = mail_quotedprintable_encode($body);
+
+    if($params == null){
+        return @mail($to,$subject,$body,$header);
+    }else{
+        return @mail($to,$subject,$body,$header,$params);
+    }
+}
+
+/**
+ * Encodes an email address header
+ *
+ * Unicode characters will be deaccented and encoded
+ * quoted_printable for headers.
+ * Addresses may not contain Non-ASCII data!
+ *
+ * Example:
+ *   mail_encode_address("föö <foo@bar.com>, me@somewhere.com","TBcc");
+ *
+ * @param string  $string Multiple adresses separated by commas
+ * @param string  $header Name of the header (To,Bcc,Cc,...)
+ * @param boolean $names  Allow named Recipients?
+ *
+ * @deprecated User the Mailer:: class instead
+ */
+function mail_encode_address($string,$header='',$names=true){
+    dbg_deprecated('class Mailer::');
+    $headers = '';
+    $parts = explode(',',$string);
+    foreach ($parts as $part){
+        $part = trim($part);
+
+        // parse address
+        if(preg_match('#(.*?)<(.*?)>#',$part,$matches)){
+            $text = trim($matches[1]);
+            $addr = $matches[2];
+        }else{
+            $addr = $part;
+        }
+
+        // skip empty ones
+        if(empty($addr)){
+            continue;
+        }
+
+        // FIXME: is there a way to encode the localpart of a emailaddress?
+        if(!utf8_isASCII($addr)){
+            msg(hsc("E-Mail address <$addr> is not ASCII"),-1);
+            continue;
+        }
+
+        if(!mail_isvalid($addr)){
+            msg(hsc("E-Mail address <$addr> is not valid"),-1);
+            continue;
+        }
+
+        // text was given
+        if(!empty($text) && $names){
+            // add address quotes
+            $addr = "<$addr>";
+
+            if(defined('MAILHEADER_ASCIIONLY')){
+                $text = utf8_deaccent($text);
+                $text = utf8_strip($text);
+            }
+
+            if(!utf8_isASCII($text)){
+                // put the quotes outside as in =?UTF-8?Q?"Elan Ruusam=C3=A4e"?= vs "=?UTF-8?Q?Elan Ruusam=C3=A4e?="
+                if (preg_match('/^"(.+)"$/', $text, $matches)) {
+                    $text = '"=?UTF-8?Q?'.mail_quotedprintable_encode($matches[1], 0).'?="';
+                } else {
+                    $text = '=?UTF-8?Q?'.mail_quotedprintable_encode($text, 0).'?=';
+                }
+                // additionally the space character should be encoded as =20 (or each
+                // word QP encoded separately).
+                // however this is needed only in mail headers, not globally in mail_quotedprintable_encode().
+                $text = str_replace(" ", "=20", $text);
+            }
+        }else{
+            $text = '';
+        }
+
+        // add to header comma seperated
+        if($headers != ''){
+            $headers .= ',';
+            if($header) $headers .= MAILHEADER_EOL.' '; // avoid overlong mail headers
+        }
+        $headers .= $text.' '.$addr;
+    }
+
+    if(empty($headers)) return null;
+
+    //if headername was given add it and close correctly
+    if($header) $headers = $header.': '.$headers.MAILHEADER_EOL;
+
+    return $headers;
+}
+
+/**
+ * Check if a given mail address is valid
+ *
+ * @param   string $email the address to check
+ * @return  bool          true if address is valid
+ */
+function mail_isvalid($email) {
+    return EmailAddressValidator::checkEmailAddress($email, true);
+}
+
+/**
+ * Quoted printable encoding
+ *
+ * @author umu <umuAThrz.tu-chemnitz.de>
+ * @link   http://php.net/manual/en/function.imap-8bit.php#61216
+ *
+ * @param string $sText
+ * @param int $maxlen
+ * @param bool $bEmulate_imap_8bit
+ *
+ * @return string
+ */
+function mail_quotedprintable_encode($sText,$maxlen=74,$bEmulate_imap_8bit=true) {
+    // split text into lines
+    $aLines= preg_split("/(?:\r\n|\r|\n)/", $sText);
+    $cnt = count($aLines);
+
+    for ($i=0;$i<$cnt;$i++) {
+        $sLine =& $aLines[$i];
+        if (strlen($sLine)===0) continue; // do nothing, if empty
+
+        $sRegExp = '/[^\x09\x20\x21-\x3C\x3E-\x7E]/e';
+
+        // imap_8bit encodes x09 everywhere, not only at lineends,
+        // for EBCDIC safeness encode !"#$@[\]^`{|}~,
+        // for complete safeness encode every character :)
+        if ($bEmulate_imap_8bit)
+            $sRegExp = '/[^\x20\x21-\x3C\x3E-\x7E]/';
+
+        $sLine = preg_replace_callback( $sRegExp, 'mail_quotedprintable_encode_callback', $sLine );
+
+        // encode x09,x20 at lineends
+        {
+            $iLength = strlen($sLine);
+            $iLastChar = ord($sLine{$iLength-1});
+
+            //              !!!!!!!!
+            // imap_8_bit does not encode x20 at the very end of a text,
+            // here is, where I don't agree with imap_8_bit,
+            // please correct me, if I'm wrong,
+            // or comment next line for RFC2045 conformance, if you like
+            if (!($bEmulate_imap_8bit && ($i==count($aLines)-1))){
+                if (($iLastChar==0x09)||($iLastChar==0x20)) {
+                    $sLine{$iLength-1}='=';
+                    $sLine .= ($iLastChar==0x09)?'09':'20';
+                }
+            }
+        }    // imap_8bit encodes x20 before chr(13), too
+        // although IMHO not requested by RFC2045, why not do it safer :)
+        // and why not encode any x20 around chr(10) or chr(13)
+        if ($bEmulate_imap_8bit) {
+            $sLine=str_replace(' =0D','=20=0D',$sLine);
+            //$sLine=str_replace(' =0A','=20=0A',$sLine);
+            //$sLine=str_replace('=0D ','=0D=20',$sLine);
+            //$sLine=str_replace('=0A ','=0A=20',$sLine);
+        }
+
+        // finally split into softlines no longer than $maxlen chars,
+        // for even more safeness one could encode x09,x20
+        // at the very first character of the line
+        // and after soft linebreaks, as well,
+        // but this wouldn't be caught by such an easy RegExp
+        if($maxlen){
+            preg_match_all( '/.{1,'.($maxlen - 2).'}([^=]{0,2})?/', $sLine, $aMatch );
+            $sLine = implode( '=' . MAILHEADER_EOL, $aMatch[0] ); // add soft crlf's
+        }
+    }
+
+    // join lines into text
+    return implode(MAILHEADER_EOL,$aLines);
+}
+
+function mail_quotedprintable_encode_callback($matches){
+    return sprintf( "=%02X", ord ( $matches[0] ) ) ;
+}
diff --git a/wiki/inc/media.php b/wiki/inc/media.php
new file mode 100644
index 0000000..1284660
--- /dev/null
+++ b/wiki/inc/media.php
@@ -0,0 +1,2498 @@
+<?php
+/**
+ * All output and handler function needed for the media management popup
+ *
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author     Andreas Gohr <andi@splitbrain.org>
+ */
+
+if(!defined('DOKU_INC')) die('meh.');
+if(!defined('NL')) define('NL',"\n");
+
+/**
+ * Lists pages which currently use a media file selected for deletion
+ *
+ * References uses the same visual as search results and share
+ * their CSS tags except pagenames won't be links.
+ *
+ * @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
+ *
+ * @param array $data
+ * @param string $id
+ */
+function media_filesinuse($data,$id){
+    global $lang;
+    echo '<h1>'.$lang['reference'].' <code>'.hsc(noNS($id)).'</code></h1>';
+    echo '<p>'.hsc($lang['ref_inuse']).'</p>';
+
+    $hidden=0; //count of hits without read permission
+    foreach($data as $row){
+        if(auth_quickaclcheck($row) >= AUTH_READ && isVisiblePage($row)){
+            echo '<div class="search_result">';
+            echo '<span class="mediaref_ref">'.hsc($row).'</span>';
+            echo '</div>';
+        }else
+            $hidden++;
+    }
+    if ($hidden){
+        print '<div class="mediaref_hidden">'.$lang['ref_hidden'].'</div>';
+    }
+}
+
+/**
+ * Handles the saving of image meta data
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @author Kate Arzamastseva <pshns@ukr.net>
+ *
+ * @param string $id media id
+ * @param int $auth permission level
+ * @param array $data
+ * @return false|string
+ */
+function media_metasave($id,$auth,$data){
+    if($auth < AUTH_UPLOAD) return false;
+    if(!checkSecurityToken()) return false;
+    global $lang;
+    global $conf;
+    $src = mediaFN($id);
+
+    $meta = new JpegMeta($src);
+    $meta->_parseAll();
+
+    foreach($data as $key => $val){
+        $val=trim($val);
+        if(empty($val)){
+            $meta->deleteField($key);
+        }else{
+            $meta->setField($key,$val);
+        }
+    }
+
+    $old = @filemtime($src);
+    if(!file_exists(mediaFN($id, $old)) && file_exists($src)) {
+        // add old revision to the attic
+        media_saveOldRevision($id);
+    }
+    $filesize_old = filesize($src);
+    if($meta->save()){
+        if($conf['fperm']) chmod($src, $conf['fperm']);
+        @clearstatcache(true, $src);
+        $new = @filemtime($src);
+        $filesize_new = filesize($src);
+        $sizechange = $filesize_new - $filesize_old;
+
+        // add a log entry to the media changelog
+        addMediaLogEntry($new, $id, DOKU_CHANGE_TYPE_EDIT, $lang['media_meta_edited'], '', null, $sizechange);
+
+        msg($lang['metasaveok'],1);
+        return $id;
+    }else{
+        msg($lang['metasaveerr'],-1);
+        return false;
+    }
+}
+
+/**
+ * check if a media is external source
+ *
+ * @author Gerrit Uitslag <klapinklapin@gmail.com>
+ *
+ * @param string $id the media ID or URL
+ * @return bool
+ */
+function media_isexternal($id){
+    if (preg_match('#^(?:https?|ftp)://#i', $id)) return true;
+    return false;
+}
+
+/**
+ * Check if a media item is public (eg, external URL or readable by @ALL)
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param string $id  the media ID or URL
+ * @return bool
+ */
+function media_ispublic($id){
+    if(media_isexternal($id)) return true;
+    $id = cleanID($id);
+    if(auth_aclcheck(getNS($id).':*', '', array()) >= AUTH_READ) return true;
+    return false;
+}
+
+/**
+ * Display the form to edit image meta data
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @author Kate Arzamastseva <pshns@ukr.net>
+ *
+ * @param string $id media id
+ * @param int $auth permission level
+ * @return bool
+ */
+function media_metaform($id,$auth){
+    global $lang;
+
+    if($auth < AUTH_UPLOAD) {
+        echo '<div class="nothing">'.$lang['media_perm_upload'].'</div>'.NL;
+        return false;
+    }
+
+    // load the field descriptions
+    static $fields = null;
+    if(is_null($fields)){
+        $config_files = getConfigFiles('mediameta');
+        foreach ($config_files as $config_file) {
+            if(file_exists($config_file)) include($config_file);
+        }
+    }
+
+    $src = mediaFN($id);
+
+    // output
+    $form = new Doku_Form(array('action' => media_managerURL(array('tab_details' => 'view'), '&'),
+                                'class' => 'meta'));
+    $form->addHidden('img', $id);
+    $form->addHidden('mediado', 'save');
+    foreach($fields as $key => $field){
+        // get current value
+        if (empty($field[0])) continue;
+        $tags = array($field[0]);
+        if(is_array($field[3])) $tags = array_merge($tags,$field[3]);
+        $value = tpl_img_getTag($tags,'',$src);
+        $value = cleanText($value);
+
+        // prepare attributes
+        $p = array();
+        $p['class'] = 'edit';
+        $p['id']    = 'meta__'.$key;
+        $p['name']  = 'meta['.$field[0].']';
+        $p_attrs    = array('class' => 'edit');
+
+        $form->addElement('<div class="row">');
+        if($field[2] == 'text'){
+            $form->addElement(form_makeField('text', $p['name'], $value, ($lang[$field[1]]) ? $lang[$field[1]] : $field[1] . ':', $p['id'], $p['class'], $p_attrs));
+        }else{
+            $att = buildAttributes($p);
+            $form->addElement('<label for="meta__'.$key.'">'.$lang[$field[1]].'</label>');
+            $form->addElement("<textarea $att rows=\"6\" cols=\"50\">".formText($value).'</textarea>');
+        }
+        $form->addElement('</div>'.NL);
+    }
+    $form->addElement('<div class="buttons">');
+    $form->addElement(form_makeButton('submit', '', $lang['btn_save'], array('accesskey' => 's', 'name' => 'mediado[save]')));
+    $form->addElement('</div>'.NL);
+    $form->printForm();
+
+    return true;
+}
+
+/**
+ * Convenience function to check if a media file is still in use
+ *
+ * @author Michael Klier <chi@chimeric.de>
+ *
+ * @param string $id media id
+ * @return array|bool
+ */
+function media_inuse($id) {
+    global $conf;
+
+    if($conf['refcheck']){
+        $mediareferences = ft_mediause($id,true);
+        if(!count($mediareferences)) {
+            return false;
+        } else {
+            return $mediareferences;
+        }
+    } else {
+        return false;
+    }
+}
+
+define('DOKU_MEDIA_DELETED', 1);
+define('DOKU_MEDIA_NOT_AUTH', 2);
+define('DOKU_MEDIA_INUSE', 4);
+define('DOKU_MEDIA_EMPTY_NS', 8);
+
+/**
+ * Handles media file deletions
+ *
+ * If configured, checks for media references before deletion
+ *
+ * @author             Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param string $id media id
+ * @param int $auth no longer used
+ * @return int One of: 0,
+ *                     DOKU_MEDIA_DELETED,
+ *                     DOKU_MEDIA_DELETED | DOKU_MEDIA_EMPTY_NS,
+ *                     DOKU_MEDIA_NOT_AUTH,
+ *                     DOKU_MEDIA_INUSE
+ */
+function media_delete($id,$auth){
+    global $lang;
+    $auth = auth_quickaclcheck(ltrim(getNS($id).':*', ':'));
+    if($auth < AUTH_DELETE) return DOKU_MEDIA_NOT_AUTH;
+    if(media_inuse($id)) return DOKU_MEDIA_INUSE;
+
+    $file = mediaFN($id);
+
+    // trigger an event - MEDIA_DELETE_FILE
+    $data = array();
+    $data['id']   = $id;
+    $data['name'] = utf8_basename($file);
+    $data['path'] = $file;
+    $data['size'] = (file_exists($file)) ? filesize($file) : 0;
+
+    $data['unl'] = false;
+    $data['del'] = false;
+    $evt = new Doku_Event('MEDIA_DELETE_FILE',$data);
+    if ($evt->advise_before()) {
+        $old = @filemtime($file);
+        if(!file_exists(mediaFN($id, $old)) && file_exists($file)) {
+            // add old revision to the attic
+            media_saveOldRevision($id);
+        }
+
+        $data['unl'] = @unlink($file);
+        if($data['unl']) {
+            $sizechange = 0 - $data['size'];
+            addMediaLogEntry(time(), $id, DOKU_CHANGE_TYPE_DELETE, $lang['deleted'], '', null, $sizechange);
+
+            $data['del'] = io_sweepNS($id, 'mediadir');
+        }
+    }
+    $evt->advise_after();
+    unset($evt);
+
+    if($data['unl'] && $data['del']){
+        return DOKU_MEDIA_DELETED | DOKU_MEDIA_EMPTY_NS;
+    }
+
+    return $data['unl'] ? DOKU_MEDIA_DELETED : 0;
+}
+
+/**
+ * Handle file uploads via XMLHttpRequest
+ *
+ * @param string $ns   target namespace
+ * @param int    $auth current auth check result
+ * @return false|string false on error, id of the new file on success
+ */
+function media_upload_xhr($ns,$auth){
+    if(!checkSecurityToken()) return false;
+    global $INPUT;
+
+    $id = $INPUT->get->str('qqfile');
+    list($ext,$mime) = mimetype($id);
+    $input = fopen("php://input", "r");
+    if (!($tmp = io_mktmpdir())) return false;
+    $path = $tmp.'/'.md5($id);
+    $target = fopen($path, "w");
+    $realSize = stream_copy_to_stream($input, $target);
+    fclose($target);
+    fclose($input);
+    if (isset($_SERVER["CONTENT_LENGTH"]) && ($realSize != (int)$_SERVER["CONTENT_LENGTH"])){
+        unlink($path);
+        return false;
+    }
+
+    $res = media_save(
+        array('name' => $path,
+            'mime' => $mime,
+            'ext'  => $ext),
+        $ns.':'.$id,
+        (($INPUT->get->str('ow') == 'true') ? true : false),
+        $auth,
+        'copy'
+    );
+    unlink($path);
+    if ($tmp) io_rmdir($tmp, true);
+    if (is_array($res)) {
+        msg($res[0], $res[1]);
+        return false;
+    }
+    return $res;
+}
+
+/**
+ * Handles media file uploads
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @author Michael Klier <chi@chimeric.de>
+ *
+ * @param string     $ns    target namespace
+ * @param int        $auth  current auth check result
+ * @param bool|array $file  $_FILES member, $_FILES['upload'] if false
+ * @return false|string false on error, id of the new file on success
+ */
+function media_upload($ns,$auth,$file=false){
+    if(!checkSecurityToken()) return false;
+    global $lang;
+    global $INPUT;
+
+    // get file and id
+    $id   = $INPUT->post->str('mediaid');
+    if (!$file) $file = $_FILES['upload'];
+    if(empty($id)) $id = $file['name'];
+
+    // check for errors (messages are done in lib/exe/mediamanager.php)
+    if($file['error']) return false;
+
+    // check extensions
+    list($fext,$fmime) = mimetype($file['name']);
+    list($iext,$imime) = mimetype($id);
+    if($fext && !$iext){
+        // no extension specified in id - read original one
+        $id   .= '.'.$fext;
+        $imime = $fmime;
+    }elseif($fext && $fext != $iext){
+        // extension was changed, print warning
+        msg(sprintf($lang['mediaextchange'],$fext,$iext));
+    }
+
+    $res = media_save(array('name' => $file['tmp_name'],
+                            'mime' => $imime,
+                            'ext'  => $iext), $ns.':'.$id,
+                      $INPUT->post->bool('ow'), $auth, 'copy_uploaded_file');
+    if (is_array($res)) {
+        msg($res[0], $res[1]);
+        return false;
+    }
+    return $res;
+}
+
+/**
+ * An alternative to move_uploaded_file that copies
+ *
+ * Using copy, makes sure any setgid bits on the media directory are honored
+ *
+ * @see   move_uploaded_file()
+ *
+ * @param string $from
+ * @param string $to
+ * @return bool
+ */
+function copy_uploaded_file($from, $to){
+    if(!is_uploaded_file($from)) return false;
+    $ok = copy($from, $to);
+    @unlink($from);
+    return $ok;
+}
+
+/**
+ * This generates an action event and delegates to _media_upload_action().
+ * Action plugins are allowed to pre/postprocess the uploaded file.
+ * (The triggered event is preventable.)
+ *
+ * Event data:
+ * $data[0]     fn_tmp:    the temporary file name (read from $_FILES)
+ * $data[1]     fn:        the file name of the uploaded file
+ * $data[2]     id:        the future directory id of the uploaded file
+ * $data[3]     imime:     the mimetype of the uploaded file
+ * $data[4]     overwrite: if an existing file is going to be overwritten
+ * $data[5]     move:      name of function that performs move/copy/..
+ *
+ * @triggers MEDIA_UPLOAD_FINISH
+ *
+ * @param array  $file
+ * @param string $id   media id
+ * @param bool   $ow   overwrite?
+ * @param int    $auth permission level
+ * @param string $move name of functions that performs move/copy/..
+ * @return false|array|string
+ */
+function media_save($file, $id, $ow, $auth, $move) {
+    if($auth < AUTH_UPLOAD) {
+        return array("You don't have permissions to upload files.", -1);
+    }
+
+    if (!isset($file['mime']) || !isset($file['ext'])) {
+        list($ext, $mime) = mimetype($id);
+        if (!isset($file['mime'])) {
+            $file['mime'] = $mime;
+        }
+        if (!isset($file['ext'])) {
+            $file['ext'] = $ext;
+        }
+    }
+
+    global $lang, $conf;
+
+    // get filename
+    $id   = cleanID($id);
+    $fn   = mediaFN($id);
+
+    // get filetype regexp
+    $types = array_keys(getMimeTypes());
+    $types = array_map(
+        function ($q) {
+            return preg_quote($q, "/");
+        },
+        $types
+    );
+    $regex = join('|',$types);
+
+    // because a temp file was created already
+    if(!preg_match('/\.('.$regex.')$/i',$fn)) {
+        return array($lang['uploadwrong'],-1);
+    }
+
+    //check for overwrite
+    $overwrite = file_exists($fn);
+    $auth_ow = (($conf['mediarevisions']) ? AUTH_UPLOAD : AUTH_DELETE);
+    if($overwrite && (!$ow || $auth < $auth_ow)) {
+        return array($lang['uploadexist'], 0);
+    }
+    // check for valid content
+    $ok = media_contentcheck($file['name'], $file['mime']);
+    if($ok == -1){
+        return array(sprintf($lang['uploadbadcontent'],'.' . $file['ext']),-1);
+    }elseif($ok == -2){
+        return array($lang['uploadspam'],-1);
+    }elseif($ok == -3){
+        return array($lang['uploadxss'],-1);
+    }
+
+    // prepare event data
+    $data = array();
+    $data[0] = $file['name'];
+    $data[1] = $fn;
+    $data[2] = $id;
+    $data[3] = $file['mime'];
+    $data[4] = $overwrite;
+    $data[5] = $move;
+
+    // trigger event
+    return trigger_event('MEDIA_UPLOAD_FINISH', $data, '_media_upload_action', true);
+}
+
+/**
+ * Callback adapter for media_upload_finish() triggered by MEDIA_UPLOAD_FINISH
+ *
+ * @author Michael Klier <chi@chimeric.de>
+ *
+ * @param array $data event data
+ * @return false|array|string
+ */
+function _media_upload_action($data) {
+    // fixme do further sanity tests of given data?
+    if(is_array($data) && count($data)===6) {
+        return media_upload_finish($data[0], $data[1], $data[2], $data[3], $data[4], $data[5]);
+    } else {
+        return false; //callback error
+    }
+}
+
+/**
+ * Saves an uploaded media file
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @author Michael Klier <chi@chimeric.de>
+ * @author Kate Arzamastseva <pshns@ukr.net>
+ *
+ * @param string $fn_tmp
+ * @param string $fn
+ * @param string $id        media id
+ * @param string $imime     mime type
+ * @param bool   $overwrite overwrite existing?
+ * @param string $move      function name
+ * @return array|string
+ */
+function media_upload_finish($fn_tmp, $fn, $id, $imime, $overwrite, $move = 'move_uploaded_file') {
+    global $conf;
+    global $lang;
+    global $REV;
+
+    $old = @filemtime($fn);
+    if(!file_exists(mediaFN($id, $old)) && file_exists($fn)) {
+        // add old revision to the attic if missing
+        media_saveOldRevision($id);
+    }
+
+    // prepare directory
+    io_createNamespace($id, 'media');
+
+    $filesize_old = file_exists($fn) ? filesize($fn) : 0;
+
+    if($move($fn_tmp, $fn)) {
+        @clearstatcache(true,$fn);
+        $new = @filemtime($fn);
+        // Set the correct permission here.
+        // Always chmod media because they may be saved with different permissions than expected from the php umask.
+        // (Should normally chmod to $conf['fperm'] only if $conf['fperm'] is set.)
+        chmod($fn, $conf['fmode']);
+        msg($lang['uploadsucc'],1);
+        media_notify($id,$fn,$imime,$old);
+        // add a log entry to the media changelog
+        $filesize_new = filesize($fn);
+        $sizechange = $filesize_new - $filesize_old;
+        if($REV) {
+            addMediaLogEntry($new, $id, DOKU_CHANGE_TYPE_REVERT, sprintf($lang['restored'], dformat($REV)), $REV, null, $sizechange);
+        } elseif($overwrite) {
+            addMediaLogEntry($new, $id, DOKU_CHANGE_TYPE_EDIT, '', '', null, $sizechange);
+        } else {
+            addMediaLogEntry($new, $id, DOKU_CHANGE_TYPE_CREATE, $lang['created'], '', null, $sizechange);
+        }
+        return $id;
+    }else{
+        return array($lang['uploadfail'],-1);
+    }
+}
+
+/**
+ * Moves the current version of media file to the media_attic
+ * directory
+ *
+ * @author Kate Arzamastseva <pshns@ukr.net>
+ *
+ * @param string $id
+ * @return int - revision date
+ */
+function media_saveOldRevision($id){
+    global $conf, $lang;
+
+    $oldf = mediaFN($id);
+    if(!file_exists($oldf)) return '';
+    $date = filemtime($oldf);
+    if (!$conf['mediarevisions']) return $date;
+
+    $medialog = new MediaChangeLog($id);
+    if (!$medialog->getRevisionInfo($date)) {
+        // there was an external edit,
+        // there is no log entry for current version of file
+        $sizechange = filesize($oldf);
+        if(!file_exists(mediaMetaFN($id, '.changes'))) {
+            addMediaLogEntry($date, $id, DOKU_CHANGE_TYPE_CREATE, $lang['created'], '', null, $sizechange);
+        } else {
+            $oldRev = $medialog->getRevisions(-1, 1); // from changelog
+            $oldRev = (int) (empty($oldRev) ? 0 : $oldRev[0]);
+            $filesize_old = filesize(mediaFN($id, $oldRev));
+            $sizechange = $sizechange - $filesize_old;
+
+            addMediaLogEntry($date, $id, DOKU_CHANGE_TYPE_EDIT, '', '', null, $sizechange);
+        }
+    }
+
+    $newf = mediaFN($id,$date);
+    io_makeFileDir($newf);
+    if(copy($oldf, $newf)) {
+        // Set the correct permission here.
+        // Always chmod media because they may be saved with different permissions than expected from the php umask.
+        // (Should normally chmod to $conf['fperm'] only if $conf['fperm'] is set.)
+        chmod($newf, $conf['fmode']);
+    }
+    return $date;
+}
+
+/**
+ * This function checks if the uploaded content is really what the
+ * mimetype says it is. We also do spam checking for text types here.
+ *
+ * We need to do this stuff because we can not rely on the browser
+ * to do this check correctly. Yes, IE is broken as usual.
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @link   http://www.splitbrain.org/blog/2007-02/12-internet_explorer_facilitates_cross_site_scripting
+ * @fixme  check all 26 magic IE filetypes here?
+ *
+ * @param string $file path to file
+ * @param string $mime mimetype
+ * @return int
+ */
+function media_contentcheck($file,$mime){
+    global $conf;
+    if($conf['iexssprotect']){
+        $fh = @fopen($file, 'rb');
+        if($fh){
+            $bytes = fread($fh, 256);
+            fclose($fh);
+            if(preg_match('/<(script|a|img|html|body|iframe)[\s>]/i',$bytes)){
+                return -3; //XSS: possibly malicious content
+            }
+        }
+    }
+    if(substr($mime,0,6) == 'image/'){
+        $info = @getimagesize($file);
+        if($mime == 'image/gif' && $info[2] != 1){
+            return -1; // uploaded content did not match the file extension
+        }elseif($mime == 'image/jpeg' && $info[2] != 2){
+            return -1;
+        }elseif($mime == 'image/png' && $info[2] != 3){
+            return -1;
+        }
+        # fixme maybe check other images types as well
+    }elseif(substr($mime,0,5) == 'text/'){
+        global $TEXT;
+        $TEXT = io_readFile($file);
+        if(checkwordblock()){
+            return -2; //blocked by the spam blacklist
+        }
+    }
+    return 0;
+}
+
+/**
+ * Send a notify mail on uploads
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param string   $id      media id
+ * @param string   $file    path to file
+ * @param string   $mime    mime type
+ * @param bool|int $old_rev revision timestamp or false
+ * @return bool
+ */
+function media_notify($id,$file,$mime,$old_rev=false){
+    global $conf;
+    if(empty($conf['notify'])) return false; //notify enabled?
+
+    $subscription = new Subscription();
+    return $subscription->send_media_diff($conf['notify'], 'uploadmail', $id, $old_rev);
+}
+
+/**
+ * List all files in a given Media namespace
+ *
+ * @param string      $ns             namespace
+ * @param null|int    $auth           permission level
+ * @param string      $jump           id
+ * @param bool        $fullscreenview
+ * @param bool|string $sort           sorting order, false skips sorting
+ */
+function media_filelist($ns,$auth=null,$jump='',$fullscreenview=false,$sort=false){
+    global $conf;
+    global $lang;
+    $ns = cleanID($ns);
+
+    // check auth our self if not given (needed for ajax calls)
+    if(is_null($auth)) $auth = auth_quickaclcheck("$ns:*");
+
+    if (!$fullscreenview) echo '<h1 id="media__ns">:'.hsc($ns).'</h1>'.NL;
+
+    if($auth < AUTH_READ){
+        // FIXME: print permission warning here instead?
+        echo '<div class="nothing">'.$lang['nothingfound'].'</div>'.NL;
+    }else{
+        if (!$fullscreenview) {
+            media_uploadform($ns, $auth);
+            media_searchform($ns);
+        }
+
+        $dir = utf8_encodeFN(str_replace(':','/',$ns));
+        $data = array();
+        search($data,$conf['mediadir'],'search_media',
+                array('showmsg'=>true,'depth'=>1),$dir,1,$sort);
+
+        if(!count($data)){
+            echo '<div class="nothing">'.$lang['nothingfound'].'</div>'.NL;
+        }else {
+            if ($fullscreenview) {
+                echo '<ul class="' . _media_get_list_type() . '">';
+            }
+            foreach($data as $item){
+                if (!$fullscreenview) {
+                    media_printfile($item,$auth,$jump);
+                } else {
+                    media_printfile_thumbs($item,$auth,$jump);
+                }
+            }
+            if ($fullscreenview) echo '</ul>'.NL;
+        }
+    }
+}
+
+/**
+ * Prints tabs for files list actions
+ *
+ * @author Kate Arzamastseva <pshns@ukr.net>
+ * @author Adrian Lang <mail@adrianlang.de>
+ *
+ * @param string $selected_tab - opened tab
+ */
+
+function media_tabs_files($selected_tab = ''){
+    global $lang;
+    $tabs = array();
+    foreach(array('files'  => 'mediaselect',
+                  'upload' => 'media_uploadtab',
+                  'search' => 'media_searchtab') as $tab => $caption) {
+        $tabs[$tab] = array('href'    => media_managerURL(array('tab_files' => $tab), '&'),
+                            'caption' => $lang[$caption]);
+    }
+
+    html_tabs($tabs, $selected_tab);
+}
+
+/**
+ * Prints tabs for files details actions
+ *
+ * @author Kate Arzamastseva <pshns@ukr.net>
+ * @param string $image filename of the current image
+ * @param string $selected_tab opened tab
+ */
+function media_tabs_details($image, $selected_tab = ''){
+    global $lang, $conf;
+
+    $tabs = array();
+    $tabs['view'] = array('href'    => media_managerURL(array('tab_details' => 'view'), '&'),
+                          'caption' => $lang['media_viewtab']);
+
+    list(, $mime) = mimetype($image);
+    if ($mime == 'image/jpeg' && file_exists(mediaFN($image))) {
+        $tabs['edit'] = array('href'    => media_managerURL(array('tab_details' => 'edit'), '&'),
+                              'caption' => $lang['media_edittab']);
+    }
+    if ($conf['mediarevisions']) {
+        $tabs['history'] = array('href'    => media_managerURL(array('tab_details' => 'history'), '&'),
+                                 'caption' => $lang['media_historytab']);
+    }
+
+    html_tabs($tabs, $selected_tab);
+}
+
+/**
+ * Prints options for the tab that displays a list of all files
+ *
+ * @author Kate Arzamastseva <pshns@ukr.net>
+ */
+function media_tab_files_options(){
+    global $lang;
+    global $INPUT;
+    global $ID;
+    $form = new Doku_Form(array('class' => 'options', 'method' => 'get',
+                                'action' => wl($ID)));
+    $media_manager_params = media_managerURL(array(), '', false, true);
+    foreach($media_manager_params as $pKey => $pVal){
+        $form->addHidden($pKey, $pVal);
+    }
+    $form->addHidden('sectok', null);
+    if ($INPUT->has('q')) {
+        $form->addHidden('q', $INPUT->str('q'));
+    }
+    $form->addElement('<ul>'.NL);
+    foreach(array('list' => array('listType', array('thumbs', 'rows')),
+                  'sort' => array('sortBy', array('name', 'date')))
+            as $group => $content) {
+        $checked = "_media_get_${group}_type";
+        $checked = $checked();
+
+        $form->addElement('<li class="' . $content[0] . '">');
+        foreach($content[1] as $option) {
+            $attrs = array();
+            if ($checked == $option) {
+                $attrs['checked'] = 'checked';
+            }
+            $form->addElement(form_makeRadioField($group . '_dwmedia', $option,
+                                       $lang['media_' . $group . '_' . $option],
+                                                  $content[0] . '__' . $option,
+                                                  $option, $attrs));
+        }
+        $form->addElement('</li>'.NL);
+    }
+    $form->addElement('<li>');
+    $form->addElement(form_makeButton('submit', '', $lang['btn_apply']));
+    $form->addElement('</li>'.NL);
+    $form->addElement('</ul>'.NL);
+    $form->printForm();
+}
+
+/**
+ * Returns type of sorting for the list of files in media manager
+ *
+ * @author Kate Arzamastseva <pshns@ukr.net>
+ *
+ * @return string - sort type
+ */
+function _media_get_sort_type() {
+    return _media_get_display_param('sort', array('default' => 'name', 'date'));
+}
+
+/**
+ * Returns type of listing for the list of files in media manager
+ *
+ * @author Kate Arzamastseva <pshns@ukr.net>
+ *
+ * @return string - list type
+ */
+function _media_get_list_type() {
+    return _media_get_display_param('list', array('default' => 'thumbs', 'rows'));
+}
+
+/**
+ * Get display parameters
+ *
+ * @param string $param   name of parameter
+ * @param array  $values  allowed values, where default value has index key 'default'
+ * @return string the parameter value
+ */
+function _media_get_display_param($param, $values) {
+    global $INPUT;
+    if (in_array($INPUT->str($param), $values)) {
+        // FIXME: Set cookie
+        return $INPUT->str($param);
+    } else {
+        $val = get_doku_pref($param, $values['default']);
+        if (!in_array($val, $values)) {
+            $val = $values['default'];
+        }
+        return $val;
+    }
+}
+
+/**
+ * Prints tab that displays a list of all files
+ *
+ * @author Kate Arzamastseva <pshns@ukr.net>
+ *
+ * @param string    $ns
+ * @param null|int  $auth permission level
+ * @param string    $jump item id
+ */
+function media_tab_files($ns,$auth=null,$jump='') {
+    global $lang;
+    if(is_null($auth)) $auth = auth_quickaclcheck("$ns:*");
+
+    if($auth < AUTH_READ){
+        echo '<div class="nothing">'.$lang['media_perm_read'].'</div>'.NL;
+    }else{
+        media_filelist($ns,$auth,$jump,true,_media_get_sort_type());
+    }
+}
+
+/**
+ * Prints tab that displays uploading form
+ *
+ * @author Kate Arzamastseva <pshns@ukr.net>
+ *
+ * @param string   $ns
+ * @param null|int $auth permission level
+ * @param string   $jump item id
+ */
+function media_tab_upload($ns,$auth=null,$jump='') {
+    global $lang;
+    if(is_null($auth)) $auth = auth_quickaclcheck("$ns:*");
+
+    echo '<div class="upload">'.NL;
+    if ($auth >= AUTH_UPLOAD) {
+        echo '<p>' . $lang['mediaupload'] . '</p>';
+    }
+    media_uploadform($ns, $auth, true);
+    echo '</div>'.NL;
+}
+
+/**
+ * Prints tab that displays search form
+ *
+ * @author Kate Arzamastseva <pshns@ukr.net>
+ *
+ * @param string $ns
+ * @param null|int $auth permission level
+ */
+function media_tab_search($ns,$auth=null) {
+    global $INPUT;
+
+    $do = $INPUT->str('mediado');
+    $query = $INPUT->str('q');
+    echo '<div class="search">'.NL;
+
+    media_searchform($ns, $query, true);
+    if ($do == 'searchlist' || $query) {
+        media_searchlist($query,$ns,$auth,true,_media_get_sort_type());
+    }
+    echo '</div>'.NL;
+}
+
+/**
+ * Prints tab that displays mediafile details
+ *
+ * @author Kate Arzamastseva <pshns@ukr.net>
+ *
+ * @param string     $image media id
+ * @param string     $ns
+ * @param null|int   $auth  permission level
+ * @param string|int $rev   revision timestamp or empty string
+ */
+function media_tab_view($image, $ns, $auth=null, $rev='') {
+    global $lang;
+    if(is_null($auth)) $auth = auth_quickaclcheck("$ns:*");
+
+    if ($image && $auth >= AUTH_READ) {
+        $meta = new JpegMeta(mediaFN($image, $rev));
+        media_preview($image, $auth, $rev, $meta);
+        media_preview_buttons($image, $auth, $rev);
+        media_details($image, $auth, $rev, $meta);
+
+    } else {
+        echo '<div class="nothing">'.$lang['media_perm_read'].'</div>'.NL;
+    }
+}
+
+/**
+ * Prints tab that displays form for editing mediafile metadata
+ *
+ * @author Kate Arzamastseva <pshns@ukr.net>
+ *
+ * @param string     $image media id
+ * @param string     $ns
+ * @param null|int   $auth permission level
+ */
+function media_tab_edit($image, $ns, $auth=null) {
+    if(is_null($auth)) $auth = auth_quickaclcheck("$ns:*");
+
+    if ($image) {
+        list(, $mime) = mimetype($image);
+        if ($mime == 'image/jpeg') media_metaform($image,$auth);
+    }
+}
+
+/**
+ * Prints tab that displays mediafile revisions
+ *
+ * @author Kate Arzamastseva <pshns@ukr.net>
+ *
+ * @param string     $image media id
+ * @param string     $ns
+ * @param null|int   $auth permission level
+ */
+function media_tab_history($image, $ns, $auth=null) {
+    global $lang;
+    global $INPUT;
+
+    if(is_null($auth)) $auth = auth_quickaclcheck("$ns:*");
+    $do = $INPUT->str('mediado');
+
+    if ($auth >= AUTH_READ && $image) {
+        if ($do == 'diff'){
+            media_diff($image, $ns, $auth);
+        } else {
+            $first = $INPUT->int('first');
+            html_revisions($first, $image);
+        }
+    } else {
+        echo '<div class="nothing">'.$lang['media_perm_read'].'</div>'.NL;
+    }
+}
+
+/**
+ * Prints mediafile details
+ *
+ * @param string         $image media id
+ * @param int            $auth permission level
+ * @param int|string     $rev revision timestamp or empty string
+ * @param JpegMeta|bool  $meta
+ *
+ * @author Kate Arzamastseva <pshns@ukr.net>
+ */
+function media_preview($image, $auth, $rev='', $meta=false) {
+
+    $size = media_image_preview_size($image, $rev, $meta);
+
+    if ($size) {
+        global $lang;
+        echo '<div class="image">';
+
+        $more = array();
+        if ($rev) {
+            $more['rev'] = $rev;
+        } else {
+            $t = @filemtime(mediaFN($image));
+            $more['t'] = $t;
+        }
+
+        $more['w'] = $size[0];
+        $more['h'] = $size[1];
+        $src = ml($image, $more);
+
+        echo '<a href="'.$src.'" target="_blank" title="'.$lang['mediaview'].'">';
+        echo '<img src="'.$src.'" alt="" style="max-width: '.$size[0].'px;" />';
+        echo '</a>';
+
+        echo '</div>'.NL;
+    }
+}
+
+/**
+ * Prints mediafile action buttons
+ *
+ * @author Kate Arzamastseva <pshns@ukr.net>
+ *
+ * @param string     $image media id
+ * @param int        $auth  permission level
+ * @param string|int $rev   revision timestamp, or empty string
+ */
+function media_preview_buttons($image, $auth, $rev='') {
+    global $lang, $conf;
+
+    echo '<ul class="actions">'.NL;
+
+    if($auth >= AUTH_DELETE && !$rev && file_exists(mediaFN($image))){
+
+        // delete button
+        $form = new Doku_Form(array('id' => 'mediamanager__btn_delete',
+            'action'=>media_managerURL(array('delete' => $image), '&')));
+        $form->addElement(form_makeButton('submit','',$lang['btn_delete']));
+        echo '<li>';
+        $form->printForm();
+        echo '</li>'.NL;
+    }
+
+    $auth_ow = (($conf['mediarevisions']) ? AUTH_UPLOAD : AUTH_DELETE);
+    if($auth >= $auth_ow && !$rev){
+
+        // upload new version button
+        $form = new Doku_Form(array('id' => 'mediamanager__btn_update',
+            'action'=>media_managerURL(array('image' => $image, 'mediado' => 'update'), '&')));
+        $form->addElement(form_makeButton('submit','',$lang['media_update']));
+        echo '<li>';
+        $form->printForm();
+        echo '</li>'.NL;
+    }
+
+    if($auth >= AUTH_UPLOAD && $rev && $conf['mediarevisions'] && file_exists(mediaFN($image, $rev))){
+
+        // restore button
+        $form = new Doku_Form(array('id' => 'mediamanager__btn_restore',
+            'action'=>media_managerURL(array('image' => $image), '&')));
+        $form->addHidden('mediado','restore');
+        $form->addHidden('rev',$rev);
+        $form->addElement(form_makeButton('submit','',$lang['media_restore']));
+        echo '<li>';
+        $form->printForm();
+        echo '</li>'.NL;
+    }
+
+    echo '</ul>'.NL;
+}
+
+/**
+ * Returns image width and height for mediamanager preview panel
+ *
+ * @author Kate Arzamastseva <pshns@ukr.net>
+ * @param string         $image
+ * @param int|string     $rev
+ * @param JpegMeta|bool  $meta
+ * @param int            $size
+ * @return array|false
+ */
+function media_image_preview_size($image, $rev, $meta, $size = 500) {
+    if (!preg_match("/\.(jpe?g|gif|png)$/", $image) || !file_exists(mediaFN($image, $rev))) return false;
+
+    $info = getimagesize(mediaFN($image, $rev));
+    $w = (int) $info[0];
+    $h = (int) $info[1];
+
+    if($meta && ($w > $size || $h > $size)){
+        $ratio = $meta->getResizeRatio($size, $size);
+        $w = floor($w * $ratio);
+        $h = floor($h * $ratio);
+    }
+    return array($w, $h);
+}
+
+/**
+ * Returns the requested EXIF/IPTC tag from the image meta
+ *
+ * @author Kate Arzamastseva <pshns@ukr.net>
+ *
+ * @param array    $tags array with tags, first existing is returned
+ * @param JpegMeta $meta
+ * @param string   $alt  alternative value
+ * @return string
+ */
+function media_getTag($tags,$meta,$alt=''){
+    if($meta === false) return $alt;
+    $info = $meta->getField($tags);
+    if($info == false) return $alt;
+    return $info;
+}
+
+/**
+ * Returns mediafile tags
+ *
+ * @author Kate Arzamastseva <pshns@ukr.net>
+ *
+ * @param JpegMeta $meta
+ * @return array list of tags of the mediafile
+ */
+function media_file_tags($meta) {
+    // load the field descriptions
+    static $fields = null;
+    if(is_null($fields)){
+        $config_files = getConfigFiles('mediameta');
+        foreach ($config_files as $config_file) {
+            if(file_exists($config_file)) include($config_file);
+        }
+    }
+
+    $tags = array();
+
+    foreach($fields as $key => $tag){
+        $t = array();
+        if (!empty($tag[0])) $t = array($tag[0]);
+        if(isset($tag[3]) && is_array($tag[3])) $t = array_merge($t,$tag[3]);
+        $value = media_getTag($t, $meta);
+        $tags[] = array('tag' => $tag, 'value' => $value);
+    }
+
+    return $tags;
+}
+
+/**
+ * Prints mediafile tags
+ *
+ * @author Kate Arzamastseva <pshns@ukr.net>
+ *
+ * @param string        $image image id
+ * @param int           $auth  permission level
+ * @param string|int    $rev   revision timestamp, or empty string
+ * @param bool|JpegMeta $meta  image object, or create one if false
+ */
+function media_details($image, $auth, $rev='', $meta=false) {
+    global $lang;
+
+    if (!$meta) $meta = new JpegMeta(mediaFN($image, $rev));
+    $tags = media_file_tags($meta);
+
+    echo '<dl>'.NL;
+    foreach($tags as $tag){
+        if ($tag['value']) {
+            $value = cleanText($tag['value']);
+            echo '<dt>'.$lang[$tag['tag'][1]].'</dt><dd>';
+            if ($tag['tag'][2] == 'date') echo dformat($value);
+            else echo hsc($value);
+            echo '</dd>'.NL;
+        }
+    }
+    echo '</dl>'.NL;
+    echo '<dl>'.NL;
+    echo '<dt>'.$lang['reference'].':</dt>';
+    $media_usage = ft_mediause($image,true);
+    if(count($media_usage) > 0){
+        foreach($media_usage as $path){
+            echo '<dd>'.html_wikilink($path).'</dd>';
+        }
+    }else{
+        echo '<dd>'.$lang['nothingfound'].'</dd>';
+    }
+    echo '</dl>'.NL;
+
+}
+
+/**
+ * Shows difference between two revisions of file
+ *
+ * @author Kate Arzamastseva <pshns@ukr.net>
+ *
+ * @param string $image  image id
+ * @param string $ns
+ * @param int $auth permission level
+ * @param bool $fromajax
+ * @return false|null|string
+ */
+function media_diff($image, $ns, $auth, $fromajax = false) {
+    global $conf;
+    global $INPUT;
+
+    if ($auth < AUTH_READ || !$image || !$conf['mediarevisions']) return '';
+
+    $rev1 = $INPUT->int('rev');
+
+    $rev2 = $INPUT->ref('rev2');
+    if(is_array($rev2)){
+        $rev1 = (int) $rev2[0];
+        $rev2 = (int) $rev2[1];
+
+        if(!$rev1){
+            $rev1 = $rev2;
+            unset($rev2);
+        }
+    }else{
+        $rev2 = $INPUT->int('rev2');
+    }
+
+    if ($rev1 && !file_exists(mediaFN($image, $rev1))) $rev1 = false;
+    if ($rev2 && !file_exists(mediaFN($image, $rev2))) $rev2 = false;
+
+    if($rev1 && $rev2){            // two specific revisions wanted
+        // make sure order is correct (older on the left)
+        if($rev1 < $rev2){
+            $l_rev = $rev1;
+            $r_rev = $rev2;
+        }else{
+            $l_rev = $rev2;
+            $r_rev = $rev1;
+        }
+    }elseif($rev1){                // single revision given, compare to current
+        $r_rev = '';
+        $l_rev = $rev1;
+    }else{                        // no revision was given, compare previous to current
+        $r_rev = '';
+        $medialog = new MediaChangeLog($image);
+        $revs = $medialog->getRevisions(0, 1);
+        if (file_exists(mediaFN($image, $revs[0]))) {
+            $l_rev = $revs[0];
+        } else {
+            $l_rev = '';
+        }
+    }
+
+    // prepare event data
+    $data = array();
+    $data[0] = $image;
+    $data[1] = $l_rev;
+    $data[2] = $r_rev;
+    $data[3] = $ns;
+    $data[4] = $auth;
+    $data[5] = $fromajax;
+
+    // trigger event
+    return trigger_event('MEDIA_DIFF', $data, '_media_file_diff', true);
+}
+
+/**
+ * Callback for media file diff
+ *
+ * @param array $data event data
+ * @return false|null
+ */
+function _media_file_diff($data) {
+    if(is_array($data) && count($data)===6) {
+        media_file_diff($data[0], $data[1], $data[2], $data[3], $data[4], $data[5]);
+    } else {
+        return false;
+    }
+}
+
+/**
+ * Shows difference between two revisions of image
+ *
+ * @author Kate Arzamastseva <pshns@ukr.net>
+ *
+ * @param string $image
+ * @param string|int $l_rev revision timestamp, or empty string
+ * @param string|int $r_rev revision timestamp, or empty string
+ * @param string $ns
+ * @param int $auth permission level
+ * @param bool $fromajax
+ */
+function media_file_diff($image, $l_rev, $r_rev, $ns, $auth, $fromajax){
+    global $lang;
+    global $INPUT;
+
+    $l_meta = new JpegMeta(mediaFN($image, $l_rev));
+    $r_meta = new JpegMeta(mediaFN($image, $r_rev));
+
+    $is_img = preg_match('/\.(jpe?g|gif|png)$/', $image);
+    if ($is_img) {
+        $l_size = media_image_preview_size($image, $l_rev, $l_meta);
+        $r_size = media_image_preview_size($image, $r_rev, $r_meta);
+        $is_img = ($l_size && $r_size && ($l_size[0] >= 30 || $r_size[0] >= 30));
+
+        $difftype = $INPUT->str('difftype');
+
+        if (!$fromajax) {
+            $form = new Doku_Form(array(
+                'action' => media_managerURL(array(), '&'),
+                'method' => 'get',
+                'id' => 'mediamanager__form_diffview',
+                'class' => 'diffView'
+            ));
+            $form->addHidden('sectok', null);
+            $form->addElement('<input type="hidden" name="rev2[]" value="'.$l_rev.'" ></input>');
+            $form->addElement('<input type="hidden" name="rev2[]" value="'.$r_rev.'" ></input>');
+            $form->addHidden('mediado', 'diff');
+            $form->printForm();
+
+            echo NL.'<div id="mediamanager__diff" >'.NL;
+        }
+
+        if ($difftype == 'opacity' || $difftype == 'portions') {
+            media_image_diff($image, $l_rev, $r_rev, $l_size, $r_size, $difftype);
+            if (!$fromajax) echo '</div>';
+            return;
+        }
+    }
+
+    list($l_head, $r_head) = html_diff_head($l_rev, $r_rev, $image, true);
+
+    ?>
+    <div class="table">
+    <table>
+      <tr>
+        <th><?php echo $l_head; ?></th>
+        <th><?php echo $r_head; ?></th>
+      </tr>
+    <?php
+
+    echo '<tr class="image">';
+    echo '<td>';
+    media_preview($image, $auth, $l_rev, $l_meta);
+    echo '</td>';
+
+    echo '<td>';
+    media_preview($image, $auth, $r_rev, $r_meta);
+    echo '</td>';
+    echo '</tr>'.NL;
+
+    echo '<tr class="actions">';
+    echo '<td>';
+    media_preview_buttons($image, $auth, $l_rev);
+    echo '</td>';
+
+    echo '<td>';
+    media_preview_buttons($image, $auth, $r_rev);
+    echo '</td>';
+    echo '</tr>'.NL;
+
+    $l_tags = media_file_tags($l_meta);
+    $r_tags = media_file_tags($r_meta);
+    // FIXME r_tags-only stuff
+    foreach ($l_tags as $key => $l_tag) {
+        if ($l_tag['value'] != $r_tags[$key]['value']) {
+            $r_tags[$key]['highlighted'] = true;
+            $l_tags[$key]['highlighted'] = true;
+        } else if (!$l_tag['value'] || !$r_tags[$key]['value']) {
+            unset($r_tags[$key]);
+            unset($l_tags[$key]);
+        }
+    }
+
+    echo '<tr>';
+    foreach(array($l_tags,$r_tags) as $tags){
+        echo '<td>'.NL;
+
+        echo '<dl class="img_tags">';
+        foreach($tags as $tag){
+            $value = cleanText($tag['value']);
+            if (!$value) $value = '-';
+            echo '<dt>'.$lang[$tag['tag'][1]].'</dt>';
+            echo '<dd>';
+            if ($tag['highlighted']) {
+                echo '<strong>';
+            }
+            if ($tag['tag'][2] == 'date') echo dformat($value);
+            else echo hsc($value);
+            if ($tag['highlighted']) {
+                echo '</strong>';
+            }
+            echo '</dd>';
+        }
+        echo '</dl>'.NL;
+
+        echo '</td>';
+    }
+    echo '</tr>'.NL;
+
+    echo '</table>'.NL;
+    echo '</div>'.NL;
+
+    if ($is_img && !$fromajax) echo '</div>';
+}
+
+/**
+ * Prints two images side by side
+ * and slider
+ *
+ * @author Kate Arzamastseva <pshns@ukr.net>
+ *
+ * @param string $image   image id
+ * @param int    $l_rev   revision timestamp, or empty string
+ * @param int    $r_rev   revision timestamp, or empty string
+ * @param array  $l_size  array with width and height
+ * @param array  $r_size  array with width and height
+ * @param string $type
+ */
+function media_image_diff($image, $l_rev, $r_rev, $l_size, $r_size, $type) {
+    if ($l_size != $r_size) {
+        if ($r_size[0] > $l_size[0]) {
+            $l_size = $r_size;
+        }
+    }
+
+    $l_more = array('rev' => $l_rev, 'h' => $l_size[1], 'w' => $l_size[0]);
+    $r_more = array('rev' => $r_rev, 'h' => $l_size[1], 'w' => $l_size[0]);
+
+    $l_src = ml($image, $l_more);
+    $r_src = ml($image, $r_more);
+
+    // slider
+    echo '<div class="slider" style="max-width: '.($l_size[0]-20).'px;" ></div>'.NL;
+
+    // two images in divs
+    echo '<div class="imageDiff ' . $type . '">'.NL;
+    echo '<div class="image1" style="max-width: '.$l_size[0].'px;">';
+    echo '<img src="'.$l_src.'" alt="" />';
+    echo '</div>'.NL;
+    echo '<div class="image2" style="max-width: '.$l_size[0].'px;">';
+    echo '<img src="'.$r_src.'" alt="" />';
+    echo '</div>'.NL;
+    echo '</div>'.NL;
+}
+
+/**
+ * Restores an old revision of a media file
+ *
+ * @param string $image media id
+ * @param int    $rev   revision timestamp or empty string
+ * @param int    $auth
+ * @return string - file's id
+ *
+ * @author Kate Arzamastseva <pshns@ukr.net>
+ */
+function media_restore($image, $rev, $auth){
+    global $conf;
+    if ($auth < AUTH_UPLOAD || !$conf['mediarevisions']) return false;
+    $removed = (!file_exists(mediaFN($image)) && file_exists(mediaMetaFN($image, '.changes')));
+    if (!$image || (!file_exists(mediaFN($image)) && !$removed)) return false;
+    if (!$rev || !file_exists(mediaFN($image, $rev))) return false;
+    list(,$imime,) = mimetype($image);
+    $res = media_upload_finish(mediaFN($image, $rev),
+        mediaFN($image),
+        $image,
+        $imime,
+        true,
+        'copy');
+    if (is_array($res)) {
+        msg($res[0], $res[1]);
+        return false;
+    }
+    return $res;
+}
+
+/**
+ * List all files found by the search request
+ *
+ * @author Tobias Sarnowski <sarnowski@cosmocode.de>
+ * @author Andreas Gohr <gohr@cosmocode.de>
+ * @author Kate Arzamastseva <pshns@ukr.net>
+ * @triggers MEDIA_SEARCH
+ *
+ * @param string $query
+ * @param string $ns
+ * @param null|int $auth
+ * @param bool $fullscreen
+ * @param string $sort
+ */
+function media_searchlist($query,$ns,$auth=null,$fullscreen=false,$sort='natural'){
+    global $conf;
+    global $lang;
+
+    $ns = cleanID($ns);
+    $evdata = array(
+        'ns'    => $ns,
+        'data'  => array(),
+        'query' => $query
+    );
+    if (!blank($query)) {
+        $evt = new Doku_Event('MEDIA_SEARCH', $evdata);
+        if ($evt->advise_before()) {
+            $dir = utf8_encodeFN(str_replace(':','/',$evdata['ns']));
+            $quoted = preg_quote($evdata['query'],'/');
+            //apply globbing
+            $quoted = str_replace(array('\*', '\?'), array('.*', '.'), $quoted, $count);
+
+            //if we use globbing file name must match entirely but may be preceded by arbitrary namespace
+            if ($count > 0) $quoted = '^([^:]*:)*'.$quoted.'$';
+
+            $pattern = '/'.$quoted.'/i';
+            search($evdata['data'],
+                    $conf['mediadir'],
+                    'search_media',
+                    array('showmsg'=>false,'pattern'=>$pattern),
+                    $dir,
+                    1,
+                    $sort);
+        }
+        $evt->advise_after();
+        unset($evt);
+    }
+
+    if (!$fullscreen) {
+        echo '<h1 id="media__ns">'.sprintf($lang['searchmedia_in'],hsc($ns).':*').'</h1>'.NL;
+        media_searchform($ns,$query);
+    }
+
+    if(!count($evdata['data'])){
+        echo '<div class="nothing">'.$lang['nothingfound'].'</div>'.NL;
+    }else {
+        if ($fullscreen) {
+            echo '<ul class="' . _media_get_list_type() . '">';
+        }
+        foreach($evdata['data'] as $item){
+            if (!$fullscreen) media_printfile($item,$item['perm'],'',true);
+            else media_printfile_thumbs($item,$item['perm'],false,true);
+        }
+        if ($fullscreen) echo '</ul>'.NL;
+    }
+}
+
+/**
+ * Formats and prints one file in the list
+ *
+ * @param array     $item
+ * @param int       $auth              permission level
+ * @param string    $jump              item id
+ * @param bool      $display_namespace
+ */
+function media_printfile($item,$auth,$jump,$display_namespace=false){
+    global $lang;
+
+    // Prepare zebra coloring
+    // I always wanted to use this variable name :-D
+    static $twibble = 1;
+    $twibble *= -1;
+    $zebra = ($twibble == -1) ? 'odd' : 'even';
+
+    // Automatically jump to recent action
+    if($jump == $item['id']) {
+        $jump = ' id="scroll__here" ';
+    }else{
+        $jump = '';
+    }
+
+    // Prepare fileicons
+    list($ext) = mimetype($item['file'],false);
+    $class = preg_replace('/[^_\-a-z0-9]+/i','_',$ext);
+    $class = 'select mediafile mf_'.$class;
+
+    // Prepare filename
+    $file = utf8_decodeFN($item['file']);
+
+    // Prepare info
+    $info = '';
+    if($item['isimg']){
+        $info .= (int) $item['meta']->getField('File.Width');
+        $info .= '&#215;';
+        $info .= (int) $item['meta']->getField('File.Height');
+        $info .= ' ';
+    }
+    $info .= '<i>'.dformat($item['mtime']).'</i>';
+    $info .= ' ';
+    $info .= filesize_h($item['size']);
+
+    // output
+    echo '<div class="'.$zebra.'"'.$jump.' title="'.hsc($item['id']).'">'.NL;
+    if (!$display_namespace) {
+        echo '<a id="h_:'.$item['id'].'" class="'.$class.'">'.hsc($file).'</a> ';
+    } else {
+        echo '<a id="h_:'.$item['id'].'" class="'.$class.'">'.hsc($item['id']).'</a><br/>';
+    }
+    echo '<span class="info">('.$info.')</span>'.NL;
+
+    // view button
+    $link = ml($item['id'],'',true);
+    echo ' <a href="'.$link.'" target="_blank"><img src="'.DOKU_BASE.'lib/images/magnifier.png" '.
+        'alt="'.$lang['mediaview'].'" title="'.$lang['mediaview'].'" class="btn" /></a>';
+
+    // mediamanager button
+    $link = wl('',array('do'=>'media','image'=>$item['id'],'ns'=>getNS($item['id'])));
+    echo ' <a href="'.$link.'" target="_blank"><img src="'.DOKU_BASE.'lib/images/mediamanager.png" '.
+        'alt="'.$lang['btn_media'].'" title="'.$lang['btn_media'].'" class="btn" /></a>';
+
+    // delete button
+    if($item['writable'] && $auth >= AUTH_DELETE){
+        $link = DOKU_BASE.'lib/exe/mediamanager.php?delete='.rawurlencode($item['id']).
+            '&amp;sectok='.getSecurityToken();
+        echo ' <a href="'.$link.'" class="btn_media_delete" title="'.$item['id'].'">'.
+            '<img src="'.DOKU_BASE.'lib/images/trash.png" alt="'.$lang['btn_delete'].'" '.
+            'title="'.$lang['btn_delete'].'" class="btn" /></a>';
+    }
+
+    echo '<div class="example" id="ex_'.str_replace(':','_',$item['id']).'">';
+    echo $lang['mediausage'].' <code>{{:'.$item['id'].'}}</code>';
+    echo '</div>';
+    if($item['isimg']) media_printimgdetail($item);
+    echo '<div class="clearer"></div>'.NL;
+    echo '</div>'.NL;
+}
+
+/**
+ * Display a media icon
+ *
+ * @param string $filename media id
+ * @param string $size     the size subfolder, if not specified 16x16 is used
+ * @return string html
+ */
+function media_printicon($filename, $size=''){
+    list($ext) = mimetype(mediaFN($filename),false);
+
+    if (file_exists(DOKU_INC.'lib/images/fileicons/'.$size.'/'.$ext.'.png')) {
+        $icon = DOKU_BASE.'lib/images/fileicons/'.$size.'/'.$ext.'.png';
+    } else {
+        $icon = DOKU_BASE.'lib/images/fileicons/'.$size.'/file.png';
+    }
+
+    return '<img src="'.$icon.'" alt="'.$filename.'" class="icon" />';
+}
+
+/**
+ * Formats and prints one file in the list in the thumbnails view
+ *
+ * @author Kate Arzamastseva <pshns@ukr.net>
+ *
+ * @param array       $item
+ * @param int         $auth              permission level
+ * @param bool|string $jump              item id
+ * @param bool        $display_namespace
+ */
+function media_printfile_thumbs($item,$auth,$jump=false,$display_namespace=false){
+
+    // Prepare filename
+    $file = utf8_decodeFN($item['file']);
+
+    // output
+    echo '<li><dl title="'.hsc($item['id']).'">'.NL;
+
+        echo '<dt>';
+    if($item['isimg']) {
+        media_printimgdetail($item, true);
+
+    } else {
+        echo '<a id="d_:'.$item['id'].'" class="image" title="'.$item['id'].'" href="'.
+            media_managerURL(array('image' => hsc($item['id']), 'ns' => getNS($item['id']),
+            'tab_details' => 'view')).'">';
+        echo media_printicon($item['id'], '32x32');
+        echo '</a>';
+    }
+    echo '</dt>'.NL;
+    if (!$display_namespace) {
+        $name = hsc($file);
+    } else {
+        $name = hsc($item['id']);
+    }
+    echo '<dd class="name"><a href="'.media_managerURL(array('image' => hsc($item['id']), 'ns' => getNS($item['id']),
+        'tab_details' => 'view')).'" id="h_:'.$item['id'].'">'.$name.'</a></dd>'.NL;
+
+    if($item['isimg']){
+        $size = '';
+        $size .= (int) $item['meta']->getField('File.Width');
+        $size .= '&#215;';
+        $size .= (int) $item['meta']->getField('File.Height');
+        echo '<dd class="size">'.$size.'</dd>'.NL;
+    } else {
+        echo '<dd class="size">&#160;</dd>'.NL;
+    }
+    $date = dformat($item['mtime']);
+    echo '<dd class="date">'.$date.'</dd>'.NL;
+    $filesize = filesize_h($item['size']);
+    echo '<dd class="filesize">'.$filesize.'</dd>'.NL;
+    echo '</dl></li>'.NL;
+}
+
+/**
+ * Prints a thumbnail and metainfo
+ *
+ * @param array $item
+ * @param bool  $fullscreen
+ */
+function media_printimgdetail($item, $fullscreen=false){
+    // prepare thumbnail
+    $size = $fullscreen ? 90 : 120;
+
+    $w = (int) $item['meta']->getField('File.Width');
+    $h = (int) $item['meta']->getField('File.Height');
+    if($w>$size || $h>$size){
+        if (!$fullscreen) {
+            $ratio = $item['meta']->getResizeRatio($size);
+        } else {
+            $ratio = $item['meta']->getResizeRatio($size,$size);
+        }
+        $w = floor($w * $ratio);
+        $h = floor($h * $ratio);
+    }
+    $src = ml($item['id'],array('w'=>$w,'h'=>$h,'t'=>$item['mtime']));
+    $p = array();
+    if (!$fullscreen) {
+        // In fullscreen mediamanager view, image resizing is done via CSS.
+        $p['width']  = $w;
+        $p['height'] = $h;
+    }
+    $p['alt']    = $item['id'];
+    $att = buildAttributes($p);
+
+    // output
+    if ($fullscreen) {
+        echo '<a id="l_:'.$item['id'].'" class="image thumb" href="'.
+            media_managerURL(array('image' => hsc($item['id']), 'ns' => getNS($item['id']), 'tab_details' => 'view')).'">';
+        echo '<img src="'.$src.'" '.$att.' />';
+        echo '</a>';
+    }
+
+    if ($fullscreen) return;
+
+    echo '<div class="detail">';
+    echo '<div class="thumb">';
+    echo '<a id="d_:'.$item['id'].'" class="select">';
+    echo '<img src="'.$src.'" '.$att.' />';
+    echo '</a>';
+    echo '</div>';
+
+    // read EXIF/IPTC data
+    $t = $item['meta']->getField(array('IPTC.Headline','xmp.dc:title'));
+    $d = $item['meta']->getField(array('IPTC.Caption','EXIF.UserComment',
+                'EXIF.TIFFImageDescription',
+                'EXIF.TIFFUserComment'));
+    if(utf8_strlen($d) > 250) $d = utf8_substr($d,0,250).'...';
+    $k = $item['meta']->getField(array('IPTC.Keywords','IPTC.Category','xmp.dc:subject'));
+
+    // print EXIF/IPTC data
+    if($t || $d || $k ){
+        echo '<p>';
+        if($t) echo '<strong>'.hsc($t).'</strong><br />';
+        if($d) echo hsc($d).'<br />';
+        if($t) echo '<em>'.hsc($k).'</em>';
+        echo '</p>';
+    }
+    echo '</div>';
+}
+
+/**
+ * Build link based on the current, adding/rewriting parameters
+ *
+ * @author Kate Arzamastseva <pshns@ukr.net>
+ *
+ * @param array|bool $params
+ * @param string     $amp           separator
+ * @param bool       $abs           absolute url?
+ * @param bool       $params_array  return the parmeters array?
+ * @return string|array - link or link parameters
+ */
+function media_managerURL($params=false, $amp='&amp;', $abs=false, $params_array=false) {
+    global $ID;
+    global $INPUT;
+
+    $gets = array('do' => 'media');
+    $media_manager_params = array('tab_files', 'tab_details', 'image', 'ns', 'list', 'sort');
+    foreach ($media_manager_params as $x) {
+        if ($INPUT->has($x)) $gets[$x] = $INPUT->str($x);
+    }
+
+    if ($params) {
+        $gets = $params + $gets;
+    }
+    unset($gets['id']);
+    if (isset($gets['delete'])) {
+        unset($gets['image']);
+        unset($gets['tab_details']);
+    }
+
+    if ($params_array) return $gets;
+
+    return wl($ID,$gets,$abs,$amp);
+}
+
+/**
+ * Print the media upload form if permissions are correct
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @author Kate Arzamastseva <pshns@ukr.net>
+ *
+ * @param string $ns
+ * @param int    $auth permission level
+ * @param bool  $fullscreen
+ */
+function media_uploadform($ns, $auth, $fullscreen = false){
+    global $lang;
+    global $conf;
+    global $INPUT;
+
+    if($auth < AUTH_UPLOAD) {
+        echo '<div class="nothing">'.$lang['media_perm_upload'].'</div>'.NL;
+        return;
+    }
+    $auth_ow = (($conf['mediarevisions']) ? AUTH_UPLOAD : AUTH_DELETE);
+
+    $update = false;
+    $id = '';
+    if ($auth >= $auth_ow && $fullscreen && $INPUT->str('mediado') == 'update') {
+        $update = true;
+        $id = cleanID($INPUT->str('image'));
+    }
+
+    // The default HTML upload form
+    $params = array('id'      => 'dw__upload',
+                    'enctype' => 'multipart/form-data');
+    if (!$fullscreen) {
+        $params['action'] = DOKU_BASE.'lib/exe/mediamanager.php';
+    } else {
+        $params['action'] = media_managerURL(array('tab_files' => 'files',
+            'tab_details' => 'view'), '&');
+    }
+
+    $form = new Doku_Form($params);
+    if (!$fullscreen) echo '<div class="upload">' . $lang['mediaupload'] . '</div>';
+    $form->addElement(formSecurityToken());
+    $form->addHidden('ns', hsc($ns));
+    $form->addElement(form_makeOpenTag('p'));
+    $form->addElement(form_makeFileField('upload', $lang['txt_upload'], 'upload__file'));
+    $form->addElement(form_makeCloseTag('p'));
+    $form->addElement(form_makeOpenTag('p'));
+    $form->addElement(form_makeTextField('mediaid', noNS($id), $lang['txt_filename'], 'upload__name'));
+    $form->addElement(form_makeButton('submit', '', $lang['btn_upload']));
+    $form->addElement(form_makeCloseTag('p'));
+
+    if($auth >= $auth_ow){
+        $form->addElement(form_makeOpenTag('p'));
+        $attrs = array();
+        if ($update) $attrs['checked'] = 'checked';
+        $form->addElement(form_makeCheckboxField('ow', 1, $lang['txt_overwrt'], 'dw__ow', 'check', $attrs));
+        $form->addElement(form_makeCloseTag('p'));
+    }
+
+    echo NL.'<div id="mediamanager__uploader">'.NL;
+    html_form('upload', $form);
+
+    echo '</div>'.NL;
+
+    echo '<p class="maxsize">';
+    printf($lang['maxuploadsize'],filesize_h(media_getuploadsize()));
+    echo '</p>'.NL;
+
+}
+
+/**
+ * Returns the size uploaded files may have
+ *
+ * This uses a conservative approach using the lowest number found
+ * in any of the limiting ini settings
+ *
+ * @returns int size in bytes
+ */
+function media_getuploadsize(){
+    $okay = 0;
+
+    $post = (int) php_to_byte(@ini_get('post_max_size'));
+    $suho = (int) php_to_byte(@ini_get('suhosin.post.max_value_length'));
+    $upld = (int) php_to_byte(@ini_get('upload_max_filesize'));
+
+    if($post && ($post < $okay || $okay == 0)) $okay = $post;
+    if($suho && ($suho < $okay || $okay == 0)) $okay = $suho;
+    if($upld && ($upld < $okay || $okay == 0)) $okay = $upld;
+
+    return $okay;
+}
+
+/**
+ * Print the search field form
+ *
+ * @author Tobias Sarnowski <sarnowski@cosmocode.de>
+ * @author Kate Arzamastseva <pshns@ukr.net>
+ *
+ * @param string $ns
+ * @param string $query
+ * @param bool $fullscreen
+ */
+function media_searchform($ns,$query='',$fullscreen=false){
+    global $lang;
+
+    // The default HTML search form
+    $params = array('id' => 'dw__mediasearch');
+    if (!$fullscreen) {
+        $params['action'] = DOKU_BASE.'lib/exe/mediamanager.php';
+    } else {
+        $params['action'] = media_managerURL(array(), '&');
+    }
+    $form = new Doku_Form($params);
+    $form->addHidden('ns', $ns);
+    $form->addHidden($fullscreen ? 'mediado' : 'do', 'searchlist');
+
+    $form->addElement(form_makeOpenTag('p'));
+    $form->addElement(form_makeTextField('q', $query,$lang['searchmedia'],'','',array('title'=>sprintf($lang['searchmedia_in'],hsc($ns).':*'))));
+    $form->addElement(form_makeButton('submit', '', $lang['btn_search']));
+    $form->addElement(form_makeCloseTag('p'));
+    html_form('searchmedia', $form);
+}
+
+/**
+ * Build a tree outline of available media namespaces
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param string $ns
+ */
+function media_nstree($ns){
+    global $conf;
+    global $lang;
+
+    // currently selected namespace
+    $ns  = cleanID($ns);
+    if(empty($ns)){
+        global $ID;
+        $ns = (string)getNS($ID);
+    }
+
+    $ns_dir  = utf8_encodeFN(str_replace(':','/',$ns));
+
+    $data = array();
+    search($data,$conf['mediadir'],'search_index',array('ns' => $ns_dir, 'nofiles' => true));
+
+    // wrap a list with the root level around the other namespaces
+    array_unshift($data, array('level' => 0, 'id' => '', 'open' =>'true',
+                               'label' => '['.$lang['mediaroot'].']'));
+
+    // insert the current ns into the hierarchy if it isn't already part of it
+    $ns_parts = explode(':', $ns);
+    $tmp_ns = '';
+    $pos = 0;
+    foreach ($ns_parts as $level => $part) {
+        if ($tmp_ns) $tmp_ns .= ':'.$part;
+        else $tmp_ns = $part;
+
+        // find the namespace parts or insert them
+        while ($data[$pos]['id'] != $tmp_ns) {
+            if ($pos >= count($data) || ($data[$pos]['level'] <= $level+1 && strnatcmp(utf8_encodeFN($data[$pos]['id']), utf8_encodeFN($tmp_ns)) > 0)) {
+                array_splice($data, $pos, 0, array(array('level' => $level+1, 'id' => $tmp_ns, 'open' => 'true')));
+                break;
+            }
+            ++$pos;
+        }
+    }
+
+    echo html_buildlist($data,'idx','media_nstree_item','media_nstree_li');
+}
+
+/**
+ * Userfunction for html_buildlist
+ *
+ * Prints a media namespace tree item
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param array $item
+ * @return string html
+ */
+function media_nstree_item($item){
+    global $INPUT;
+    $pos   = strrpos($item['id'], ':');
+    $label = substr($item['id'], $pos > 0 ? $pos + 1 : 0);
+    if(empty($item['label'])) $item['label'] = $label;
+
+    $ret  = '';
+    if (!($INPUT->str('do') == 'media'))
+    $ret .= '<a href="'.DOKU_BASE.'lib/exe/mediamanager.php?ns='.idfilter($item['id']).'" class="idx_dir">';
+    else $ret .= '<a href="'.media_managerURL(array('ns' => idfilter($item['id'], false), 'tab_files' => 'files'))
+        .'" class="idx_dir">';
+    $ret .= $item['label'];
+    $ret .= '</a>';
+    return $ret;
+}
+
+/**
+ * Userfunction for html_buildlist
+ *
+ * Prints a media namespace tree item opener
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param array $item
+ * @return string html
+ */
+function media_nstree_li($item){
+    $class='media level'.$item['level'];
+    if($item['open']){
+        $class .= ' open';
+        $img   = DOKU_BASE.'lib/images/minus.gif';
+        $alt   = '−';
+    }else{
+        $class .= ' closed';
+        $img   = DOKU_BASE.'lib/images/plus.gif';
+        $alt   = '+';
+    }
+    // TODO: only deliver an image if it actually has a subtree...
+    return '<li class="'.$class.'">'.
+        '<img src="'.$img.'" alt="'.$alt.'" />';
+}
+
+/**
+ * Resizes the given image to the given size
+ *
+ * @author  Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param string $file filename, path to file
+ * @param string $ext  extension
+ * @param int    $w    desired width
+ * @param int    $h    desired height
+ * @return string path to resized or original size if failed
+ */
+function media_resize_image($file, $ext, $w, $h=0){
+    global $conf;
+
+    $info = @getimagesize($file); //get original size
+    if($info == false) return $file; // that's no image - it's a spaceship!
+
+    if(!$h) $h = round(($w * $info[1]) / $info[0]);
+    if(!$w) $w = round(($h * $info[0]) / $info[1]);
+
+    // we wont scale up to infinity
+    if($w > 2000 || $h > 2000) return $file;
+
+    // resize necessary? - (w,h) = native dimensions
+    if(($w == $info[0]) && ($h == $info[1])) return $file;
+
+    //cache
+    $local = getCacheName($file,'.media.'.$w.'x'.$h.'.'.$ext);
+    $mtime = @filemtime($local); // 0 if not exists
+
+    if($mtime > filemtime($file) ||
+        media_resize_imageIM($ext, $file, $info[0], $info[1], $local, $w, $h) ||
+        media_resize_imageGD($ext, $file, $info[0], $info[1], $local, $w, $h)
+    ) {
+        if(!empty($conf['fperm'])) @chmod($local, $conf['fperm']);
+        return $local;
+    }
+    //still here? resizing failed
+    return $file;
+}
+
+/**
+ * Crops the given image to the wanted ratio, then calls media_resize_image to scale it
+ * to the wanted size
+ *
+ * Crops are centered horizontally but prefer the upper third of an vertical
+ * image because most pics are more interesting in that area (rule of thirds)
+ *
+ * @author  Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param string $file filename, path to file
+ * @param string $ext  extension
+ * @param int    $w    desired width
+ * @param int    $h    desired height
+ * @return string path to resized or original size if failed
+ */
+function media_crop_image($file, $ext, $w, $h=0){
+    global $conf;
+
+    if(!$h) $h = $w;
+    $info = @getimagesize($file); //get original size
+    if($info == false) return $file; // that's no image - it's a spaceship!
+
+    // calculate crop size
+    $fr = $info[0]/$info[1];
+    $tr = $w/$h;
+
+    // check if the crop can be handled completely by resize,
+    // i.e. the specified width & height match the aspect ratio of the source image
+    if ($w == round($h*$fr)) {
+        return media_resize_image($file, $ext, $w);
+    }
+
+    if($tr >= 1){
+        if($tr > $fr){
+            $cw = $info[0];
+            $ch = (int) ($info[0]/$tr);
+        }else{
+            $cw = (int) ($info[1]*$tr);
+            $ch = $info[1];
+        }
+    }else{
+        if($tr < $fr){
+            $cw = (int) ($info[1]*$tr);
+            $ch = $info[1];
+        }else{
+            $cw = $info[0];
+            $ch = (int) ($info[0]/$tr);
+        }
+    }
+    // calculate crop offset
+    $cx = (int) (($info[0]-$cw)/2);
+    $cy = (int) (($info[1]-$ch)/3);
+
+    //cache
+    $local = getCacheName($file,'.media.'.$cw.'x'.$ch.'.crop.'.$ext);
+    $mtime = @filemtime($local); // 0 if not exists
+
+    if( $mtime > @filemtime($file) ||
+            media_crop_imageIM($ext,$file,$info[0],$info[1],$local,$cw,$ch,$cx,$cy) ||
+            media_resize_imageGD($ext,$file,$cw,$ch,$local,$cw,$ch,$cx,$cy) ){
+        if(!empty($conf['fperm'])) @chmod($local, $conf['fperm']);
+        return media_resize_image($local,$ext, $w, $h);
+    }
+
+    //still here? cropping failed
+    return media_resize_image($file,$ext, $w, $h);
+}
+
+/**
+ * Calculate a token to be used to verify fetch requests for resized or
+ * cropped images have been internally generated - and prevent external
+ * DDOS attacks via fetch
+ *
+ * @author Christopher Smith <chris@jalakai.co.uk>
+ *
+ * @param string  $id    id of the image
+ * @param int     $w     resize/crop width
+ * @param int     $h     resize/crop height
+ * @return string token or empty string if no token required
+ */
+function media_get_token($id,$w,$h){
+    // token is only required for modified images
+    if ($w || $h || media_isexternal($id)) {
+        $token = $id;
+        if ($w) $token .= '.'.$w;
+        if ($h) $token .= '.'.$h;
+
+        return substr(PassHash::hmac('md5', $token, auth_cookiesalt()),0,6);
+    }
+
+    return '';
+}
+
+/**
+ * Download a remote file and return local filename
+ *
+ * returns false if download fails. Uses cached file if available and
+ * wanted
+ *
+ * @author  Andreas Gohr <andi@splitbrain.org>
+ * @author  Pavel Vitis <Pavel.Vitis@seznam.cz>
+ *
+ * @param string $url
+ * @param string $ext   extension
+ * @param int    $cache cachetime in seconds
+ * @return false|string path to cached file
+ */
+function media_get_from_URL($url,$ext,$cache){
+    global $conf;
+
+    // if no cache or fetchsize just redirect
+    if ($cache==0)           return false;
+    if (!$conf['fetchsize']) return false;
+
+    $local = getCacheName(strtolower($url),".media.$ext");
+    $mtime = @filemtime($local); // 0 if not exists
+
+    //decide if download needed:
+    if(($mtime == 0) || // cache does not exist
+        ($cache != -1 && $mtime < time() - $cache) // 'recache' and cache has expired
+    ) {
+        if(media_image_download($url, $local)) {
+            return $local;
+        } else {
+            return false;
+        }
+    }
+
+    //if cache exists use it else
+    if($mtime) return $local;
+
+    //else return false
+    return false;
+}
+
+/**
+ * Download image files
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param string $url
+ * @param string $file path to file in which to put the downloaded content
+ * @return bool
+ */
+function media_image_download($url,$file){
+    global $conf;
+    $http = new DokuHTTPClient();
+    $http->keep_alive = false; // we do single ops here, no need for keep-alive
+
+    $http->max_bodysize = $conf['fetchsize'];
+    $http->timeout = 25; //max. 25 sec
+    $http->header_regexp = '!\r\nContent-Type: image/(jpe?g|gif|png)!i';
+
+    $data = $http->get($url);
+    if(!$data) return false;
+
+    $fileexists = file_exists($file);
+    $fp = @fopen($file,"w");
+    if(!$fp) return false;
+    fwrite($fp,$data);
+    fclose($fp);
+    if(!$fileexists and $conf['fperm']) chmod($file, $conf['fperm']);
+
+    // check if it is really an image
+    $info = @getimagesize($file);
+    if(!$info){
+        @unlink($file);
+        return false;
+    }
+
+    return true;
+}
+
+/**
+ * resize images using external ImageMagick convert program
+ *
+ * @author Pavel Vitis <Pavel.Vitis@seznam.cz>
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param string $ext     extension
+ * @param string $from    filename path to file
+ * @param int    $from_w  original width
+ * @param int    $from_h  original height
+ * @param string $to      path to resized file
+ * @param int    $to_w    desired width
+ * @param int    $to_h    desired height
+ * @return bool
+ */
+function media_resize_imageIM($ext,$from,$from_w,$from_h,$to,$to_w,$to_h){
+    global $conf;
+
+    // check if convert is configured
+    if(!$conf['im_convert']) return false;
+
+    // prepare command
+    $cmd  = $conf['im_convert'];
+    $cmd .= ' -resize '.$to_w.'x'.$to_h.'!';
+    if ($ext == 'jpg' || $ext == 'jpeg') {
+        $cmd .= ' -quality '.$conf['jpg_quality'];
+    }
+    $cmd .= " $from $to";
+
+    @exec($cmd,$out,$retval);
+    if ($retval == 0) return true;
+    return false;
+}
+
+/**
+ * crop images using external ImageMagick convert program
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param string $ext     extension
+ * @param string $from    filename path to file
+ * @param int    $from_w  original width
+ * @param int    $from_h  original height
+ * @param string $to      path to resized file
+ * @param int    $to_w    desired width
+ * @param int    $to_h    desired height
+ * @param int    $ofs_x   offset of crop centre
+ * @param int    $ofs_y   offset of crop centre
+ * @return bool
+ */
+function media_crop_imageIM($ext,$from,$from_w,$from_h,$to,$to_w,$to_h,$ofs_x,$ofs_y){
+    global $conf;
+
+    // check if convert is configured
+    if(!$conf['im_convert']) return false;
+
+    // prepare command
+    $cmd  = $conf['im_convert'];
+    $cmd .= ' -crop '.$to_w.'x'.$to_h.'+'.$ofs_x.'+'.$ofs_y;
+    if ($ext == 'jpg' || $ext == 'jpeg') {
+        $cmd .= ' -quality '.$conf['jpg_quality'];
+    }
+    $cmd .= " $from $to";
+
+    @exec($cmd,$out,$retval);
+    if ($retval == 0) return true;
+    return false;
+}
+
+/**
+ * resize or crop images using PHP's libGD support
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @author Sebastian Wienecke <s_wienecke@web.de>
+ *
+ * @param string $ext     extension
+ * @param string $from    filename path to file
+ * @param int    $from_w  original width
+ * @param int    $from_h  original height
+ * @param string $to      path to resized file
+ * @param int    $to_w    desired width
+ * @param int    $to_h    desired height
+ * @param int    $ofs_x   offset of crop centre
+ * @param int    $ofs_y   offset of crop centre
+ * @return bool
+ */
+function media_resize_imageGD($ext,$from,$from_w,$from_h,$to,$to_w,$to_h,$ofs_x=0,$ofs_y=0){
+    global $conf;
+
+    if($conf['gdlib'] < 1) return false; //no GDlib available or wanted
+
+    // check available memory
+    if(!is_mem_available(($from_w * $from_h * 4) + ($to_w * $to_h * 4))){
+        return false;
+    }
+
+    // create an image of the given filetype
+    $image = false;
+    if ($ext == 'jpg' || $ext == 'jpeg'){
+        if(!function_exists("imagecreatefromjpeg")) return false;
+        $image = @imagecreatefromjpeg($from);
+    }elseif($ext == 'png') {
+        if(!function_exists("imagecreatefrompng")) return false;
+        $image = @imagecreatefrompng($from);
+
+    }elseif($ext == 'gif') {
+        if(!function_exists("imagecreatefromgif")) return false;
+        $image = @imagecreatefromgif($from);
+    }
+    if(!$image) return false;
+
+    $newimg = false;
+    if(($conf['gdlib']>1) && function_exists("imagecreatetruecolor") && $ext != 'gif'){
+        $newimg = @imagecreatetruecolor ($to_w, $to_h);
+    }
+    if(!$newimg) $newimg = @imagecreate($to_w, $to_h);
+    if(!$newimg){
+        imagedestroy($image);
+        return false;
+    }
+
+    //keep png alpha channel if possible
+    if($ext == 'png' && $conf['gdlib']>1 && function_exists('imagesavealpha')){
+        imagealphablending($newimg, false);
+        imagesavealpha($newimg,true);
+    }
+
+    //keep gif transparent color if possible
+    if($ext == 'gif' && function_exists('imagefill') && function_exists('imagecolorallocate')) {
+        if(function_exists('imagecolorsforindex') && function_exists('imagecolortransparent')) {
+            $transcolorindex = @imagecolortransparent($image);
+            if($transcolorindex >= 0 ) { //transparent color exists
+                $transcolor = @imagecolorsforindex($image, $transcolorindex);
+                $transcolorindex = @imagecolorallocate($newimg, $transcolor['red'], $transcolor['green'], $transcolor['blue']);
+                @imagefill($newimg, 0, 0, $transcolorindex);
+                @imagecolortransparent($newimg, $transcolorindex);
+            }else{ //filling with white
+                $whitecolorindex = @imagecolorallocate($newimg, 255, 255, 255);
+                @imagefill($newimg, 0, 0, $whitecolorindex);
+            }
+        }else{ //filling with white
+            $whitecolorindex = @imagecolorallocate($newimg, 255, 255, 255);
+            @imagefill($newimg, 0, 0, $whitecolorindex);
+        }
+    }
+
+    //try resampling first
+    if(function_exists("imagecopyresampled")){
+        if(!@imagecopyresampled($newimg, $image, 0, 0, $ofs_x, $ofs_y, $to_w, $to_h, $from_w, $from_h)) {
+            imagecopyresized($newimg, $image, 0, 0, $ofs_x, $ofs_y, $to_w, $to_h, $from_w, $from_h);
+        }
+    }else{
+        imagecopyresized($newimg, $image, 0, 0, $ofs_x, $ofs_y, $to_w, $to_h, $from_w, $from_h);
+    }
+
+    $okay = false;
+    if ($ext == 'jpg' || $ext == 'jpeg'){
+        if(!function_exists('imagejpeg')){
+            $okay = false;
+        }else{
+            $okay = imagejpeg($newimg, $to, $conf['jpg_quality']);
+        }
+    }elseif($ext == 'png') {
+        if(!function_exists('imagepng')){
+            $okay = false;
+        }else{
+            $okay =  imagepng($newimg, $to);
+        }
+    }elseif($ext == 'gif') {
+        if(!function_exists('imagegif')){
+            $okay = false;
+        }else{
+            $okay = imagegif($newimg, $to);
+        }
+    }
+
+    // destroy GD image ressources
+    if($image) imagedestroy($image);
+    if($newimg) imagedestroy($newimg);
+
+    return $okay;
+}
+
+/**
+ * Return other media files with the same base name
+ * but different extensions.
+ *
+ * @param string   $src     - ID of media file
+ * @param string[] $exts    - alternative extensions to find other files for
+ * @return array            - array(mime type => file ID)
+ *
+ * @author Anika Henke <anika@selfthinker.org>
+ */
+function media_alternativefiles($src, $exts){
+
+    $files = array();
+    list($srcExt, /* $srcMime */) = mimetype($src);
+    $filebase = substr($src, 0, -1 * (strlen($srcExt)+1));
+
+    foreach($exts as $ext) {
+        $fileid = $filebase.'.'.$ext;
+        $file = mediaFN($fileid);
+        if(file_exists($file)) {
+            list(/* $fileExt */, $fileMime) = mimetype($file);
+            $files[$fileMime] = $fileid;
+        }
+    }
+    return $files;
+}
+
+/**
+ * Check if video/audio is supported to be embedded.
+ *
+ * @param string $mime      - mimetype of media file
+ * @param string $type      - type of media files to check ('video', 'audio', or null for all)
+ * @return boolean
+ *
+ * @author Anika Henke <anika@selfthinker.org>
+ */
+function media_supportedav($mime, $type=NULL){
+    $supportedAudio = array(
+        'ogg' => 'audio/ogg',
+        'mp3' => 'audio/mpeg',
+        'wav' => 'audio/wav',
+    );
+    $supportedVideo = array(
+        'webm' => 'video/webm',
+        'ogv' => 'video/ogg',
+        'mp4' => 'video/mp4',
+    );
+    if ($type == 'audio') {
+        $supportedAv = $supportedAudio;
+    } elseif ($type == 'video') {
+        $supportedAv = $supportedVideo;
+    } else {
+        $supportedAv = array_merge($supportedAudio, $supportedVideo);
+    }
+    return in_array($mime, $supportedAv);
+}
+
+/**
+ * Return track media files with the same base name
+ * but extensions that indicate kind and lang.
+ * ie for foo.webm search foo.sub.lang.vtt, foo.cap.lang.vtt...
+ *
+ * @param string   $src     - ID of media file
+ * @return array            - array(mediaID => array( kind, srclang ))
+ *
+ * @author Schplurtz le Déboulonné <Schplurtz@laposte.net>
+ */
+function media_trackfiles($src){
+    $kinds=array(
+        'sub' => 'subtitles',
+        'cap' => 'captions',
+        'des' => 'descriptions',
+        'cha' => 'chapters',
+        'met' => 'metadata'
+    );
+
+    $files = array();
+    $re='/\\.(sub|cap|des|cha|met)\\.([^.]+)\\.vtt$/';
+    $baseid=pathinfo($src, PATHINFO_FILENAME);
+    $pattern=mediaFN($baseid).'.*.*.vtt';
+    $list=glob($pattern);
+    foreach($list as $track) {
+        if(preg_match($re, $track, $matches)){
+            $files[$baseid.'.'.$matches[1].'.'.$matches[2].'.vtt']=array(
+                $kinds[$matches[1]],
+                $matches[2],
+            );
+        }
+    }
+    return $files;
+}
+
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
diff --git a/wiki/inc/pageutils.php b/wiki/inc/pageutils.php
new file mode 100644
index 0000000..55eda55
--- /dev/null
+++ b/wiki/inc/pageutils.php
@@ -0,0 +1,775 @@
+<?php
+/**
+ * Utilities for handling pagenames
+ *
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author     Andreas Gohr <andi@splitbrain.org>
+ * @todo       Combine similar functions like {wiki,media,meta}FN()
+ */
+
+/**
+ * Fetch the an ID from request
+ *
+ * Uses either standard $_REQUEST variable or extracts it from
+ * the full request URI when userewrite is set to 2
+ *
+ * For $param='id' $conf['start'] is returned if no id was found.
+ * If the second parameter is true (default) the ID is cleaned.
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param string $param  the $_REQUEST variable name, default 'id'
+ * @param bool   $clean  if true, ID is cleaned
+ * @return string
+ */
+function getID($param='id',$clean=true){
+    /** @var Input $INPUT */
+    global $INPUT;
+    global $conf;
+    global $ACT;
+
+    $id = $INPUT->str($param);
+
+    //construct page id from request URI
+    if(empty($id) && $conf['userewrite'] == 2){
+        $request = $INPUT->server->str('REQUEST_URI');
+        $script = '';
+
+        //get the script URL
+        if($conf['basedir']){
+            $relpath = '';
+            if($param != 'id') {
+                $relpath = 'lib/exe/';
+            }
+            $script = $conf['basedir'].$relpath.utf8_basename($INPUT->server->str('SCRIPT_FILENAME'));
+
+        }elseif($INPUT->server->str('PATH_INFO')){
+            $request = $INPUT->server->str('PATH_INFO');
+        }elseif($INPUT->server->str('SCRIPT_NAME')){
+            $script = $INPUT->server->str('SCRIPT_NAME');
+        }elseif($INPUT->server->str('DOCUMENT_ROOT') && $INPUT->server->str('SCRIPT_FILENAME')){
+            $script = preg_replace ('/^'.preg_quote($INPUT->server->str('DOCUMENT_ROOT'),'/').'/','',
+                    $INPUT->server->str('SCRIPT_FILENAME'));
+            $script = '/'.$script;
+        }
+
+        //clean script and request (fixes a windows problem)
+        $script  = preg_replace('/\/\/+/','/',$script);
+        $request = preg_replace('/\/\/+/','/',$request);
+
+        //remove script URL and Querystring to gain the id
+        if(preg_match('/^'.preg_quote($script,'/').'(.*)/',$request, $match)){
+            $id = preg_replace ('/\?.*/','',$match[1]);
+        }
+        $id = urldecode($id);
+        //strip leading slashes
+        $id = preg_replace('!^/+!','',$id);
+    }
+
+    // Namespace autolinking from URL
+    if(substr($id,-1) == ':' || ($conf['useslash'] && substr($id,-1) == '/')){
+        if(page_exists($id.$conf['start'])){
+            // start page inside namespace
+            $id = $id.$conf['start'];
+        }elseif(page_exists($id.noNS(cleanID($id)))){
+            // page named like the NS inside the NS
+            $id = $id.noNS(cleanID($id));
+        }elseif(page_exists($id)){
+            // page like namespace exists
+            $id = substr($id,0,-1);
+        }else{
+            // fall back to default
+            $id = $id.$conf['start'];
+        }
+        if (isset($ACT) && $ACT === 'show') {
+            $urlParameters = $_GET;
+            if (isset($urlParameters['id'])) {
+                unset($urlParameters['id']);
+            }
+            send_redirect(wl($id,$urlParameters,true));
+        }
+    }
+
+    if($clean) $id = cleanID($id);
+    if(empty($id) && $param=='id') $id = $conf['start'];
+
+    return $id;
+}
+
+/**
+ * Remove unwanted chars from ID
+ *
+ * Cleans a given ID to only use allowed characters. Accented characters are
+ * converted to unaccented ones
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param  string  $raw_id    The pageid to clean
+ * @param  boolean $ascii     Force ASCII
+ * @return string cleaned id
+ */
+function cleanID($raw_id,$ascii=false){
+    global $conf;
+    static $sepcharpat = null;
+
+    global $cache_cleanid;
+    $cache = & $cache_cleanid;
+
+    // check if it's already in the memory cache
+    if (!$ascii && isset($cache[(string)$raw_id])) {
+        return $cache[(string)$raw_id];
+    }
+
+    $sepchar = $conf['sepchar'];
+    if($sepcharpat == null) // build string only once to save clock cycles
+        $sepcharpat = '#\\'.$sepchar.'+#';
+
+    $id = trim((string)$raw_id);
+    $id = utf8_strtolower($id);
+
+    //alternative namespace seperator
+    if($conf['useslash']){
+        $id = strtr($id,';/','::');
+    }else{
+        $id = strtr($id,';/',':'.$sepchar);
+    }
+
+    if($conf['deaccent'] == 2 || $ascii) $id = utf8_romanize($id);
+    if($conf['deaccent'] || $ascii) $id = utf8_deaccent($id,-1);
+
+    //remove specials
+    $id = utf8_stripspecials($id,$sepchar,'\*');
+
+    if($ascii) $id = utf8_strip($id);
+
+    //clean up
+    $id = preg_replace($sepcharpat,$sepchar,$id);
+    $id = preg_replace('#:+#',':',$id);
+    $id = trim($id,':._-');
+    $id = preg_replace('#:[:\._\-]+#',':',$id);
+    $id = preg_replace('#[:\._\-]+:#',':',$id);
+
+    if (!$ascii) $cache[(string)$raw_id] = $id;
+    return($id);
+}
+
+/**
+ * Return namespacepart of a wiki ID
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param string $id
+ * @return string|false the namespace part or false if the given ID has no namespace (root)
+ */
+function getNS($id){
+    $pos = strrpos((string)$id,':');
+    if($pos!==false){
+        return substr((string)$id,0,$pos);
+    }
+    return false;
+}
+
+/**
+ * Returns the ID without the namespace
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param string $id
+ * @return string
+ */
+function noNS($id) {
+    $pos = strrpos($id, ':');
+    if ($pos!==false) {
+        return substr($id, $pos+1);
+    } else {
+        return $id;
+    }
+}
+
+/**
+ * Returns the current namespace
+ *
+ * @author Nathan Fritz <fritzn@crown.edu>
+ *
+ * @param string $id
+ * @return string
+ */
+function curNS($id) {
+    return noNS(getNS($id));
+}
+
+/**
+ * Returns the ID without the namespace or current namespace for 'start' pages
+ *
+ * @author Nathan Fritz <fritzn@crown.edu>
+ *
+ * @param string $id
+ * @return string
+ */
+function noNSorNS($id) {
+    global $conf;
+
+    $p = noNS($id);
+    if ($p == $conf['start'] || $p == false) {
+        $p = curNS($id);
+        if ($p == false) {
+            return $conf['start'];
+        }
+    }
+    return $p;
+}
+
+/**
+ * Creates a XHTML valid linkid from a given headline title
+ *
+ * @param string  $title   The headline title
+ * @param array|bool   $check   Existing IDs (title => number)
+ * @return string the title
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+function sectionID($title,&$check) {
+    $title = str_replace(array(':','.'),'',cleanID($title));
+    $new = ltrim($title,'0123456789_-');
+    if(empty($new)){
+        $title = 'section'.preg_replace('/[^0-9]+/','',$title); //keep numbers from headline
+    }else{
+        $title = $new;
+    }
+
+    if(is_array($check)){
+        // make sure tiles are unique
+        if (!array_key_exists ($title,$check)) {
+            $check[$title] = 0;
+        } else {
+            $title .= ++ $check[$title];
+        }
+    }
+
+    return $title;
+}
+
+/**
+ * Wiki page existence check
+ *
+ * parameters as for wikiFN
+ *
+ * @author Chris Smith <chris@jalakai.co.uk>
+ *
+ * @param string $id page id
+ * @param string|int $rev empty or revision timestamp
+ * @param bool $clean flag indicating that $id should be cleaned (see wikiFN as well)
+ * @param bool $date_at
+ * @return bool exists?
+ */
+function page_exists($id,$rev='',$clean=true, $date_at=false) {
+    if($rev !== '' && $date_at) {
+        $pagelog = new PageChangeLog($id);
+        $pagelog_rev = $pagelog->getLastRevisionAt($rev);
+        if($pagelog_rev !== false)
+            $rev = $pagelog_rev;
+    }
+    return file_exists(wikiFN($id,$rev,$clean));
+}
+
+/**
+ * returns the full path to the datafile specified by ID and optional revision
+ *
+ * The filename is URL encoded to protect Unicode chars
+ *
+ * @param  $raw_id  string   id of wikipage
+ * @param  $rev     int|string   page revision, empty string for current
+ * @param  $clean   bool     flag indicating that $raw_id should be cleaned.  Only set to false
+ *                           when $id is guaranteed to have been cleaned already.
+ * @return string full path
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+function wikiFN($raw_id,$rev='',$clean=true){
+    global $conf;
+
+    global $cache_wikifn;
+    $cache = & $cache_wikifn;
+
+    $id = $raw_id;
+
+    if ($clean) $id = cleanID($id);
+    $id = str_replace(':','/',$id);
+
+    if (isset($cache[$id]) && isset($cache[$id][$rev])) {
+        return $cache[$id][$rev];
+    }
+
+    if(empty($rev)){
+        $fn = $conf['datadir'].'/'.utf8_encodeFN($id).'.txt';
+    }else{
+        $fn = $conf['olddir'].'/'.utf8_encodeFN($id).'.'.$rev.'.txt';
+        if($conf['compression']){
+            //test for extensions here, we want to read both compressions
+            if (file_exists($fn . '.gz')){
+                $fn .= '.gz';
+            }else if(file_exists($fn . '.bz2')){
+                $fn .= '.bz2';
+            }else{
+                //file doesnt exist yet, so we take the configured extension
+                $fn .= '.' . $conf['compression'];
+            }
+        }
+    }
+
+    if (!isset($cache[$id])) { $cache[$id] = array(); }
+    $cache[$id][$rev] = $fn;
+    return $fn;
+}
+
+/**
+ * Returns the full path to the file for locking the page while editing.
+ *
+ * @author Ben Coburn <btcoburn@silicodon.net>
+ *
+ * @param string $id page id
+ * @return string full path
+ */
+function wikiLockFN($id) {
+    global $conf;
+    return $conf['lockdir'].'/'.md5(cleanID($id)).'.lock';
+}
+
+
+/**
+ * returns the full path to the meta file specified by ID and extension
+ *
+ * @author Steven Danz <steven-danz@kc.rr.com>
+ *
+ * @param string $id   page id
+ * @param string $ext  file extension
+ * @return string full path
+ */
+function metaFN($id,$ext){
+    global $conf;
+    $id = cleanID($id);
+    $id = str_replace(':','/',$id);
+    $fn = $conf['metadir'].'/'.utf8_encodeFN($id).$ext;
+    return $fn;
+}
+
+/**
+ * returns the full path to the media's meta file specified by ID and extension
+ *
+ * @author Kate Arzamastseva <pshns@ukr.net>
+ *
+ * @param string $id   media id
+ * @param string $ext  extension of media
+ * @return string
+ */
+function mediaMetaFN($id,$ext){
+    global $conf;
+    $id = cleanID($id);
+    $id = str_replace(':','/',$id);
+    $fn = $conf['mediametadir'].'/'.utf8_encodeFN($id).$ext;
+    return $fn;
+}
+
+/**
+ * returns an array of full paths to all metafiles of a given ID
+ *
+ * @author Esther Brunner <esther@kaffeehaus.ch>
+ * @author Michael Hamann <michael@content-space.de>
+ *
+ * @param string $id page id
+ * @return array
+ */
+function metaFiles($id){
+    $basename = metaFN($id, '');
+    $files    = glob($basename.'.*', GLOB_MARK);
+    // filter files like foo.bar.meta when $id == 'foo'
+    return    $files ? preg_grep('/^'.preg_quote($basename, '/').'\.[^.\/]*$/u', $files) : array();
+}
+
+/**
+ * returns the full path to the mediafile specified by ID
+ *
+ * The filename is URL encoded to protect Unicode chars
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @author Kate Arzamastseva <pshns@ukr.net>
+ *
+ * @param string     $id  media id
+ * @param string|int $rev empty string or revision timestamp
+ * @param bool $clean
+ *
+ * @return string full path
+ */
+function mediaFN($id, $rev='', $clean=true){
+    global $conf;
+    if ($clean) $id = cleanID($id);
+    $id = str_replace(':','/',$id);
+    if(empty($rev)){
+        $fn = $conf['mediadir'].'/'.utf8_encodeFN($id);
+    }else{
+        $ext = mimetype($id);
+        $name = substr($id,0, -1*strlen($ext[0])-1);
+        $fn = $conf['mediaolddir'].'/'.utf8_encodeFN($name .'.'.( (int) $rev ).'.'.$ext[0]);
+    }
+    return $fn;
+}
+
+/**
+ * Returns the full filepath to a localized file if local
+ * version isn't found the english one is returned
+ *
+ * @param  string $id  The id of the local file
+ * @param  string $ext The file extension (usually txt)
+ * @return string full filepath to localized file
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+function localeFN($id,$ext='txt'){
+    global $conf;
+    $file = DOKU_CONF.'lang/'.$conf['lang'].'/'.$id.'.'.$ext;
+    if(!file_exists($file)){
+        $file = DOKU_INC.'inc/lang/'.$conf['lang'].'/'.$id.'.'.$ext;
+        if(!file_exists($file)){
+            //fall back to english
+            $file = DOKU_INC.'inc/lang/en/'.$id.'.'.$ext;
+        }
+    }
+    return $file;
+}
+
+/**
+ * Resolve relative paths in IDs
+ *
+ * Do not call directly use resolve_mediaid or resolve_pageid
+ * instead
+ *
+ * Partyly based on a cleanPath function found at
+ * http://php.net/manual/en/function.realpath.php#57016
+ *
+ * @author <bart at mediawave dot nl>
+ *
+ * @param string $ns     namespace which is context of id
+ * @param string $id     relative id
+ * @param bool   $clean  flag indicating that id should be cleaned
+ * @return string
+ */
+function resolve_id($ns,$id,$clean=true){
+    global $conf;
+
+    // some pre cleaning for useslash:
+    if($conf['useslash']) $id = str_replace('/',':',$id);
+
+    // if the id starts with a dot we need to handle the
+    // relative stuff
+    if($id && $id{0} == '.'){
+        // normalize initial dots without a colon
+        $id = preg_replace('/^(\.+)(?=[^:\.])/','\1:',$id);
+        // prepend the current namespace
+        $id = $ns.':'.$id;
+
+        // cleanup relatives
+        $result = array();
+        $pathA  = explode(':', $id);
+        if (!$pathA[0]) $result[] = '';
+        foreach ($pathA AS $key => $dir) {
+            if ($dir == '..') {
+                if (end($result) == '..') {
+                    $result[] = '..';
+                } elseif (!array_pop($result)) {
+                    $result[] = '..';
+                }
+            } elseif ($dir && $dir != '.') {
+                $result[] = $dir;
+            }
+        }
+        if (!end($pathA)) $result[] = '';
+        $id = implode(':', $result);
+    }elseif($ns !== false && strpos($id,':') === false){
+        //if link contains no namespace. add current namespace (if any)
+        $id = $ns.':'.$id;
+    }
+
+    if($clean) $id = cleanID($id);
+    return $id;
+}
+
+/**
+ * Returns a full media id
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param string $ns namespace which is context of id
+ * @param string &$page (reference) relative media id, updated to resolved id
+ * @param bool &$exists (reference) updated with existance of media
+ * @param int|string $rev
+ * @param bool $date_at
+ */
+function resolve_mediaid($ns,&$page,&$exists,$rev='',$date_at=false){
+    $page   = resolve_id($ns,$page);
+    if($rev !== '' &&  $date_at){
+        $medialog = new MediaChangeLog($page);
+        $medialog_rev = $medialog->getLastRevisionAt($rev);
+        if($medialog_rev !== false) {
+            $rev = $medialog_rev;
+        }
+    }
+
+    $file   = mediaFN($page,$rev);
+    $exists = file_exists($file);
+}
+
+/**
+ * Returns a full page id
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param string $ns namespace which is context of id
+ * @param string &$page (reference) relative page id, updated to resolved id
+ * @param bool &$exists (reference) updated with existance of media
+ * @param string $rev
+ * @param bool $date_at
+ */
+function resolve_pageid($ns,&$page,&$exists,$rev='',$date_at=false ){
+    global $conf;
+    global $ID;
+    $exists = false;
+
+    //empty address should point to current page
+    if ($page === "") {
+        $page = $ID;
+    }
+
+    //keep hashlink if exists then clean both parts
+    if (strpos($page,'#')) {
+        list($page,$hash) = explode('#',$page,2);
+    } else {
+        $hash = '';
+    }
+    $hash = cleanID($hash);
+    $page = resolve_id($ns,$page,false); // resolve but don't clean, yet
+
+    // get filename (calls clean itself)
+    if($rev !== '' && $date_at) {
+        $pagelog = new PageChangeLog($page);
+        $pagelog_rev = $pagelog->getLastRevisionAt($rev);
+        if($pagelog_rev !== false)//something found
+           $rev  = $pagelog_rev;
+    }
+    $file = wikiFN($page,$rev);
+
+    // if ends with colon or slash we have a namespace link
+    if(in_array(substr($page,-1), array(':', ';')) ||
+       ($conf['useslash'] && substr($page,-1) == '/')){
+        if(page_exists($page.$conf['start'],$rev,true,$date_at)){
+            // start page inside namespace
+            $page = $page.$conf['start'];
+            $exists = true;
+        }elseif(page_exists($page.noNS(cleanID($page)),$rev,true,$date_at)){
+            // page named like the NS inside the NS
+            $page = $page.noNS(cleanID($page));
+            $exists = true;
+        }elseif(page_exists($page,$rev,true,$date_at)){
+            // page like namespace exists
+            $page = $page;
+            $exists = true;
+        }else{
+            // fall back to default
+            $page = $page.$conf['start'];
+        }
+    }else{
+        //check alternative plural/nonplural form
+        if(!file_exists($file)){
+            if( $conf['autoplural'] ){
+                if(substr($page,-1) == 's'){
+                    $try = substr($page,0,-1);
+                }else{
+                    $try = $page.'s';
+                }
+                if(page_exists($try,$rev,true,$date_at)){
+                    $page   = $try;
+                    $exists = true;
+                }
+            }
+        }else{
+            $exists = true;
+        }
+    }
+
+    // now make sure we have a clean page
+    $page = cleanID($page);
+
+    //add hash if any
+    if(!empty($hash)) $page .= '#'.$hash;
+}
+
+/**
+ * Returns the name of a cachefile from given data
+ *
+ * The needed directory is created by this function!
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param string $data  This data is used to create a unique md5 name
+ * @param string $ext   This is appended to the filename if given
+ * @return string       The filename of the cachefile
+ */
+function getCacheName($data,$ext=''){
+    global $conf;
+    $md5  = md5($data);
+    $file = $conf['cachedir'].'/'.$md5{0}.'/'.$md5.$ext;
+    io_makeFileDir($file);
+    return $file;
+}
+
+/**
+ * Checks a pageid against $conf['hidepages']
+ *
+ * @author Andreas Gohr <gohr@cosmocode.de>
+ *
+ * @param string $id page id
+ * @return bool
+ */
+function isHiddenPage($id){
+    $data = array(
+        'id' => $id,
+        'hidden' => false
+    );
+    trigger_event('PAGEUTILS_ID_HIDEPAGE', $data, '_isHiddenPage');
+    return $data['hidden'];
+}
+
+/**
+ * callback checks if page is hidden
+ *
+ * @param array $data event data    - see isHiddenPage()
+ */
+function _isHiddenPage(&$data) {
+    global $conf;
+    global $ACT;
+
+    if ($data['hidden']) return;
+    if(empty($conf['hidepages'])) return;
+    if($ACT == 'admin') return;
+
+    if(preg_match('/'.$conf['hidepages'].'/ui',':'.$data['id'])){
+        $data['hidden'] = true;
+    }
+}
+
+/**
+ * Reverse of isHiddenPage
+ *
+ * @author Andreas Gohr <gohr@cosmocode.de>
+ *
+ * @param string $id page id
+ * @return bool
+ */
+function isVisiblePage($id){
+    return !isHiddenPage($id);
+}
+
+/**
+ * Format an id for output to a user
+ *
+ * Namespaces are denoted by a trailing “:*”. The root namespace is
+ * “*”. Output is escaped.
+ *
+ * @author Adrian Lang <lang@cosmocode.de>
+ *
+ * @param string $id page id
+ * @return string
+ */
+function prettyprint_id($id) {
+    if (!$id || $id === ':') {
+        return '*';
+    }
+    if ((substr($id, -1, 1) === ':')) {
+        $id .= '*';
+    }
+    return hsc($id);
+}
+
+/**
+ * Encode a UTF-8 filename to use on any filesystem
+ *
+ * Uses the 'fnencode' option to determine encoding
+ *
+ * When the second parameter is true the string will
+ * be encoded only if non ASCII characters are detected -
+ * This makes it safe to run it multiple times on the
+ * same string (default is true)
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @see    urlencode
+ *
+ * @param string $file file name
+ * @param bool   $safe if true, only encoded when non ASCII characters detected
+ * @return string
+ */
+function utf8_encodeFN($file,$safe=true){
+    global $conf;
+    if($conf['fnencode'] == 'utf-8') return $file;
+
+    if($safe && preg_match('#^[a-zA-Z0-9/_\-\.%]+$#',$file)){
+        return $file;
+    }
+
+    if($conf['fnencode'] == 'safe'){
+        return SafeFN::encode($file);
+    }
+
+    $file = urlencode($file);
+    $file = str_replace('%2F','/',$file);
+    return $file;
+}
+
+/**
+ * Decode a filename back to UTF-8
+ *
+ * Uses the 'fnencode' option to determine encoding
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @see    urldecode
+ *
+ * @param string $file file name
+ * @return string
+ */
+function utf8_decodeFN($file){
+    global $conf;
+    if($conf['fnencode'] == 'utf-8') return $file;
+
+    if($conf['fnencode'] == 'safe'){
+        return SafeFN::decode($file);
+    }
+
+    return urldecode($file);
+}
+
+/**
+ * Find a page in the current namespace (determined from $ID) or any
+ * higher namespace that can be accessed by the current user,
+ * this condition can be overriden by an optional parameter.
+ *
+ * Used for sidebars, but can be used other stuff as well
+ *
+ * @todo   add event hook
+ *
+ * @param  string $page the pagename you're looking for
+ * @param bool $useacl only return pages readable by the current user, false to ignore ACLs
+ * @return false|string the full page id of the found page, false if any
+ */
+function page_findnearest($page, $useacl = true){
+    if (!$page) return false;
+    global $ID;
+
+    $ns = $ID;
+    do {
+        $ns = getNS($ns);
+        $pageid = cleanID("$ns:$page");
+        if(page_exists($pageid) && (!$useacl || auth_quickaclcheck($pageid) >= AUTH_READ)){
+            return $pageid;
+        }
+    } while($ns);
+
+    return false;
+}
diff --git a/wiki/inc/parser/code.php b/wiki/inc/parser/code.php
new file mode 100644
index 0000000..f91f1d2
--- /dev/null
+++ b/wiki/inc/parser/code.php
@@ -0,0 +1,73 @@
+<?php
+/**
+ * A simple renderer that allows downloading of code and file snippets
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+if(!defined('DOKU_INC')) die('meh.');
+
+class Doku_Renderer_code extends Doku_Renderer {
+    var $_codeblock = 0;
+
+    /**
+     * Send the wanted code block to the browser
+     *
+     * When the correct block was found it exits the script.
+     *
+     * @param string $text
+     * @param string $language
+     * @param string $filename
+     */
+    function code($text, $language = null, $filename = '') {
+        global $INPUT;
+        if(!$language) $language = 'txt';
+        $language = preg_replace(PREG_PATTERN_VALID_LANGUAGE, '', $language);
+        if(!$filename) $filename = 'snippet.'.$language;
+        $filename = utf8_basename($filename);
+        $filename = utf8_stripspecials($filename, '_');
+
+        // send CRLF to Windows clients
+        if(strpos($INPUT->server->str('HTTP_USER_AGENT'), 'Windows') !== false) {
+            $text = str_replace("\n", "\r\n", $text);
+        }
+
+        if($this->_codeblock == $INPUT->str('codeblock')) {
+            header("Content-Type: text/plain; charset=utf-8");
+            header("Content-Disposition: attachment; filename=$filename");
+            header("X-Robots-Tag: noindex");
+            echo trim($text, "\r\n");
+            exit;
+        }
+
+        $this->_codeblock++;
+    }
+
+    /**
+     * Wraps around code()
+     *
+     * @param string $text
+     * @param string $language
+     * @param string $filename
+     */
+    function file($text, $language = null, $filename = '') {
+        $this->code($text, $language, $filename);
+    }
+
+    /**
+     * This should never be reached, if it is send a 404
+     */
+    function document_end() {
+        http_status(404);
+        echo '404 - Not found';
+        exit;
+    }
+
+    /**
+     * Return the format of the renderer
+     *
+     * @returns string 'code'
+     */
+    function getFormat() {
+        return 'code';
+    }
+}
diff --git a/wiki/inc/parser/handler.php b/wiki/inc/parser/handler.php
new file mode 100644
index 0000000..780c6cf
--- /dev/null
+++ b/wiki/inc/parser/handler.php
@@ -0,0 +1,1811 @@
+<?php
+if(!defined('DOKU_INC')) die('meh.');
+if (!defined('DOKU_PARSER_EOL')) define('DOKU_PARSER_EOL',"\n");   // add this to make handling test cases simpler
+
+class Doku_Handler {
+
+    var $Renderer = null;
+
+    var $CallWriter = null;
+
+    var $calls = array();
+
+    var $status = array(
+        'section' => false,
+        'doublequote' => 0,
+    );
+
+    var $rewriteBlocks = true;
+
+    function __construct() {
+        $this->CallWriter = new Doku_Handler_CallWriter($this);
+    }
+
+    /**
+     * @param string $handler
+     * @param mixed $args
+     * @param integer|string $pos
+     */
+    function _addCall($handler, $args, $pos) {
+        $call = array($handler,$args, $pos);
+        $this->CallWriter->writeCall($call);
+    }
+
+    function addPluginCall($plugin, $args, $state, $pos, $match) {
+        $call = array('plugin',array($plugin, $args, $state, $match), $pos);
+        $this->CallWriter->writeCall($call);
+    }
+
+    function _finalize(){
+
+        $this->CallWriter->finalise();
+
+        if ( $this->status['section'] ) {
+            $last_call = end($this->calls);
+            array_push($this->calls,array('section_close',array(), $last_call[2]));
+        }
+
+        if ( $this->rewriteBlocks ) {
+            $B = new Doku_Handler_Block();
+            $this->calls = $B->process($this->calls);
+        }
+
+        trigger_event('PARSER_HANDLER_DONE',$this);
+
+        array_unshift($this->calls,array('document_start',array(),0));
+        $last_call = end($this->calls);
+        array_push($this->calls,array('document_end',array(),$last_call[2]));
+    }
+
+    /**
+     * fetch the current call and advance the pointer to the next one
+     *
+     * @return bool|mixed
+     */
+    function fetch() {
+        $call = current($this->calls);
+        if($call !== false) {
+            next($this->calls); //advance the pointer
+            return $call;
+        }
+        return false;
+    }
+
+
+    /**
+     * Special plugin handler
+     *
+     * This handler is called for all modes starting with 'plugin_'.
+     * An additional parameter with the plugin name is passed
+     *
+     * @author Andreas Gohr <andi@splitbrain.org>
+     *
+     * @param string|integer $match
+     * @param string|integer $state
+     * @param integer $pos
+     * @param $pluginname
+     *
+     * @return bool
+     */
+    function plugin($match, $state, $pos, $pluginname){
+        $data = array($match);
+        /** @var DokuWiki_Syntax_Plugin $plugin */
+        $plugin = plugin_load('syntax',$pluginname);
+        if($plugin != null){
+            $data = $plugin->handle($match, $state, $pos, $this);
+        }
+        if ($data !== false) {
+            $this->addPluginCall($pluginname,$data,$state,$pos,$match);
+        }
+        return true;
+    }
+
+    function base($match, $state, $pos) {
+        switch ( $state ) {
+            case DOKU_LEXER_UNMATCHED:
+                $this->_addCall('cdata',array($match), $pos);
+                return true;
+            break;
+        }
+    }
+
+    function header($match, $state, $pos) {
+        // get level and title
+        $title = trim($match);
+        $level = 7 - strspn($title,'=');
+        if($level < 1) $level = 1;
+        $title = trim($title,'=');
+        $title = trim($title);
+
+        if ($this->status['section']) $this->_addCall('section_close',array(),$pos);
+
+        $this->_addCall('header',array($title,$level,$pos), $pos);
+
+        $this->_addCall('section_open',array($level),$pos);
+        $this->status['section'] = true;
+        return true;
+    }
+
+    function notoc($match, $state, $pos) {
+        $this->_addCall('notoc',array(),$pos);
+        return true;
+    }
+
+    function nocache($match, $state, $pos) {
+        $this->_addCall('nocache',array(),$pos);
+        return true;
+    }
+
+    function linebreak($match, $state, $pos) {
+        $this->_addCall('linebreak',array(),$pos);
+        return true;
+    }
+
+    function eol($match, $state, $pos) {
+        $this->_addCall('eol',array(),$pos);
+        return true;
+    }
+
+    function hr($match, $state, $pos) {
+        $this->_addCall('hr',array(),$pos);
+        return true;
+    }
+
+    /**
+     * @param string|integer $match
+     * @param string|integer $state
+     * @param integer $pos
+     * @param string $name
+     */
+    function _nestingTag($match, $state, $pos, $name) {
+        switch ( $state ) {
+            case DOKU_LEXER_ENTER:
+                $this->_addCall($name.'_open', array(), $pos);
+            break;
+            case DOKU_LEXER_EXIT:
+                $this->_addCall($name.'_close', array(), $pos);
+            break;
+            case DOKU_LEXER_UNMATCHED:
+                $this->_addCall('cdata',array($match), $pos);
+            break;
+        }
+    }
+
+    function strong($match, $state, $pos) {
+        $this->_nestingTag($match, $state, $pos, 'strong');
+        return true;
+    }
+
+    function emphasis($match, $state, $pos) {
+        $this->_nestingTag($match, $state, $pos, 'emphasis');
+        return true;
+    }
+
+    function underline($match, $state, $pos) {
+        $this->_nestingTag($match, $state, $pos, 'underline');
+        return true;
+    }
+
+    function monospace($match, $state, $pos) {
+        $this->_nestingTag($match, $state, $pos, 'monospace');
+        return true;
+    }
+
+    function subscript($match, $state, $pos) {
+        $this->_nestingTag($match, $state, $pos, 'subscript');
+        return true;
+    }
+
+    function superscript($match, $state, $pos) {
+        $this->_nestingTag($match, $state, $pos, 'superscript');
+        return true;
+    }
+
+    function deleted($match, $state, $pos) {
+        $this->_nestingTag($match, $state, $pos, 'deleted');
+        return true;
+    }
+
+
+    function footnote($match, $state, $pos) {
+//        $this->_nestingTag($match, $state, $pos, 'footnote');
+        if (!isset($this->_footnote)) $this->_footnote = false;
+
+        switch ( $state ) {
+            case DOKU_LEXER_ENTER:
+                // footnotes can not be nested - however due to limitations in lexer it can't be prevented
+                // we will still enter a new footnote mode, we just do nothing
+                if ($this->_footnote) {
+                    $this->_addCall('cdata',array($match), $pos);
+                    break;
+                }
+
+                $this->_footnote = true;
+
+                $ReWriter = new Doku_Handler_Nest($this->CallWriter,'footnote_close');
+                $this->CallWriter = & $ReWriter;
+                $this->_addCall('footnote_open', array(), $pos);
+            break;
+            case DOKU_LEXER_EXIT:
+                // check whether we have already exitted the footnote mode, can happen if the modes were nested
+                if (!$this->_footnote) {
+                    $this->_addCall('cdata',array($match), $pos);
+                    break;
+                }
+
+                $this->_footnote = false;
+
+                $this->_addCall('footnote_close', array(), $pos);
+                $this->CallWriter->process();
+                $ReWriter = & $this->CallWriter;
+                $this->CallWriter = & $ReWriter->CallWriter;
+            break;
+            case DOKU_LEXER_UNMATCHED:
+                $this->_addCall('cdata', array($match), $pos);
+            break;
+        }
+        return true;
+    }
+
+    function listblock($match, $state, $pos) {
+        switch ( $state ) {
+            case DOKU_LEXER_ENTER:
+                $ReWriter = new Doku_Handler_List($this->CallWriter);
+                $this->CallWriter = & $ReWriter;
+                $this->_addCall('list_open', array($match), $pos);
+            break;
+            case DOKU_LEXER_EXIT:
+                $this->_addCall('list_close', array(), $pos);
+                $this->CallWriter->process();
+                $ReWriter = & $this->CallWriter;
+                $this->CallWriter = & $ReWriter->CallWriter;
+            break;
+            case DOKU_LEXER_MATCHED:
+                $this->_addCall('list_item', array($match), $pos);
+            break;
+            case DOKU_LEXER_UNMATCHED:
+                $this->_addCall('cdata', array($match), $pos);
+            break;
+        }
+        return true;
+    }
+
+    function unformatted($match, $state, $pos) {
+        if ( $state == DOKU_LEXER_UNMATCHED ) {
+            $this->_addCall('unformatted',array($match), $pos);
+        }
+        return true;
+    }
+
+    function php($match, $state, $pos) {
+        global $conf;
+        if ( $state == DOKU_LEXER_UNMATCHED ) {
+            $this->_addCall('php',array($match), $pos);
+        }
+        return true;
+    }
+
+    function phpblock($match, $state, $pos) {
+        global $conf;
+        if ( $state == DOKU_LEXER_UNMATCHED ) {
+            $this->_addCall('phpblock',array($match), $pos);
+        }
+        return true;
+    }
+
+    function html($match, $state, $pos) {
+        global $conf;
+        if ( $state == DOKU_LEXER_UNMATCHED ) {
+            $this->_addCall('html',array($match), $pos);
+        }
+        return true;
+    }
+
+    function htmlblock($match, $state, $pos) {
+        global $conf;
+        if ( $state == DOKU_LEXER_UNMATCHED ) {
+            $this->_addCall('htmlblock',array($match), $pos);
+        }
+        return true;
+    }
+
+    function preformatted($match, $state, $pos) {
+        switch ( $state ) {
+            case DOKU_LEXER_ENTER:
+                $ReWriter = new Doku_Handler_Preformatted($this->CallWriter);
+                $this->CallWriter = $ReWriter;
+                $this->_addCall('preformatted_start',array(), $pos);
+            break;
+            case DOKU_LEXER_EXIT:
+                $this->_addCall('preformatted_end',array(), $pos);
+                $this->CallWriter->process();
+                $ReWriter = & $this->CallWriter;
+                $this->CallWriter = & $ReWriter->CallWriter;
+            break;
+            case DOKU_LEXER_MATCHED:
+                $this->_addCall('preformatted_newline',array(), $pos);
+            break;
+            case DOKU_LEXER_UNMATCHED:
+                $this->_addCall('preformatted_content',array($match), $pos);
+            break;
+        }
+
+        return true;
+    }
+
+    function quote($match, $state, $pos) {
+
+        switch ( $state ) {
+
+            case DOKU_LEXER_ENTER:
+                $ReWriter = new Doku_Handler_Quote($this->CallWriter);
+                $this->CallWriter = & $ReWriter;
+                $this->_addCall('quote_start',array($match), $pos);
+            break;
+
+            case DOKU_LEXER_EXIT:
+                $this->_addCall('quote_end',array(), $pos);
+                $this->CallWriter->process();
+                $ReWriter = & $this->CallWriter;
+                $this->CallWriter = & $ReWriter->CallWriter;
+            break;
+
+            case DOKU_LEXER_MATCHED:
+                $this->_addCall('quote_newline',array($match), $pos);
+            break;
+
+            case DOKU_LEXER_UNMATCHED:
+                $this->_addCall('cdata',array($match), $pos);
+            break;
+
+        }
+
+        return true;
+    }
+
+    /**
+     * Internal function for parsing highlight options.
+     * $options is parsed for key value pairs separated by commas.
+     * A value might also be missing in which case the value will simple
+     * be set to true. Commas in strings are ignored, e.g. option="4,56"
+     * will work as expected and will only create one entry.
+     *
+     * @param string $options space separated list of key-value pairs,
+     *                        e.g. option1=123, option2="456"
+     * @return array|null     Array of key-value pairs $array['key'] = 'value';
+     *                        or null if no entries found
+     */
+    protected function parse_highlight_options ($options) {
+        $result = array();
+        preg_match_all('/(\w+(?:="[^"]*"))|(\w+(?:=[^\s]*))|(\w+[^=\s\]])(?:\s*)/', $options, $matches, PREG_SET_ORDER);
+        foreach ($matches as $match) {
+            $equal_sign = strpos($match [0], '=');
+            if ($equal_sign === false) {
+                $key = trim($match[0]);
+                $result [$key] = 1;
+            } else {
+                $key = substr($match[0], 0, $equal_sign);
+                $value = substr($match[0], $equal_sign+1);
+                $value = trim($value, '"');
+                if (strlen($value) > 0) {
+                    $result [$key] = $value;
+                } else {
+                    $result [$key] = 1;
+                }
+            }
+        }
+
+        // Check for supported options
+        $result = array_intersect_key(
+            $result,
+            array_flip(array(
+                'enable_line_numbers',
+                'start_line_numbers_at',
+                'highlight_lines_extra',
+                'enable_keyword_links')
+            )
+        );
+
+        // Sanitize values
+        if(isset($result['enable_line_numbers'])) {
+            if($result['enable_line_numbers'] === 'false') {
+                $result['enable_line_numbers'] = false;
+            }
+            $result['enable_line_numbers'] = (bool) $result['enable_line_numbers'];
+        }
+        if(isset($result['highlight_lines_extra'])) {
+            $result['highlight_lines_extra'] = array_map('intval', explode(',', $result['highlight_lines_extra']));
+            $result['highlight_lines_extra'] = array_filter($result['highlight_lines_extra']);
+            $result['highlight_lines_extra'] = array_unique($result['highlight_lines_extra']);
+        }
+        if(isset($result['start_line_numbers_at'])) {
+            $result['start_line_numbers_at'] = (int) $result['start_line_numbers_at'];
+        }
+        if(isset($result['enable_keyword_links'])) {
+            if($result['enable_keyword_links'] === 'false') {
+                $result['enable_keyword_links'] = false;
+            }
+            $result['enable_keyword_links'] = (bool) $result['enable_keyword_links'];
+        }
+        if (count($result) == 0) {
+            return null;
+        }
+
+        return $result;
+    }
+
+    function file($match, $state, $pos) {
+        return $this->code($match, $state, $pos, 'file');
+    }
+
+    function code($match, $state, $pos, $type='code') {
+        if ( $state == DOKU_LEXER_UNMATCHED ) {
+            $matches = explode('>',$match,2);
+            // Cut out variable options enclosed in []
+            preg_match('/\[.*\]/', $matches[0], $options);
+            if (!empty($options[0])) {
+                $matches[0] = str_replace($options[0], '', $matches[0]);
+            }
+            $param = preg_split('/\s+/', $matches[0], 2, PREG_SPLIT_NO_EMPTY);
+            while(count($param) < 2) array_push($param, null);
+            // We shortcut html here.
+            if ($param[0] == 'html') $param[0] = 'html4strict';
+            if ($param[0] == '-') $param[0] = null;
+            array_unshift($param, $matches[1]);
+            if (!empty($options[0])) {
+                $param [] = $this->parse_highlight_options ($options[0]);
+            }
+            $this->_addCall($type, $param, $pos);
+        }
+        return true;
+    }
+
+    function acronym($match, $state, $pos) {
+        $this->_addCall('acronym',array($match), $pos);
+        return true;
+    }
+
+    function smiley($match, $state, $pos) {
+        $this->_addCall('smiley',array($match), $pos);
+        return true;
+    }
+
+    function wordblock($match, $state, $pos) {
+        $this->_addCall('wordblock',array($match), $pos);
+        return true;
+    }
+
+    function entity($match, $state, $pos) {
+        $this->_addCall('entity',array($match), $pos);
+        return true;
+    }
+
+    function multiplyentity($match, $state, $pos) {
+        preg_match_all('/\d+/',$match,$matches);
+        $this->_addCall('multiplyentity',array($matches[0][0],$matches[0][1]), $pos);
+        return true;
+    }
+
+    function singlequoteopening($match, $state, $pos) {
+        $this->_addCall('singlequoteopening',array(), $pos);
+        return true;
+    }
+
+    function singlequoteclosing($match, $state, $pos) {
+        $this->_addCall('singlequoteclosing',array(), $pos);
+        return true;
+    }
+
+    function apostrophe($match, $state, $pos) {
+        $this->_addCall('apostrophe',array(), $pos);
+        return true;
+    }
+
+    function doublequoteopening($match, $state, $pos) {
+        $this->_addCall('doublequoteopening',array(), $pos);
+        $this->status['doublequote']++;
+        return true;
+    }
+
+    function doublequoteclosing($match, $state, $pos) {
+        if ($this->status['doublequote'] <= 0) {
+            $this->doublequoteopening($match, $state, $pos);
+        } else {
+            $this->_addCall('doublequoteclosing',array(), $pos);
+            $this->status['doublequote'] = max(0, --$this->status['doublequote']);
+        }
+        return true;
+    }
+
+    function camelcaselink($match, $state, $pos) {
+        $this->_addCall('camelcaselink',array($match), $pos);
+        return true;
+    }
+
+    /*
+    */
+    function internallink($match, $state, $pos) {
+        // Strip the opening and closing markup
+        $link = preg_replace(array('/^\[\[/','/\]\]$/u'),'',$match);
+
+        // Split title from URL
+        $link = explode('|',$link,2);
+        if ( !isset($link[1]) ) {
+            $link[1] = null;
+        } else if ( preg_match('/^\{\{[^\}]+\}\}$/',$link[1]) ) {
+            // If the title is an image, convert it to an array containing the image details
+            $link[1] = Doku_Handler_Parse_Media($link[1]);
+        }
+        $link[0] = trim($link[0]);
+
+        //decide which kind of link it is
+
+        if ( link_isinterwiki($link[0]) ) {
+            // Interwiki
+            $interwiki = explode('>',$link[0],2);
+            $this->_addCall(
+                'interwikilink',
+                array($link[0],$link[1],strtolower($interwiki[0]),$interwiki[1]),
+                $pos
+                );
+        }elseif ( preg_match('/^\\\\\\\\[^\\\\]+?\\\\/u',$link[0]) ) {
+            // Windows Share
+            $this->_addCall(
+                'windowssharelink',
+                array($link[0],$link[1]),
+                $pos
+                );
+        }elseif ( preg_match('#^([a-z0-9\-\.+]+?)://#i',$link[0]) ) {
+            // external link (accepts all protocols)
+            $this->_addCall(
+                    'externallink',
+                    array($link[0],$link[1]),
+                    $pos
+                    );
+        }elseif ( preg_match('<'.PREG_PATTERN_VALID_EMAIL.'>',$link[0]) ) {
+            // E-Mail (pattern above is defined in inc/mail.php)
+            $this->_addCall(
+                'emaillink',
+                array($link[0],$link[1]),
+                $pos
+                );
+        }elseif ( preg_match('!^#.+!',$link[0]) ){
+            // local link
+            $this->_addCall(
+                'locallink',
+                array(substr($link[0],1),$link[1]),
+                $pos
+                );
+        }else{
+            // internal link
+            $this->_addCall(
+                'internallink',
+                array($link[0],$link[1]),
+                $pos
+                );
+        }
+
+        return true;
+    }
+
+    function filelink($match, $state, $pos) {
+        $this->_addCall('filelink',array($match, null), $pos);
+        return true;
+    }
+
+    function windowssharelink($match, $state, $pos) {
+        $this->_addCall('windowssharelink',array($match, null), $pos);
+        return true;
+    }
+
+    function media($match, $state, $pos) {
+        $p = Doku_Handler_Parse_Media($match);
+
+        $this->_addCall(
+              $p['type'],
+              array($p['src'], $p['title'], $p['align'], $p['width'],
+                     $p['height'], $p['cache'], $p['linking']),
+              $pos
+             );
+        return true;
+    }
+
+    function rss($match, $state, $pos) {
+        $link = preg_replace(array('/^\{\{rss>/','/\}\}$/'),'',$match);
+
+        // get params
+        list($link,$params) = explode(' ',$link,2);
+
+        $p = array();
+        if(preg_match('/\b(\d+)\b/',$params,$match)){
+            $p['max'] = $match[1];
+        }else{
+            $p['max'] = 8;
+        }
+        $p['reverse'] = (preg_match('/rev/',$params));
+        $p['author']  = (preg_match('/\b(by|author)/',$params));
+        $p['date']    = (preg_match('/\b(date)/',$params));
+        $p['details'] = (preg_match('/\b(desc|detail)/',$params));
+        $p['nosort']  = (preg_match('/\b(nosort)\b/',$params));
+
+        if (preg_match('/\b(\d+)([dhm])\b/',$params,$match)) {
+            $period = array('d' => 86400, 'h' => 3600, 'm' => 60);
+            $p['refresh'] = max(600,$match[1]*$period[$match[2]]);  // n * period in seconds, minimum 10 minutes
+        } else {
+            $p['refresh'] = 14400;   // default to 4 hours
+        }
+
+        $this->_addCall('rss',array($link,$p),$pos);
+        return true;
+    }
+
+    function externallink($match, $state, $pos) {
+        $url   = $match;
+        $title = null;
+
+        // add protocol on simple short URLs
+        if(substr($url,0,3) == 'ftp' && (substr($url,0,6) != 'ftp://')){
+            $title = $url;
+            $url   = 'ftp://'.$url;
+        }
+        if(substr($url,0,3) == 'www' && (substr($url,0,7) != 'http://')){
+            $title = $url;
+            $url = 'http://'.$url;
+        }
+
+        $this->_addCall('externallink',array($url, $title), $pos);
+        return true;
+    }
+
+    function emaillink($match, $state, $pos) {
+        $email = preg_replace(array('/^</','/>$/'),'',$match);
+        $this->_addCall('emaillink',array($email, null), $pos);
+        return true;
+    }
+
+    function table($match, $state, $pos) {
+        switch ( $state ) {
+
+            case DOKU_LEXER_ENTER:
+
+                $ReWriter = new Doku_Handler_Table($this->CallWriter);
+                $this->CallWriter = & $ReWriter;
+
+                $this->_addCall('table_start', array($pos + 1), $pos);
+                if ( trim($match) == '^' ) {
+                    $this->_addCall('tableheader', array(), $pos);
+                } else {
+                    $this->_addCall('tablecell', array(), $pos);
+                }
+            break;
+
+            case DOKU_LEXER_EXIT:
+                $this->_addCall('table_end', array($pos), $pos);
+                $this->CallWriter->process();
+                $ReWriter = & $this->CallWriter;
+                $this->CallWriter = & $ReWriter->CallWriter;
+            break;
+
+            case DOKU_LEXER_UNMATCHED:
+                if ( trim($match) != '' ) {
+                    $this->_addCall('cdata',array($match), $pos);
+                }
+            break;
+
+            case DOKU_LEXER_MATCHED:
+                if ( $match == ' ' ){
+                    $this->_addCall('cdata', array($match), $pos);
+                } else if ( preg_match('/:::/',$match) ) {
+                    $this->_addCall('rowspan', array($match), $pos);
+                } else if ( preg_match('/\t+/',$match) ) {
+                    $this->_addCall('table_align', array($match), $pos);
+                } else if ( preg_match('/ {2,}/',$match) ) {
+                    $this->_addCall('table_align', array($match), $pos);
+                } else if ( $match == "\n|" ) {
+                    $this->_addCall('table_row', array(), $pos);
+                    $this->_addCall('tablecell', array(), $pos);
+                } else if ( $match == "\n^" ) {
+                    $this->_addCall('table_row', array(), $pos);
+                    $this->_addCall('tableheader', array(), $pos);
+                } else if ( $match == '|' ) {
+                    $this->_addCall('tablecell', array(), $pos);
+                } else if ( $match == '^' ) {
+                    $this->_addCall('tableheader', array(), $pos);
+                }
+            break;
+        }
+        return true;
+    }
+}
+
+//------------------------------------------------------------------------
+function Doku_Handler_Parse_Media($match) {
+
+    // Strip the opening and closing markup
+    $link = preg_replace(array('/^\{\{/','/\}\}$/u'),'',$match);
+
+    // Split title from URL
+    $link = explode('|',$link,2);
+
+    // Check alignment
+    $ralign = (bool)preg_match('/^ /',$link[0]);
+    $lalign = (bool)preg_match('/ $/',$link[0]);
+
+    // Logic = what's that ;)...
+    if ( $lalign & $ralign ) {
+        $align = 'center';
+    } else if ( $ralign ) {
+        $align = 'right';
+    } else if ( $lalign ) {
+        $align = 'left';
+    } else {
+        $align = null;
+    }
+
+    // The title...
+    if ( !isset($link[1]) ) {
+        $link[1] = null;
+    }
+
+    //remove aligning spaces
+    $link[0] = trim($link[0]);
+
+    //split into src and parameters (using the very last questionmark)
+    $pos = strrpos($link[0], '?');
+    if($pos !== false){
+        $src   = substr($link[0],0,$pos);
+        $param = substr($link[0],$pos+1);
+    }else{
+        $src   = $link[0];
+        $param = '';
+    }
+
+    //parse width and height
+    if(preg_match('#(\d+)(x(\d+))?#i',$param,$size)){
+        !empty($size[1]) ? $w = $size[1] : $w = null;
+        !empty($size[3]) ? $h = $size[3] : $h = null;
+    } else {
+        $w = null;
+        $h = null;
+    }
+
+    //get linking command
+    if(preg_match('/nolink/i',$param)){
+        $linking = 'nolink';
+    }else if(preg_match('/direct/i',$param)){
+        $linking = 'direct';
+    }else if(preg_match('/linkonly/i',$param)){
+        $linking = 'linkonly';
+    }else{
+        $linking = 'details';
+    }
+
+    //get caching command
+    if (preg_match('/(nocache|recache)/i',$param,$cachemode)){
+        $cache = $cachemode[1];
+    }else{
+        $cache = 'cache';
+    }
+
+    // Check whether this is a local or remote image or interwiki
+    if (media_isexternal($src) || link_isinterwiki($src)){
+        $call = 'externalmedia';
+    } else {
+        $call = 'internalmedia';
+    }
+
+    $params = array(
+        'type'=>$call,
+        'src'=>$src,
+        'title'=>$link[1],
+        'align'=>$align,
+        'width'=>$w,
+        'height'=>$h,
+        'cache'=>$cache,
+        'linking'=>$linking,
+    );
+
+    return $params;
+}
+
+//------------------------------------------------------------------------
+interface Doku_Handler_CallWriter_Interface {
+    public function writeCall($call);
+    public function writeCalls($calls);
+    public function finalise();
+}
+
+class Doku_Handler_CallWriter implements Doku_Handler_CallWriter_Interface {
+
+    var $Handler;
+
+    /**
+     * @param Doku_Handler $Handler
+     */
+    function __construct(Doku_Handler $Handler) {
+        $this->Handler = $Handler;
+    }
+
+    function writeCall($call) {
+        $this->Handler->calls[] = $call;
+    }
+
+    function writeCalls($calls) {
+        $this->Handler->calls = array_merge($this->Handler->calls, $calls);
+    }
+
+    // function is required, but since this call writer is first/highest in
+    // the chain it is not required to do anything
+    function finalise() {
+        unset($this->Handler);
+    }
+}
+
+//------------------------------------------------------------------------
+/**
+ * Generic call writer class to handle nesting of rendering instructions
+ * within a render instruction. Also see nest() method of renderer base class
+ *
+ * @author    Chris Smith <chris@jalakai.co.uk>
+ */
+class Doku_Handler_Nest implements Doku_Handler_CallWriter_Interface {
+
+    var $CallWriter;
+    var $calls = array();
+
+    var $closingInstruction;
+
+    /**
+     * constructor
+     *
+     * @param  Doku_Handler_CallWriter $CallWriter     the renderers current call writer
+     * @param  string     $close          closing instruction name, this is required to properly terminate the
+     *                                    syntax mode if the document ends without a closing pattern
+     */
+    function __construct(Doku_Handler_CallWriter_Interface $CallWriter, $close="nest_close") {
+        $this->CallWriter = $CallWriter;
+
+        $this->closingInstruction = $close;
+    }
+
+    function writeCall($call) {
+        $this->calls[] = $call;
+    }
+
+    function writeCalls($calls) {
+        $this->calls = array_merge($this->calls, $calls);
+    }
+
+    function finalise() {
+        $last_call = end($this->calls);
+        $this->writeCall(array($this->closingInstruction,array(), $last_call[2]));
+
+        $this->process();
+        $this->CallWriter->finalise();
+        unset($this->CallWriter);
+    }
+
+    function process() {
+        // merge consecutive cdata
+        $unmerged_calls = $this->calls;
+        $this->calls = array();
+
+        foreach ($unmerged_calls as $call) $this->addCall($call);
+
+        $first_call = reset($this->calls);
+        $this->CallWriter->writeCall(array("nest", array($this->calls), $first_call[2]));
+    }
+
+    function addCall($call) {
+        $key = count($this->calls);
+        if ($key and ($call[0] == 'cdata') and ($this->calls[$key-1][0] == 'cdata')) {
+            $this->calls[$key-1][1][0] .= $call[1][0];
+        } else if ($call[0] == 'eol') {
+            // do nothing (eol shouldn't be allowed, to counter preformatted fix in #1652 & #1699)
+        } else {
+            $this->calls[] = $call;
+        }
+    }
+}
+
+class Doku_Handler_List implements Doku_Handler_CallWriter_Interface {
+
+    var $CallWriter;
+
+    var $calls = array();
+    var $listCalls = array();
+    var $listStack = array();
+
+    const NODE = 1;
+
+    function __construct(Doku_Handler_CallWriter_Interface $CallWriter) {
+        $this->CallWriter = $CallWriter;
+    }
+
+    function writeCall($call) {
+        $this->calls[] = $call;
+    }
+
+    // Probably not needed but just in case...
+    function writeCalls($calls) {
+        $this->calls = array_merge($this->calls, $calls);
+#        $this->CallWriter->writeCalls($this->calls);
+    }
+
+    function finalise() {
+        $last_call = end($this->calls);
+        $this->writeCall(array('list_close',array(), $last_call[2]));
+
+        $this->process();
+        $this->CallWriter->finalise();
+        unset($this->CallWriter);
+    }
+
+    //------------------------------------------------------------------------
+    function process() {
+
+        foreach ( $this->calls as $call ) {
+            switch ($call[0]) {
+                case 'list_item':
+                    $this->listOpen($call);
+                break;
+                case 'list_open':
+                    $this->listStart($call);
+                break;
+                case 'list_close':
+                    $this->listEnd($call);
+                break;
+                default:
+                    $this->listContent($call);
+                break;
+            }
+        }
+
+        $this->CallWriter->writeCalls($this->listCalls);
+    }
+
+    //------------------------------------------------------------------------
+    function listStart($call) {
+        $depth = $this->interpretSyntax($call[1][0], $listType);
+
+        $this->initialDepth = $depth;
+        //                   array(list type, current depth, index of current listitem_open)
+        $this->listStack[] = array($listType, $depth, 1);
+
+        $this->listCalls[] = array('list'.$listType.'_open',array(),$call[2]);
+        $this->listCalls[] = array('listitem_open',array(1),$call[2]);
+        $this->listCalls[] = array('listcontent_open',array(),$call[2]);
+    }
+
+    //------------------------------------------------------------------------
+    function listEnd($call) {
+        $closeContent = true;
+
+        while ( $list = array_pop($this->listStack) ) {
+            if ( $closeContent ) {
+                $this->listCalls[] = array('listcontent_close',array(),$call[2]);
+                $closeContent = false;
+            }
+            $this->listCalls[] = array('listitem_close',array(),$call[2]);
+            $this->listCalls[] = array('list'.$list[0].'_close', array(), $call[2]);
+        }
+    }
+
+    //------------------------------------------------------------------------
+    function listOpen($call) {
+        $depth = $this->interpretSyntax($call[1][0], $listType);
+        $end = end($this->listStack);
+        $key = key($this->listStack);
+
+        // Not allowed to be shallower than initialDepth
+        if ( $depth < $this->initialDepth ) {
+            $depth = $this->initialDepth;
+        }
+
+        //------------------------------------------------------------------------
+        if ( $depth == $end[1] ) {
+
+            // Just another item in the list...
+            if ( $listType == $end[0] ) {
+                $this->listCalls[] = array('listcontent_close',array(),$call[2]);
+                $this->listCalls[] = array('listitem_close',array(),$call[2]);
+                $this->listCalls[] = array('listitem_open',array($depth-1),$call[2]);
+                $this->listCalls[] = array('listcontent_open',array(),$call[2]);
+
+                // new list item, update list stack's index into current listitem_open
+                $this->listStack[$key][2] = count($this->listCalls) - 2;
+
+            // Switched list type...
+            } else {
+
+                $this->listCalls[] = array('listcontent_close',array(),$call[2]);
+                $this->listCalls[] = array('listitem_close',array(),$call[2]);
+                $this->listCalls[] = array('list'.$end[0].'_close', array(), $call[2]);
+                $this->listCalls[] = array('list'.$listType.'_open', array(), $call[2]);
+                $this->listCalls[] = array('listitem_open', array($depth-1), $call[2]);
+                $this->listCalls[] = array('listcontent_open',array(),$call[2]);
+
+                array_pop($this->listStack);
+                $this->listStack[] = array($listType, $depth, count($this->listCalls) - 2);
+            }
+
+        //------------------------------------------------------------------------
+        // Getting deeper...
+        } else if ( $depth > $end[1] ) {
+
+            $this->listCalls[] = array('listcontent_close',array(),$call[2]);
+            $this->listCalls[] = array('list'.$listType.'_open', array(), $call[2]);
+            $this->listCalls[] = array('listitem_open', array($depth-1), $call[2]);
+            $this->listCalls[] = array('listcontent_open',array(),$call[2]);
+
+            // set the node/leaf state of this item's parent listitem_open to NODE
+            $this->listCalls[$this->listStack[$key][2]][1][1] = self::NODE;
+
+            $this->listStack[] = array($listType, $depth, count($this->listCalls) - 2);
+
+        //------------------------------------------------------------------------
+        // Getting shallower ( $depth < $end[1] )
+        } else {
+            $this->listCalls[] = array('listcontent_close',array(),$call[2]);
+            $this->listCalls[] = array('listitem_close',array(),$call[2]);
+            $this->listCalls[] = array('list'.$end[0].'_close',array(),$call[2]);
+
+            // Throw away the end - done
+            array_pop($this->listStack);
+
+            while (1) {
+                $end = end($this->listStack);
+                $key = key($this->listStack);
+
+                if ( $end[1] <= $depth ) {
+
+                    // Normalize depths
+                    $depth = $end[1];
+
+                    $this->listCalls[] = array('listitem_close',array(),$call[2]);
+
+                    if ( $end[0] == $listType ) {
+                        $this->listCalls[] = array('listitem_open',array($depth-1),$call[2]);
+                        $this->listCalls[] = array('listcontent_open',array(),$call[2]);
+
+                        // new list item, update list stack's index into current listitem_open
+                        $this->listStack[$key][2] = count($this->listCalls) - 2;
+
+                    } else {
+                        // Switching list type...
+                        $this->listCalls[] = array('list'.$end[0].'_close', array(), $call[2]);
+                        $this->listCalls[] = array('list'.$listType.'_open', array(), $call[2]);
+                        $this->listCalls[] = array('listitem_open', array($depth-1), $call[2]);
+                        $this->listCalls[] = array('listcontent_open',array(),$call[2]);
+
+                        array_pop($this->listStack);
+                        $this->listStack[] = array($listType, $depth, count($this->listCalls) - 2);
+                    }
+
+                    break;
+
+                // Haven't dropped down far enough yet.... ( $end[1] > $depth )
+                } else {
+
+                    $this->listCalls[] = array('listitem_close',array(),$call[2]);
+                    $this->listCalls[] = array('list'.$end[0].'_close',array(),$call[2]);
+
+                    array_pop($this->listStack);
+
+                }
+
+            }
+
+        }
+    }
+
+    //------------------------------------------------------------------------
+    function listContent($call) {
+        $this->listCalls[] = $call;
+    }
+
+    //------------------------------------------------------------------------
+    function interpretSyntax($match, & $type) {
+        if ( substr($match,-1) == '*' ) {
+            $type = 'u';
+        } else {
+            $type = 'o';
+        }
+        // Is the +1 needed? It used to be count(explode(...))
+        // but I don't think the number is seen outside this handler
+        return substr_count(str_replace("\t",'  ',$match), '  ') + 1;
+    }
+}
+
+//------------------------------------------------------------------------
+class Doku_Handler_Preformatted implements Doku_Handler_CallWriter_Interface {
+
+    var $CallWriter;
+
+    var $calls = array();
+    var $pos;
+    var $text ='';
+
+
+
+    function __construct(Doku_Handler_CallWriter_Interface $CallWriter) {
+        $this->CallWriter = $CallWriter;
+    }
+
+    function writeCall($call) {
+        $this->calls[] = $call;
+    }
+
+    // Probably not needed but just in case...
+    function writeCalls($calls) {
+        $this->calls = array_merge($this->calls, $calls);
+#        $this->CallWriter->writeCalls($this->calls);
+    }
+
+    function finalise() {
+        $last_call = end($this->calls);
+        $this->writeCall(array('preformatted_end',array(), $last_call[2]));
+
+        $this->process();
+        $this->CallWriter->finalise();
+        unset($this->CallWriter);
+    }
+
+    function process() {
+        foreach ( $this->calls as $call ) {
+            switch ($call[0]) {
+                case 'preformatted_start':
+                    $this->pos = $call[2];
+                break;
+                case 'preformatted_newline':
+                    $this->text .= "\n";
+                break;
+                case 'preformatted_content':
+                    $this->text .= $call[1][0];
+                break;
+                case 'preformatted_end':
+                    if (trim($this->text)) {
+                        $this->CallWriter->writeCall(array('preformatted',array($this->text),$this->pos));
+                    }
+                    // see FS#1699 & FS#1652, add 'eol' instructions to ensure proper triggering of following p_open
+                    $this->CallWriter->writeCall(array('eol',array(),$this->pos));
+                    $this->CallWriter->writeCall(array('eol',array(),$this->pos));
+                break;
+            }
+        }
+    }
+
+}
+
+//------------------------------------------------------------------------
+class Doku_Handler_Quote implements Doku_Handler_CallWriter_Interface {
+
+    var $CallWriter;
+
+    var $calls = array();
+
+    var $quoteCalls = array();
+
+    function __construct(Doku_Handler_CallWriter_Interface $CallWriter) {
+        $this->CallWriter = $CallWriter;
+    }
+
+    function writeCall($call) {
+        $this->calls[] = $call;
+    }
+
+    // Probably not needed but just in case...
+    function writeCalls($calls) {
+        $this->calls = array_merge($this->calls, $calls);
+    }
+
+    function finalise() {
+        $last_call = end($this->calls);
+        $this->writeCall(array('quote_end',array(), $last_call[2]));
+
+        $this->process();
+        $this->CallWriter->finalise();
+        unset($this->CallWriter);
+    }
+
+    function process() {
+
+        $quoteDepth = 1;
+
+        foreach ( $this->calls as $call ) {
+            switch ($call[0]) {
+
+                case 'quote_start':
+
+                    $this->quoteCalls[] = array('quote_open',array(),$call[2]);
+
+                case 'quote_newline':
+
+                    $quoteLength = $this->getDepth($call[1][0]);
+
+                    if ( $quoteLength > $quoteDepth ) {
+                        $quoteDiff = $quoteLength - $quoteDepth;
+                        for ( $i = 1; $i <= $quoteDiff; $i++ ) {
+                            $this->quoteCalls[] = array('quote_open',array(),$call[2]);
+                        }
+                    } else if ( $quoteLength < $quoteDepth ) {
+                        $quoteDiff = $quoteDepth - $quoteLength;
+                        for ( $i = 1; $i <= $quoteDiff; $i++ ) {
+                            $this->quoteCalls[] = array('quote_close',array(),$call[2]);
+                        }
+                    } else {
+                        if ($call[0] != 'quote_start') $this->quoteCalls[] = array('linebreak',array(),$call[2]);
+                    }
+
+                    $quoteDepth = $quoteLength;
+
+                break;
+
+                case 'quote_end':
+
+                    if ( $quoteDepth > 1 ) {
+                        $quoteDiff = $quoteDepth - 1;
+                        for ( $i = 1; $i <= $quoteDiff; $i++ ) {
+                            $this->quoteCalls[] = array('quote_close',array(),$call[2]);
+                        }
+                    }
+
+                    $this->quoteCalls[] = array('quote_close',array(),$call[2]);
+
+                    $this->CallWriter->writeCalls($this->quoteCalls);
+                break;
+
+                default:
+                    $this->quoteCalls[] = $call;
+                break;
+            }
+        }
+    }
+
+    function getDepth($marker) {
+        preg_match('/>{1,}/', $marker, $matches);
+        $quoteLength = strlen($matches[0]);
+        return $quoteLength;
+    }
+}
+
+//------------------------------------------------------------------------
+class Doku_Handler_Table implements Doku_Handler_CallWriter_Interface {
+
+    var $CallWriter;
+
+    var $calls = array();
+    var $tableCalls = array();
+    var $maxCols = 0;
+    var $maxRows = 1;
+    var $currentCols = 0;
+    var $firstCell = false;
+    var $lastCellType = 'tablecell';
+    var $inTableHead = true;
+    var $currentRow = array('tableheader' => 0, 'tablecell' => 0);
+    var $countTableHeadRows = 0;
+
+    function __construct(Doku_Handler_CallWriter_Interface $CallWriter) {
+        $this->CallWriter = $CallWriter;
+    }
+
+    function writeCall($call) {
+        $this->calls[] = $call;
+    }
+
+    // Probably not needed but just in case...
+    function writeCalls($calls) {
+        $this->calls = array_merge($this->calls, $calls);
+    }
+
+    function finalise() {
+        $last_call = end($this->calls);
+        $this->writeCall(array('table_end',array(), $last_call[2]));
+
+        $this->process();
+        $this->CallWriter->finalise();
+        unset($this->CallWriter);
+    }
+
+    //------------------------------------------------------------------------
+    function process() {
+        foreach ( $this->calls as $call ) {
+            switch ( $call[0] ) {
+                case 'table_start':
+                    $this->tableStart($call);
+                break;
+                case 'table_row':
+                    $this->tableRowClose($call);
+                    $this->tableRowOpen(array('tablerow_open',$call[1],$call[2]));
+                break;
+                case 'tableheader':
+                case 'tablecell':
+                    $this->tableCell($call);
+                break;
+                case 'table_end':
+                    $this->tableRowClose($call);
+                    $this->tableEnd($call);
+                break;
+                default:
+                    $this->tableDefault($call);
+                break;
+            }
+        }
+        $this->CallWriter->writeCalls($this->tableCalls);
+    }
+
+    function tableStart($call) {
+        $this->tableCalls[] = array('table_open',$call[1],$call[2]);
+        $this->tableCalls[] = array('tablerow_open',array(),$call[2]);
+        $this->firstCell = true;
+    }
+
+    function tableEnd($call) {
+        $this->tableCalls[] = array('table_close',$call[1],$call[2]);
+        $this->finalizeTable();
+    }
+
+    function tableRowOpen($call) {
+        $this->tableCalls[] = $call;
+        $this->currentCols = 0;
+        $this->firstCell = true;
+        $this->lastCellType = 'tablecell';
+        $this->maxRows++;
+        if ($this->inTableHead) {
+            $this->currentRow = array('tablecell' => 0, 'tableheader' => 0);
+        }
+    }
+
+    function tableRowClose($call) {
+        if ($this->inTableHead && ($this->inTableHead = $this->isTableHeadRow())) {
+            $this->countTableHeadRows++;
+        }
+        // Strip off final cell opening and anything after it
+        while ( $discard = array_pop($this->tableCalls ) ) {
+
+            if ( $discard[0] == 'tablecell_open' || $discard[0] == 'tableheader_open') {
+                break;
+            }
+            if (!empty($this->currentRow[$discard[0]])) {
+                $this->currentRow[$discard[0]]--;
+            }
+        }
+        $this->tableCalls[] = array('tablerow_close', array(), $call[2]);
+
+        if ( $this->currentCols > $this->maxCols ) {
+            $this->maxCols = $this->currentCols;
+        }
+    }
+
+    function isTableHeadRow() {
+        $td = $this->currentRow['tablecell'];
+        $th = $this->currentRow['tableheader'];
+
+        if (!$th || $td > 2) return false;
+        if (2*$td > $th) return false;
+
+        return true;
+    }
+
+    function tableCell($call) {
+        if ($this->inTableHead) {
+            $this->currentRow[$call[0]]++;
+        }
+        if ( !$this->firstCell ) {
+
+            // Increase the span
+            $lastCall = end($this->tableCalls);
+
+            // A cell call which follows an open cell means an empty cell so span
+            if ( $lastCall[0] == 'tablecell_open' || $lastCall[0] == 'tableheader_open' ) {
+                 $this->tableCalls[] = array('colspan',array(),$call[2]);
+
+            }
+
+            $this->tableCalls[] = array($this->lastCellType.'_close',array(),$call[2]);
+            $this->tableCalls[] = array($call[0].'_open',array(1,null,1),$call[2]);
+            $this->lastCellType = $call[0];
+
+        } else {
+
+            $this->tableCalls[] = array($call[0].'_open',array(1,null,1),$call[2]);
+            $this->lastCellType = $call[0];
+            $this->firstCell = false;
+
+        }
+
+        $this->currentCols++;
+    }
+
+    function tableDefault($call) {
+        $this->tableCalls[] = $call;
+    }
+
+    function finalizeTable() {
+
+        // Add the max cols and rows to the table opening
+        if ( $this->tableCalls[0][0] == 'table_open' ) {
+            // Adjust to num cols not num col delimeters
+            $this->tableCalls[0][1][] = $this->maxCols - 1;
+            $this->tableCalls[0][1][] = $this->maxRows;
+            $this->tableCalls[0][1][] = array_shift($this->tableCalls[0][1]);
+        } else {
+            trigger_error('First element in table call list is not table_open');
+        }
+
+        $lastRow = 0;
+        $lastCell = 0;
+        $cellKey = array();
+        $toDelete = array();
+
+        // if still in tableheader, then there can be no table header
+        // as all rows can't be within <THEAD>
+        if ($this->inTableHead) {
+            $this->inTableHead = false;
+            $this->countTableHeadRows = 0;
+        }
+
+        // Look for the colspan elements and increment the colspan on the
+        // previous non-empty opening cell. Once done, delete all the cells
+        // that contain colspans
+        for ($key = 0 ; $key < count($this->tableCalls) ; ++$key) {
+            $call = $this->tableCalls[$key];
+
+            switch ($call[0]) {
+                case 'table_open' :
+                    if($this->countTableHeadRows) {
+                        array_splice($this->tableCalls, $key+1, 0, array(
+                              array('tablethead_open', array(), $call[2]))
+                        );
+                    }
+                    break;
+
+                case 'tablerow_open':
+
+                    $lastRow++;
+                    $lastCell = 0;
+                    break;
+
+                case 'tablecell_open':
+                case 'tableheader_open':
+
+                    $lastCell++;
+                    $cellKey[$lastRow][$lastCell] = $key;
+                    break;
+
+                case 'table_align':
+
+                    $prev = in_array($this->tableCalls[$key-1][0], array('tablecell_open', 'tableheader_open'));
+                    $next = in_array($this->tableCalls[$key+1][0], array('tablecell_close', 'tableheader_close'));
+                    // If the cell is empty, align left
+                    if ($prev && $next) {
+                        $this->tableCalls[$key-1][1][1] = 'left';
+
+                    // If the previous element was a cell open, align right
+                    } elseif ($prev) {
+                        $this->tableCalls[$key-1][1][1] = 'right';
+
+                    // If the next element is the close of an element, align either center or left
+                    } elseif ( $next) {
+                        if ( $this->tableCalls[$cellKey[$lastRow][$lastCell]][1][1] == 'right' ) {
+                            $this->tableCalls[$cellKey[$lastRow][$lastCell]][1][1] = 'center';
+                        } else {
+                            $this->tableCalls[$cellKey[$lastRow][$lastCell]][1][1] = 'left';
+                        }
+
+                    }
+
+                    // Now convert the whitespace back to cdata
+                    $this->tableCalls[$key][0] = 'cdata';
+                    break;
+
+                case 'colspan':
+
+                    $this->tableCalls[$key-1][1][0] = false;
+
+                    for($i = $key-2; $i >= $cellKey[$lastRow][1]; $i--) {
+
+                        if ( $this->tableCalls[$i][0] == 'tablecell_open' || $this->tableCalls[$i][0] == 'tableheader_open' ) {
+
+                            if ( false !== $this->tableCalls[$i][1][0] ) {
+                                $this->tableCalls[$i][1][0]++;
+                                break;
+                            }
+
+                        }
+                    }
+
+                    $toDelete[] = $key-1;
+                    $toDelete[] = $key;
+                    $toDelete[] = $key+1;
+                    break;
+
+                case 'rowspan':
+
+                    if ( $this->tableCalls[$key-1][0] == 'cdata' ) {
+                        // ignore rowspan if previous call was cdata (text mixed with :::) we don't have to check next call as that wont match regex
+                        $this->tableCalls[$key][0] = 'cdata';
+
+                    } else {
+
+                        $spanning_cell = null;
+
+                        // can't cross thead/tbody boundary
+                        if (!$this->countTableHeadRows || ($lastRow-1 != $this->countTableHeadRows)) {
+                            for($i = $lastRow-1; $i > 0; $i--) {
+
+                                if ( $this->tableCalls[$cellKey[$i][$lastCell]][0] == 'tablecell_open' || $this->tableCalls[$cellKey[$i][$lastCell]][0] == 'tableheader_open' ) {
+
+                                    if ($this->tableCalls[$cellKey[$i][$lastCell]][1][2] >= $lastRow - $i) {
+                                        $spanning_cell = $i;
+                                        break;
+                                    }
+
+                                }
+                            }
+                        }
+                        if (is_null($spanning_cell)) {
+                            // No spanning cell found, so convert this cell to
+                            // an empty one to avoid broken tables
+                            $this->tableCalls[$key][0] = 'cdata';
+                            $this->tableCalls[$key][1][0] = '';
+                            continue;
+                        }
+                        $this->tableCalls[$cellKey[$spanning_cell][$lastCell]][1][2]++;
+
+                        $this->tableCalls[$key-1][1][2] = false;
+
+                        $toDelete[] = $key-1;
+                        $toDelete[] = $key;
+                        $toDelete[] = $key+1;
+                    }
+                    break;
+
+                case 'tablerow_close':
+
+                    // Fix broken tables by adding missing cells
+                    $moreCalls = array();
+                    while (++$lastCell < $this->maxCols) {
+                        $moreCalls[] = array('tablecell_open', array(1, null, 1), $call[2]);
+                        $moreCalls[] = array('cdata', array(''), $call[2]);
+                        $moreCalls[] = array('tablecell_close', array(), $call[2]);
+                    }
+                    $moreCallsLength = count($moreCalls);
+                    if($moreCallsLength) {
+                        array_splice($this->tableCalls, $key, 0, $moreCalls);
+                        $key += $moreCallsLength;
+                    }
+
+                    if($this->countTableHeadRows == $lastRow) {
+                        array_splice($this->tableCalls, $key+1, 0, array(
+                              array('tablethead_close', array(), $call[2])));
+                    }
+                    break;
+
+            }
+        }
+
+        // condense cdata
+        $cnt = count($this->tableCalls);
+        for( $key = 0; $key < $cnt; $key++){
+            if($this->tableCalls[$key][0] == 'cdata'){
+                $ckey = $key;
+                $key++;
+                while($this->tableCalls[$key][0] == 'cdata'){
+                    $this->tableCalls[$ckey][1][0] .= $this->tableCalls[$key][1][0];
+                    $toDelete[] = $key;
+                    $key++;
+                }
+                continue;
+            }
+        }
+
+        foreach ( $toDelete as $delete ) {
+            unset($this->tableCalls[$delete]);
+        }
+        $this->tableCalls = array_values($this->tableCalls);
+    }
+}
+
+
+/**
+ * Handler for paragraphs
+ *
+ * @author Harry Fuecks <hfuecks@gmail.com>
+ */
+class Doku_Handler_Block {
+    var $calls = array();
+    var $skipEol = false;
+    var $inParagraph = false;
+
+    // Blocks these should not be inside paragraphs
+    var $blockOpen = array(
+            'header',
+            'listu_open','listo_open','listitem_open','listcontent_open',
+            'table_open','tablerow_open','tablecell_open','tableheader_open','tablethead_open',
+            'quote_open',
+            'code','file','hr','preformatted','rss',
+            'htmlblock','phpblock',
+            'footnote_open',
+        );
+
+    var $blockClose = array(
+            'header',
+            'listu_close','listo_close','listitem_close','listcontent_close',
+            'table_close','tablerow_close','tablecell_close','tableheader_close','tablethead_close',
+            'quote_close',
+            'code','file','hr','preformatted','rss',
+            'htmlblock','phpblock',
+            'footnote_close',
+        );
+
+    // Stacks can contain paragraphs
+    var $stackOpen = array(
+        'section_open',
+        );
+
+    var $stackClose = array(
+        'section_close',
+        );
+
+
+    /**
+     * Constructor. Adds loaded syntax plugins to the block and stack
+     * arrays
+     *
+     * @author Andreas Gohr <andi@splitbrain.org>
+     */
+    function __construct(){
+        global $DOKU_PLUGINS;
+        //check if syntax plugins were loaded
+        if(empty($DOKU_PLUGINS['syntax'])) return;
+        foreach($DOKU_PLUGINS['syntax'] as $n => $p){
+            $ptype = $p->getPType();
+            if($ptype == 'block'){
+                $this->blockOpen[]  = 'plugin_'.$n;
+                $this->blockClose[] = 'plugin_'.$n;
+            }elseif($ptype == 'stack'){
+                $this->stackOpen[]  = 'plugin_'.$n;
+                $this->stackClose[] = 'plugin_'.$n;
+            }
+        }
+    }
+
+    function openParagraph($pos){
+        if ($this->inParagraph) return;
+        $this->calls[] = array('p_open',array(), $pos);
+        $this->inParagraph = true;
+        $this->skipEol = true;
+    }
+
+    /**
+     * Close a paragraph if needed
+     *
+     * This function makes sure there are no empty paragraphs on the stack
+     *
+     * @author Andreas Gohr <andi@splitbrain.org>
+     *
+     * @param string|integer $pos
+     */
+    function closeParagraph($pos){
+        if (!$this->inParagraph) return;
+        // look back if there was any content - we don't want empty paragraphs
+        $content = '';
+        $ccount = count($this->calls);
+        for($i=$ccount-1; $i>=0; $i--){
+            if($this->calls[$i][0] == 'p_open'){
+                break;
+            }elseif($this->calls[$i][0] == 'cdata'){
+                $content .= $this->calls[$i][1][0];
+            }else{
+                $content = 'found markup';
+                break;
+            }
+        }
+
+        if(trim($content)==''){
+            //remove the whole paragraph
+            //array_splice($this->calls,$i); // <- this is much slower than the loop below
+            for($x=$ccount; $x>$i; $x--) array_pop($this->calls);
+        }else{
+            // remove ending linebreaks in the paragraph
+            $i=count($this->calls)-1;
+            if ($this->calls[$i][0] == 'cdata') $this->calls[$i][1][0] = rtrim($this->calls[$i][1][0],DOKU_PARSER_EOL);
+            $this->calls[] = array('p_close',array(), $pos);
+        }
+
+        $this->inParagraph = false;
+        $this->skipEol = true;
+    }
+
+    function addCall($call) {
+        $key = count($this->calls);
+        if ($key and ($call[0] == 'cdata') and ($this->calls[$key-1][0] == 'cdata')) {
+            $this->calls[$key-1][1][0] .= $call[1][0];
+        } else {
+            $this->calls[] = $call;
+        }
+    }
+
+    // simple version of addCall, without checking cdata
+    function storeCall($call) {
+        $this->calls[] = $call;
+    }
+
+    /**
+     * Processes the whole instruction stack to open and close paragraphs
+     *
+     * @author Harry Fuecks <hfuecks@gmail.com>
+     * @author Andreas Gohr <andi@splitbrain.org>
+     *
+     * @param array $calls
+     *
+     * @return array
+     */
+    function process($calls) {
+        // open first paragraph
+        $this->openParagraph(0);
+        foreach ( $calls as $key => $call ) {
+            $cname = $call[0];
+            if ($cname == 'plugin') {
+                $cname='plugin_'.$call[1][0];
+                $plugin = true;
+                $plugin_open = (($call[1][2] == DOKU_LEXER_ENTER) || ($call[1][2] == DOKU_LEXER_SPECIAL));
+                $plugin_close = (($call[1][2] == DOKU_LEXER_EXIT) || ($call[1][2] == DOKU_LEXER_SPECIAL));
+            } else {
+                $plugin = false;
+            }
+            /* stack */
+            if ( in_array($cname,$this->stackClose ) && (!$plugin || $plugin_close)) {
+                $this->closeParagraph($call[2]);
+                $this->storeCall($call);
+                $this->openParagraph($call[2]);
+                continue;
+            }
+            if ( in_array($cname,$this->stackOpen ) && (!$plugin || $plugin_open) ) {
+                $this->closeParagraph($call[2]);
+                $this->storeCall($call);
+                $this->openParagraph($call[2]);
+                continue;
+            }
+            /* block */
+            // If it's a substition it opens and closes at the same call.
+            // To make sure next paragraph is correctly started, let close go first.
+            if ( in_array($cname, $this->blockClose) && (!$plugin || $plugin_close)) {
+                $this->closeParagraph($call[2]);
+                $this->storeCall($call);
+                $this->openParagraph($call[2]);
+                continue;
+            }
+            if ( in_array($cname, $this->blockOpen) && (!$plugin || $plugin_open)) {
+                $this->closeParagraph($call[2]);
+                $this->storeCall($call);
+                continue;
+            }
+            /* eol */
+            if ( $cname == 'eol' ) {
+                // Check this isn't an eol instruction to skip...
+                if ( !$this->skipEol ) {
+                    // Next is EOL => double eol => mark as paragraph
+                    if ( isset($calls[$key+1]) && $calls[$key+1][0] == 'eol' ) {
+                        $this->closeParagraph($call[2]);
+                        $this->openParagraph($call[2]);
+                    } else {
+                        //if this is just a single eol make a space from it
+                        $this->addCall(array('cdata',array(DOKU_PARSER_EOL), $call[2]));
+                    }
+                }
+                continue;
+            }
+            /* normal */
+            $this->addCall($call);
+            $this->skipEol = false;
+        }
+        // close last paragraph
+        $call = end($this->calls);
+        $this->closeParagraph($call[2]);
+        return $this->calls;
+    }
+}
+
+//Setup VIM: ex: et ts=4 :
diff --git a/wiki/inc/parser/lexer.php b/wiki/inc/parser/lexer.php
new file mode 100644
index 0000000..ba6a653
--- /dev/null
+++ b/wiki/inc/parser/lexer.php
@@ -0,0 +1,614 @@
+<?php
+/**
+ * Author Markus Baker: http://www.lastcraft.com
+ * Version adapted from Simple Test: http://sourceforge.net/projects/simpletest/
+ * For an intro to the Lexer see:
+ * https://web.archive.org/web/20120125041816/http://www.phppatterns.com/docs/develop/simple_test_lexer_notes
+ * @author Marcus Baker
+ * @package Doku
+ * @subpackage Lexer
+ * @version $Id: lexer.php,v 1.1 2005/03/23 23:14:09 harryf Exp $
+ */
+
+/**
+ * Init path constant
+ */
+if(!defined('DOKU_INC')) die('meh.');
+
+/**#@+
+ * lexer mode constant
+ */
+define("DOKU_LEXER_ENTER", 1);
+define("DOKU_LEXER_MATCHED", 2);
+define("DOKU_LEXER_UNMATCHED", 3);
+define("DOKU_LEXER_EXIT", 4);
+define("DOKU_LEXER_SPECIAL", 5);
+/**#@-*/
+
+/**
+ * Compounded regular expression. Any of
+ * the contained patterns could match and
+ * when one does it's label is returned.
+ *
+ * @package Doku
+ * @subpackage Lexer
+ */
+class Doku_LexerParallelRegex {
+    var $_patterns;
+    var $_labels;
+    var $_regex;
+    var $_case;
+
+    /**
+     * Constructor. Starts with no patterns.
+     *
+     * @param boolean $case    True for case sensitive, false
+     *                         for insensitive.
+     * @access public
+     */
+    function __construct($case) {
+        $this->_case = $case;
+        $this->_patterns = array();
+        $this->_labels = array();
+        $this->_regex = null;
+    }
+
+    /**
+     * Adds a pattern with an optional label.
+     *
+     * @param mixed       $pattern Perl style regex. Must be UTF-8
+     *                             encoded. If its a string, the (, )
+     *                             lose their meaning unless they
+     *                             form part of a lookahead or
+     *                             lookbehind assertation.
+     * @param bool|string $label   Label of regex to be returned
+     *                             on a match. Label must be ASCII
+     * @access public
+     */
+    function addPattern($pattern, $label = true) {
+        $count = count($this->_patterns);
+        $this->_patterns[$count] = $pattern;
+        $this->_labels[$count] = $label;
+        $this->_regex = null;
+    }
+
+    /**
+     * Attempts to match all patterns at once against a string.
+     *
+     * @param string $subject      String to match against.
+     * @param string $match        First matched portion of
+     *                             subject.
+     * @return boolean             True on success.
+     * @access public
+     */
+    function match($subject, &$match) {
+        if (count($this->_patterns) == 0) {
+            return false;
+        }
+        if (! preg_match($this->_getCompoundedRegex(), $subject, $matches)) {
+            $match = "";
+            return false;
+        }
+
+        $match = $matches[0];
+        $size = count($matches);
+        for ($i = 1; $i < $size; $i++) {
+            if ($matches[$i] && isset($this->_labels[$i - 1])) {
+                return $this->_labels[$i - 1];
+            }
+        }
+        return true;
+    }
+
+    /**
+     * Attempts to split the string against all patterns at once
+     *
+     * @param string $subject      String to match against.
+     * @param array $split         The split result: array containing, pre-match, match & post-match strings
+     * @return boolean             True on success.
+     * @access public
+     *
+     * @author Christopher Smith <chris@jalakai.co.uk>
+     */
+    function split($subject, &$split) {
+        if (count($this->_patterns) == 0) {
+            return false;
+        }
+
+        if (! preg_match($this->_getCompoundedRegex(), $subject, $matches)) {
+            if(function_exists('preg_last_error')){
+                $err = preg_last_error();
+                switch($err){
+                    case PREG_BACKTRACK_LIMIT_ERROR:
+                        msg('A PCRE backtrack error occured. Try to increase the pcre.backtrack_limit in php.ini',-1);
+                        break;
+                    case PREG_RECURSION_LIMIT_ERROR:
+                        msg('A PCRE recursion error occured. Try to increase the pcre.recursion_limit in php.ini',-1);
+                        break;
+                    case PREG_BAD_UTF8_ERROR:
+                        msg('A PCRE UTF-8 error occured. This might be caused by a faulty plugin',-1);
+                        break;
+                    case PREG_INTERNAL_ERROR:
+                        msg('A PCRE internal error occured. This might be caused by a faulty plugin',-1);
+                        break;
+                }
+            }
+
+            $split = array($subject, "", "");
+            return false;
+        }
+
+        $idx = count($matches)-2;
+        list($pre, $post) = preg_split($this->_patterns[$idx].$this->_getPerlMatchingFlags(), $subject, 2);
+        $split = array($pre, $matches[0], $post);
+
+        return isset($this->_labels[$idx]) ? $this->_labels[$idx] : true;
+    }
+
+    /**
+     * Compounds the patterns into a single
+     * regular expression separated with the
+     * "or" operator. Caches the regex.
+     * Will automatically escape (, ) and / tokens.
+     *
+     * @internal array $_patterns List of patterns in order.
+     * @return null|string
+     * @access private
+     */
+    function _getCompoundedRegex() {
+        if ($this->_regex == null) {
+            $cnt = count($this->_patterns);
+            for ($i = 0; $i < $cnt; $i++) {
+
+                /*
+                 * decompose the input pattern into "(", "(?", ")",
+                 * "[...]", "[]..]", "[^]..]", "[...[:...:]..]", "\x"...
+                 * elements.
+                 */
+                preg_match_all('/\\\\.|' .
+                               '\(\?|' .
+                               '[()]|' .
+                               '\[\^?\]?(?:\\\\.|\[:[^]]*:\]|[^]\\\\])*\]|' .
+                               '[^[()\\\\]+/', $this->_patterns[$i], $elts);
+
+                $pattern = "";
+                $level = 0;
+
+                foreach ($elts[0] as $elt) {
+                    /*
+                     * for "(", ")" remember the nesting level, add "\"
+                     * only to the non-"(?" ones.
+                     */
+
+                    switch($elt) {
+                        case '(':
+                            $pattern .= '\(';
+                            break;
+                        case ')':
+                            if ($level > 0)
+                                $level--; /* closing (? */
+                            else
+                                $pattern .= '\\';
+                            $pattern .= ')';
+                            break;
+                        case '(?':
+                            $level++;
+                            $pattern .= '(?';
+                            break;
+                        default:
+                            if (substr($elt, 0, 1) == '\\')
+                                $pattern .= $elt;
+                            else
+                                $pattern .= str_replace('/', '\/', $elt);
+                    }
+                }
+                $this->_patterns[$i] = "($pattern)";
+            }
+            $this->_regex = "/" . implode("|", $this->_patterns) . "/" . $this->_getPerlMatchingFlags();
+        }
+        return $this->_regex;
+    }
+
+    /**
+     * Accessor for perl regex mode flags to use.
+     * @return string       Perl regex flags.
+     * @access private
+     */
+    function _getPerlMatchingFlags() {
+        return ($this->_case ? "msS" : "msSi");
+    }
+}
+
+/**
+ * States for a stack machine.
+ * @package Lexer
+ * @subpackage Lexer
+ */
+class Doku_LexerStateStack {
+    var $_stack;
+
+    /**
+     * Constructor. Starts in named state.
+     * @param string $start        Starting state name.
+     * @access public
+     */
+    function __construct($start) {
+        $this->_stack = array($start);
+    }
+
+    /**
+     * Accessor for current state.
+     * @return string       State.
+     * @access public
+     */
+    function getCurrent() {
+        return $this->_stack[count($this->_stack) - 1];
+    }
+
+    /**
+     * Adds a state to the stack and sets it
+     * to be the current state.
+     * @param string $state        New state.
+     * @access public
+     */
+    function enter($state) {
+        array_push($this->_stack, $state);
+    }
+
+    /**
+     * Leaves the current state and reverts
+     * to the previous one.
+     * @return boolean    False if we drop off
+     *                    the bottom of the list.
+     * @access public
+     */
+    function leave() {
+        if (count($this->_stack) == 1) {
+            return false;
+        }
+        array_pop($this->_stack);
+        return true;
+    }
+}
+
+/**
+ * Accepts text and breaks it into tokens.
+ * Some optimisation to make the sure the
+ * content is only scanned by the PHP regex
+ * parser once. Lexer modes must not start
+ * with leading underscores.
+ * @package Doku
+ * @subpackage Lexer
+ */
+class Doku_Lexer {
+    var $_regexes;
+    var $_parser;
+    var $_mode;
+    var $_mode_handlers;
+    var $_case;
+
+    /**
+     * Sets up the lexer in case insensitive matching
+     * by default.
+     * @param Doku_Parser $parser  Handling strategy by
+     *                                 reference.
+     * @param string $start            Starting handler.
+     * @param boolean $case            True for case sensitive.
+     * @access public
+     */
+    function __construct($parser, $start = "accept", $case = false) {
+        $this->_case = $case;
+        /** @var Doku_LexerParallelRegex[] _regexes */
+        $this->_regexes = array();
+        $this->_parser = $parser;
+        $this->_mode = new Doku_LexerStateStack($start);
+        $this->_mode_handlers = array();
+    }
+
+    /**
+     * Adds a token search pattern for a particular
+     * parsing mode. The pattern does not change the
+     * current mode.
+     * @param string $pattern      Perl style regex, but ( and )
+     *                             lose the usual meaning.
+     * @param string $mode         Should only apply this
+     *                             pattern when dealing with
+     *                             this type of input.
+     * @access public
+     */
+    function addPattern($pattern, $mode = "accept") {
+        if (! isset($this->_regexes[$mode])) {
+            $this->_regexes[$mode] = new Doku_LexerParallelRegex($this->_case);
+        }
+        $this->_regexes[$mode]->addPattern($pattern);
+    }
+
+    /**
+     * Adds a pattern that will enter a new parsing
+     * mode. Useful for entering parenthesis, strings,
+     * tags, etc.
+     * @param string $pattern      Perl style regex, but ( and )
+     *                             lose the usual meaning.
+     * @param string $mode         Should only apply this
+     *                             pattern when dealing with
+     *                             this type of input.
+     * @param string $new_mode     Change parsing to this new
+     *                             nested mode.
+     * @access public
+     */
+    function addEntryPattern($pattern, $mode, $new_mode) {
+        if (! isset($this->_regexes[$mode])) {
+            $this->_regexes[$mode] = new Doku_LexerParallelRegex($this->_case);
+        }
+        $this->_regexes[$mode]->addPattern($pattern, $new_mode);
+    }
+
+    /**
+     * Adds a pattern that will exit the current mode
+     * and re-enter the previous one.
+     * @param string $pattern      Perl style regex, but ( and )
+     *                             lose the usual meaning.
+     * @param string $mode         Mode to leave.
+     * @access public
+     */
+    function addExitPattern($pattern, $mode) {
+        if (! isset($this->_regexes[$mode])) {
+            $this->_regexes[$mode] = new Doku_LexerParallelRegex($this->_case);
+        }
+        $this->_regexes[$mode]->addPattern($pattern, "__exit");
+    }
+
+    /**
+     * Adds a pattern that has a special mode. Acts as an entry
+     * and exit pattern in one go, effectively calling a special
+     * parser handler for this token only.
+     * @param string $pattern      Perl style regex, but ( and )
+     *                             lose the usual meaning.
+     * @param string $mode         Should only apply this
+     *                             pattern when dealing with
+     *                             this type of input.
+     * @param string $special      Use this mode for this one token.
+     * @access public
+     */
+    function addSpecialPattern($pattern, $mode, $special) {
+        if (! isset($this->_regexes[$mode])) {
+            $this->_regexes[$mode] = new Doku_LexerParallelRegex($this->_case);
+        }
+        $this->_regexes[$mode]->addPattern($pattern, "_$special");
+    }
+
+    /**
+     * Adds a mapping from a mode to another handler.
+     * @param string $mode        Mode to be remapped.
+     * @param string $handler     New target handler.
+     * @access public
+     */
+    function mapHandler($mode, $handler) {
+        $this->_mode_handlers[$mode] = $handler;
+    }
+
+    /**
+     * Splits the page text into tokens. Will fail
+     * if the handlers report an error or if no
+     * content is consumed. If successful then each
+     * unparsed and parsed token invokes a call to the
+     * held listener.
+     * @param string $raw        Raw HTML text.
+     * @return boolean           True on success, else false.
+     * @access public
+     */
+    function parse($raw) {
+        if (! isset($this->_parser)) {
+            return false;
+        }
+        $initialLength = strlen($raw);
+        $length = $initialLength;
+        $pos = 0;
+        while (is_array($parsed = $this->_reduce($raw))) {
+            list($unmatched, $matched, $mode) = $parsed;
+            $currentLength = strlen($raw);
+            $matchPos = $initialLength - $currentLength - strlen($matched);
+            if (! $this->_dispatchTokens($unmatched, $matched, $mode, $pos, $matchPos)) {
+                return false;
+            }
+            if ($currentLength == $length) {
+                return false;
+            }
+            $length = $currentLength;
+            $pos = $initialLength - $currentLength;
+        }
+        if (!$parsed) {
+            return false;
+        }
+        return $this->_invokeParser($raw, DOKU_LEXER_UNMATCHED, $pos);
+    }
+
+    /**
+     * Sends the matched token and any leading unmatched
+     * text to the parser changing the lexer to a new
+     * mode if one is listed.
+     * @param string $unmatched Unmatched leading portion.
+     * @param string $matched Actual token match.
+     * @param bool|string $mode Mode after match. A boolean
+     *                             false mode causes no change.
+     * @param int $initialPos
+     * @param int $matchPos
+     *                             Current byte index location in raw doc
+     *                             thats being parsed
+     * @return boolean             False if there was any error
+     *                             from the parser.
+     * @access private
+     */
+    function _dispatchTokens($unmatched, $matched, $mode = false, $initialPos, $matchPos) {
+        if (! $this->_invokeParser($unmatched, DOKU_LEXER_UNMATCHED, $initialPos) ){
+            return false;
+        }
+        if ($this->_isModeEnd($mode)) {
+            if (! $this->_invokeParser($matched, DOKU_LEXER_EXIT, $matchPos)) {
+                return false;
+            }
+            return $this->_mode->leave();
+        }
+        if ($this->_isSpecialMode($mode)) {
+            $this->_mode->enter($this->_decodeSpecial($mode));
+            if (! $this->_invokeParser($matched, DOKU_LEXER_SPECIAL, $matchPos)) {
+                return false;
+            }
+            return $this->_mode->leave();
+        }
+        if (is_string($mode)) {
+            $this->_mode->enter($mode);
+            return $this->_invokeParser($matched, DOKU_LEXER_ENTER, $matchPos);
+        }
+        return $this->_invokeParser($matched, DOKU_LEXER_MATCHED, $matchPos);
+    }
+
+    /**
+     * Tests to see if the new mode is actually to leave
+     * the current mode and pop an item from the matching
+     * mode stack.
+     * @param string $mode    Mode to test.
+     * @return boolean        True if this is the exit mode.
+     * @access private
+     */
+    function _isModeEnd($mode) {
+        return ($mode === "__exit");
+    }
+
+    /**
+     * Test to see if the mode is one where this mode
+     * is entered for this token only and automatically
+     * leaves immediately afterwoods.
+     * @param string $mode    Mode to test.
+     * @return boolean        True if this is the exit mode.
+     * @access private
+     */
+    function _isSpecialMode($mode) {
+        return (strncmp($mode, "_", 1) == 0);
+    }
+
+    /**
+     * Strips the magic underscore marking single token
+     * modes.
+     * @param string $mode    Mode to decode.
+     * @return string         Underlying mode name.
+     * @access private
+     */
+    function _decodeSpecial($mode) {
+        return substr($mode, 1);
+    }
+
+    /**
+     * Calls the parser method named after the current
+     * mode. Empty content will be ignored. The lexer
+     * has a parser handler for each mode in the lexer.
+     * @param string $content Text parsed.
+     * @param boolean $is_match Token is recognised rather
+     *                               than unparsed data.
+     * @param int $pos Current byte index location in raw doc
+     *                             thats being parsed
+     * @return bool
+     * @access private
+     */
+    function _invokeParser($content, $is_match, $pos) {
+        if (($content === "") || ($content === false)) {
+            return true;
+        }
+        $handler = $this->_mode->getCurrent();
+        if (isset($this->_mode_handlers[$handler])) {
+            $handler = $this->_mode_handlers[$handler];
+        }
+
+        // modes starting with plugin_ are all handled by the same
+        // handler but with an additional parameter
+        if(substr($handler,0,7)=='plugin_'){
+            list($handler,$plugin) = explode('_',$handler,2);
+            return $this->_parser->$handler($content, $is_match, $pos, $plugin);
+        }
+
+            return $this->_parser->$handler($content, $is_match, $pos);
+        }
+
+    /**
+     * Tries to match a chunk of text and if successful
+     * removes the recognised chunk and any leading
+     * unparsed data. Empty strings will not be matched.
+     * @param string $raw         The subject to parse. This is the
+     *                            content that will be eaten.
+     * @return array              Three item list of unparsed
+     *                            content followed by the
+     *                            recognised token and finally the
+     *                            action the parser is to take.
+     *                            True if no match, false if there
+     *                            is a parsing error.
+     * @access private
+     */
+    function _reduce(&$raw) {
+        if (! isset($this->_regexes[$this->_mode->getCurrent()])) {
+            return false;
+        }
+        if ($raw === "") {
+            return true;
+        }
+        if ($action = $this->_regexes[$this->_mode->getCurrent()]->split($raw, $split)) {
+            list($unparsed, $match, $raw) = $split;
+            return array($unparsed, $match, $action);
+        }
+        return true;
+    }
+}
+
+/**
+ * Escapes regex characters other than (, ) and /
+ *
+ * @TODO
+ *
+ * @param string $str
+ *
+ * @return mixed
+ */
+function Doku_Lexer_Escape($str) {
+    //$str = addslashes($str);
+    $chars = array(
+        '/\\\\/',
+        '/\./',
+        '/\+/',
+        '/\*/',
+        '/\?/',
+        '/\[/',
+        '/\^/',
+        '/\]/',
+        '/\$/',
+        '/\{/',
+        '/\}/',
+        '/\=/',
+        '/\!/',
+        '/\</',
+        '/\>/',
+        '/\|/',
+        '/\:/'
+        );
+
+    $escaped = array(
+        '\\\\\\\\',
+        '\.',
+        '\+',
+        '\*',
+        '\?',
+        '\[',
+        '\^',
+        '\]',
+        '\$',
+        '\{',
+        '\}',
+        '\=',
+        '\!',
+        '\<',
+        '\>',
+        '\|',
+        '\:'
+        );
+    return preg_replace($chars, $escaped, $str);
+}
+
+//Setup VIM: ex: et ts=4 sw=4 :
diff --git a/wiki/inc/parser/metadata.php b/wiki/inc/parser/metadata.php
new file mode 100644
index 0000000..9b1b5c9
--- /dev/null
+++ b/wiki/inc/parser/metadata.php
@@ -0,0 +1,694 @@
+<?php
+/**
+ * Renderer for metadata
+ *
+ * @author Esther Brunner <wikidesign@gmail.com>
+ */
+if(!defined('DOKU_INC')) die('meh.');
+
+if(!defined('DOKU_LF')) {
+    // Some whitespace to help View > Source
+    define ('DOKU_LF', "\n");
+}
+
+if(!defined('DOKU_TAB')) {
+    // Some whitespace to help View > Source
+    define ('DOKU_TAB', "\t");
+}
+
+/**
+ * The MetaData Renderer
+ *
+ * Metadata is additional information about a DokuWiki page that gets extracted mainly from the page's content
+ * but also it's own filesystem data (like the creation time). All metadata is stored in the fields $meta and
+ * $persistent.
+ *
+ * Some simplified rendering to $doc is done to gather the page's (text-only) abstract.
+ */
+class Doku_Renderer_metadata extends Doku_Renderer {
+    /** the approximate byte lenght to capture for the abstract */
+    const ABSTRACT_LEN = 250;
+
+    /** the maximum UTF8 character length for the abstract */
+    const ABSTRACT_MAX = 500;
+
+    /** @var array transient meta data, will be reset on each rendering */
+    public $meta = array();
+
+    /** @var array persistent meta data, will be kept until explicitly deleted */
+    public $persistent = array();
+
+    /** @var array the list of headers used to create unique link ids */
+    protected $headers = array();
+
+    /** @var string temporary $doc store */
+    protected $store = '';
+
+    /** @var string keeps the first image reference */
+    protected $firstimage = '';
+
+    /** @var bool determines if enough data for the abstract was collected, yet */
+    public $capture = true;
+
+    /** @var int number of bytes captured for abstract */
+    protected $captured = 0;
+
+    /**
+     * Returns the format produced by this renderer.
+     *
+     * @return string always 'metadata'
+     */
+    function getFormat() {
+        return 'metadata';
+    }
+
+    /**
+     * Initialize the document
+     *
+     * Sets up some of the persistent info about the page if it doesn't exist, yet.
+     */
+    function document_start() {
+        global $ID;
+
+        $this->headers = array();
+
+        // external pages are missing create date
+        if(!$this->persistent['date']['created']) {
+            $this->persistent['date']['created'] = filectime(wikiFN($ID));
+        }
+        if(!isset($this->persistent['user'])) {
+            $this->persistent['user'] = '';
+        }
+        if(!isset($this->persistent['creator'])) {
+            $this->persistent['creator'] = '';
+        }
+        // reset metadata to persistent values
+        $this->meta = $this->persistent;
+    }
+
+    /**
+     * Finalize the document
+     *
+     * Stores collected data in the metadata
+     */
+    function document_end() {
+        global $ID;
+
+        // store internal info in metadata (notoc,nocache)
+        $this->meta['internal'] = $this->info;
+
+        if(!isset($this->meta['description']['abstract'])) {
+            // cut off too long abstracts
+            $this->doc = trim($this->doc);
+            if(strlen($this->doc) > self::ABSTRACT_MAX) {
+                $this->doc = utf8_substr($this->doc, 0, self::ABSTRACT_MAX).'…';
+            }
+            $this->meta['description']['abstract'] = $this->doc;
+        }
+
+        $this->meta['relation']['firstimage'] = $this->firstimage;
+
+        if(!isset($this->meta['date']['modified'])) {
+            $this->meta['date']['modified'] = filemtime(wikiFN($ID));
+        }
+
+    }
+
+    /**
+     * Render plain text data
+     *
+     * This function takes care of the amount captured data and will stop capturing when
+     * enough abstract data is available
+     *
+     * @param $text
+     */
+    function cdata($text) {
+        if(!$this->capture) return;
+
+        $this->doc .= $text;
+
+        $this->captured += strlen($text);
+        if($this->captured > self::ABSTRACT_LEN) $this->capture = false;
+    }
+
+    /**
+     * Add an item to the TOC
+     *
+     * @param string $id       the hash link
+     * @param string $text     the text to display
+     * @param int    $level    the nesting level
+     */
+    function toc_additem($id, $text, $level) {
+        global $conf;
+
+        //only add items within configured levels
+        if($level >= $conf['toptoclevel'] && $level <= $conf['maxtoclevel']) {
+            // the TOC is one of our standard ul list arrays ;-)
+            $this->meta['description']['tableofcontents'][] = array(
+                'hid'   => $id,
+                'title' => $text,
+                'type'  => 'ul',
+                'level' => $level - $conf['toptoclevel'] + 1
+            );
+        }
+
+    }
+
+    /**
+     * Render a heading
+     *
+     * @param string $text  the text to display
+     * @param int    $level header level
+     * @param int    $pos   byte position in the original source
+     */
+    function header($text, $level, $pos) {
+        if(!isset($this->meta['title'])) $this->meta['title'] = $text;
+
+        // add the header to the TOC
+        $hid = $this->_headerToLink($text, true);
+        $this->toc_additem($hid, $text, $level);
+
+        // add to summary
+        $this->cdata(DOKU_LF.$text.DOKU_LF);
+    }
+
+    /**
+     * Open a paragraph
+     */
+    function p_open() {
+        $this->cdata(DOKU_LF);
+    }
+
+    /**
+     * Close a paragraph
+     */
+    function p_close() {
+        $this->cdata(DOKU_LF);
+    }
+
+    /**
+     * Create a line break
+     */
+    function linebreak() {
+        $this->cdata(DOKU_LF);
+    }
+
+    /**
+     * Create a horizontal line
+     */
+    function hr() {
+        $this->cdata(DOKU_LF.'----------'.DOKU_LF);
+    }
+
+    /**
+     * Callback for footnote start syntax
+     *
+     * All following content will go to the footnote instead of
+     * the document. To achieve this the previous rendered content
+     * is moved to $store and $doc is cleared
+     *
+     * @author Andreas Gohr <andi@splitbrain.org>
+     */
+    function footnote_open() {
+        if($this->capture) {
+            // move current content to store and record footnote
+            $this->store = $this->doc;
+            $this->doc   = '';
+        }
+    }
+
+    /**
+     * Callback for footnote end syntax
+     *
+     * All rendered content is moved to the $footnotes array and the old
+     * content is restored from $store again
+     *
+     * @author Andreas Gohr
+     */
+    function footnote_close() {
+        if($this->capture) {
+            // restore old content
+            $this->doc   = $this->store;
+            $this->store = '';
+        }
+    }
+
+    /**
+     * Open an unordered list
+     */
+    function listu_open() {
+        $this->cdata(DOKU_LF);
+    }
+
+    /**
+     * Open an ordered list
+     */
+    function listo_open() {
+        $this->cdata(DOKU_LF);
+    }
+
+    /**
+     * Open a list item
+     *
+     * @param int $level the nesting level
+     * @param bool $node true when a node; false when a leaf
+     */
+    function listitem_open($level,$node=false) {
+        $this->cdata(str_repeat(DOKU_TAB, $level).'* ');
+    }
+
+    /**
+     * Close a list item
+     */
+    function listitem_close() {
+        $this->cdata(DOKU_LF);
+    }
+
+    /**
+     * Output preformatted text
+     *
+     * @param string $text
+     */
+    function preformatted($text) {
+        $this->cdata($text);
+    }
+
+    /**
+     * Start a block quote
+     */
+    function quote_open() {
+        $this->cdata(DOKU_LF.DOKU_TAB.'"');
+    }
+
+    /**
+     * Stop a block quote
+     */
+    function quote_close() {
+        $this->cdata('"'.DOKU_LF);
+    }
+
+    /**
+     * Display text as file content, optionally syntax highlighted
+     *
+     * @param string $text text to show
+     * @param string $lang programming language to use for syntax highlighting
+     * @param string $file file path label
+     */
+    function file($text, $lang = null, $file = null) {
+        $this->cdata(DOKU_LF.$text.DOKU_LF);
+    }
+
+    /**
+     * Display text as code content, optionally syntax highlighted
+     *
+     * @param string $text     text to show
+     * @param string $language programming language to use for syntax highlighting
+     * @param string $file     file path label
+     */
+    function code($text, $language = null, $file = null) {
+        $this->cdata(DOKU_LF.$text.DOKU_LF);
+    }
+
+    /**
+     * Format an acronym
+     *
+     * Uses $this->acronyms
+     *
+     * @param string $acronym
+     */
+    function acronym($acronym) {
+        $this->cdata($acronym);
+    }
+
+    /**
+     * Format a smiley
+     *
+     * Uses $this->smiley
+     *
+     * @param string $smiley
+     */
+    function smiley($smiley) {
+        $this->cdata($smiley);
+    }
+
+    /**
+     * Format an entity
+     *
+     * Entities are basically small text replacements
+     *
+     * Uses $this->entities
+     *
+     * @param string $entity
+     */
+    function entity($entity) {
+        $this->cdata($entity);
+    }
+
+    /**
+     * Typographically format a multiply sign
+     *
+     * Example: ($x=640, $y=480) should result in "640×480"
+     *
+     * @param string|int $x first value
+     * @param string|int $y second value
+     */
+    function multiplyentity($x, $y) {
+        $this->cdata($x.'×'.$y);
+    }
+
+    /**
+     * Render an opening single quote char (language specific)
+     */
+    function singlequoteopening() {
+        global $lang;
+        $this->cdata($lang['singlequoteopening']);
+    }
+
+    /**
+     * Render a closing single quote char (language specific)
+     */
+    function singlequoteclosing() {
+        global $lang;
+        $this->cdata($lang['singlequoteclosing']);
+    }
+
+    /**
+     * Render an apostrophe char (language specific)
+     */
+    function apostrophe() {
+        global $lang;
+        $this->cdata($lang['apostrophe']);
+    }
+
+    /**
+     * Render an opening double quote char (language specific)
+     */
+    function doublequoteopening() {
+        global $lang;
+        $this->cdata($lang['doublequoteopening']);
+    }
+
+    /**
+     * Render an closinging double quote char (language specific)
+     */
+    function doublequoteclosing() {
+        global $lang;
+        $this->cdata($lang['doublequoteclosing']);
+    }
+
+    /**
+     * Render a CamelCase link
+     *
+     * @param string $link The link name
+     * @see http://en.wikipedia.org/wiki/CamelCase
+     */
+    function camelcaselink($link) {
+        $this->internallink($link, $link);
+    }
+
+    /**
+     * Render a page local link
+     *
+     * @param string $hash hash link identifier
+     * @param string $name name for the link
+     */
+    function locallink($hash, $name = null) {
+        if(is_array($name)) {
+            $this->_firstimage($name['src']);
+            if($name['type'] == 'internalmedia') $this->_recordMediaUsage($name['src']);
+        }
+    }
+
+    /**
+     * keep track of internal links in $this->meta['relation']['references']
+     *
+     * @param string            $id   page ID to link to. eg. 'wiki:syntax'
+     * @param string|array|null $name name for the link, array for media file
+     */
+    function internallink($id, $name = null) {
+        global $ID;
+
+        if(is_array($name)) {
+            $this->_firstimage($name['src']);
+            if($name['type'] == 'internalmedia') $this->_recordMediaUsage($name['src']);
+        }
+
+        $parts = explode('?', $id, 2);
+        if(count($parts) === 2) {
+            $id = $parts[0];
+        }
+
+        $default = $this->_simpleTitle($id);
+
+        // first resolve and clean up the $id
+        resolve_pageid(getNS($ID), $id, $exists);
+        @list($page) = explode('#', $id, 2);
+
+        // set metadata
+        $this->meta['relation']['references'][$page] = $exists;
+        // $data = array('relation' => array('isreferencedby' => array($ID => true)));
+        // p_set_metadata($id, $data);
+
+        // add link title to summary
+        if($this->capture) {
+            $name = $this->_getLinkTitle($name, $default, $id);
+            $this->doc .= $name;
+        }
+    }
+
+    /**
+     * Render an external link
+     *
+     * @param string            $url  full URL with scheme
+     * @param string|array|null $name name for the link, array for media file
+     */
+    function externallink($url, $name = null) {
+        if(is_array($name)) {
+            $this->_firstimage($name['src']);
+            if($name['type'] == 'internalmedia') $this->_recordMediaUsage($name['src']);
+        }
+
+        if($this->capture) {
+            $this->doc .= $this->_getLinkTitle($name, '<'.$url.'>');
+        }
+    }
+
+    /**
+     * Render an interwiki link
+     *
+     * You may want to use $this->_resolveInterWiki() here
+     *
+     * @param string       $match     original link - probably not much use
+     * @param string|array $name      name for the link, array for media file
+     * @param string       $wikiName  indentifier (shortcut) for the remote wiki
+     * @param string       $wikiUri   the fragment parsed from the original link
+     */
+    function interwikilink($match, $name = null, $wikiName, $wikiUri) {
+        if(is_array($name)) {
+            $this->_firstimage($name['src']);
+            if($name['type'] == 'internalmedia') $this->_recordMediaUsage($name['src']);
+        }
+
+        if($this->capture) {
+            list($wikiUri) = explode('#', $wikiUri, 2);
+            $name = $this->_getLinkTitle($name, $wikiUri);
+            $this->doc .= $name;
+        }
+    }
+
+    /**
+     * Link to windows share
+     *
+     * @param string       $url  the link
+     * @param string|array $name name for the link, array for media file
+     */
+    function windowssharelink($url, $name = null) {
+        if(is_array($name)) {
+            $this->_firstimage($name['src']);
+            if($name['type'] == 'internalmedia') $this->_recordMediaUsage($name['src']);
+        }
+
+        if($this->capture) {
+            if($name) $this->doc .= $name;
+            else $this->doc .= '<'.$url.'>';
+        }
+    }
+
+    /**
+     * Render a linked E-Mail Address
+     *
+     * Should honor $conf['mailguard'] setting
+     *
+     * @param string       $address Email-Address
+     * @param string|array $name    name for the link, array for media file
+     */
+    function emaillink($address, $name = null) {
+        if(is_array($name)) {
+            $this->_firstimage($name['src']);
+            if($name['type'] == 'internalmedia') $this->_recordMediaUsage($name['src']);
+        }
+
+        if($this->capture) {
+            if($name) $this->doc .= $name;
+            else $this->doc .= '<'.$address.'>';
+        }
+    }
+
+    /**
+     * Render an internal media file
+     *
+     * @param string $src     media ID
+     * @param string $title   descriptive text
+     * @param string $align   left|center|right
+     * @param int    $width   width of media in pixel
+     * @param int    $height  height of media in pixel
+     * @param string $cache   cache|recache|nocache
+     * @param string $linking linkonly|detail|nolink
+     */
+    function internalmedia($src, $title = null, $align = null, $width = null,
+                           $height = null, $cache = null, $linking = null) {
+        if($this->capture && $title) $this->doc .= '['.$title.']';
+        $this->_firstimage($src);
+        $this->_recordMediaUsage($src);
+    }
+
+    /**
+     * Render an external media file
+     *
+     * @param string $src     full media URL
+     * @param string $title   descriptive text
+     * @param string $align   left|center|right
+     * @param int    $width   width of media in pixel
+     * @param int    $height  height of media in pixel
+     * @param string $cache   cache|recache|nocache
+     * @param string $linking linkonly|detail|nolink
+     */
+    function externalmedia($src, $title = null, $align = null, $width = null,
+                           $height = null, $cache = null, $linking = null) {
+        if($this->capture && $title) $this->doc .= '['.$title.']';
+        $this->_firstimage($src);
+    }
+
+    /**
+     * Render the output of an RSS feed
+     *
+     * @param string $url    URL of the feed
+     * @param array  $params Finetuning of the output
+     */
+    function rss($url, $params) {
+        $this->meta['relation']['haspart'][$url] = true;
+
+        $this->meta['date']['valid']['age'] =
+            isset($this->meta['date']['valid']['age']) ?
+                min($this->meta['date']['valid']['age'], $params['refresh']) :
+                $params['refresh'];
+    }
+
+    #region Utils
+
+    /**
+     * Removes any Namespace from the given name but keeps
+     * casing and special chars
+     *
+     * @author Andreas Gohr <andi@splitbrain.org>
+     *
+     * @param string $name
+     *
+     * @return mixed|string
+     */
+    function _simpleTitle($name) {
+        global $conf;
+
+        if(is_array($name)) return '';
+
+        if($conf['useslash']) {
+            $nssep = '[:;/]';
+        } else {
+            $nssep = '[:;]';
+        }
+        $name = preg_replace('!.*'.$nssep.'!', '', $name);
+        //if there is a hash we use the anchor name only
+        $name = preg_replace('!.*#!', '', $name);
+        return $name;
+    }
+
+    /**
+     * Creates a linkid from a headline
+     *
+     * @author Andreas Gohr <andi@splitbrain.org>
+     * @param string  $title   The headline title
+     * @param boolean $create  Create a new unique ID?
+     * @return string
+     */
+    function _headerToLink($title, $create = false) {
+        if($create) {
+            return sectionID($title, $this->headers);
+        } else {
+            $check = false;
+            return sectionID($title, $check);
+        }
+    }
+
+    /**
+     * Construct a title and handle images in titles
+     *
+     * @author Harry Fuecks <hfuecks@gmail.com>
+     * @param string|array|null $title    either string title or media array
+     * @param string            $default  default title if nothing else is found
+     * @param null|string       $id       linked page id (used to extract title from first heading)
+     * @return string title text
+     */
+    function _getLinkTitle($title, $default, $id = null) {
+        if(is_array($title)) {
+            if($title['title']) {
+                return '['.$title['title'].']';
+            } else {
+                return $default;
+            }
+        } else if(is_null($title) || trim($title) == '') {
+            if(useHeading('content') && $id) {
+                $heading = p_get_first_heading($id, METADATA_DONT_RENDER);
+                if($heading) return $heading;
+            }
+            return $default;
+        } else {
+            return $title;
+        }
+    }
+
+    /**
+     * Remember first image
+     *
+     * @param string $src image URL or ID
+     */
+    function _firstimage($src) {
+        if($this->firstimage) return;
+        global $ID;
+
+        list($src) = explode('#', $src, 2);
+        if(!media_isexternal($src)) {
+            resolve_mediaid(getNS($ID), $src, $exists);
+        }
+        if(preg_match('/.(jpe?g|gif|png)$/i', $src)) {
+            $this->firstimage = $src;
+        }
+    }
+
+    /**
+     * Store list of used media files in metadata
+     *
+     * @param string $src media ID
+     */
+    function _recordMediaUsage($src) {
+        global $ID;
+
+        list ($src) = explode('#', $src, 2);
+        if(media_isexternal($src)) return;
+        resolve_mediaid(getNS($ID), $src, $exists);
+        $this->meta['relation']['media'][$src] = $exists;
+    }
+
+    #endregion
+}
+
+//Setup VIM: ex: et ts=4 :
diff --git a/wiki/inc/parser/parser.php b/wiki/inc/parser/parser.php
new file mode 100644
index 0000000..8cff2b8
--- /dev/null
+++ b/wiki/inc/parser/parser.php
@@ -0,0 +1,1034 @@
+<?php
+if(!defined('DOKU_INC')) die('meh.');
+require_once DOKU_INC . 'inc/parser/lexer.php';
+require_once DOKU_INC . 'inc/parser/handler.php';
+
+
+/**
+ * Define various types of modes used by the parser - they are used to
+ * populate the list of modes another mode accepts
+ */
+global $PARSER_MODES;
+$PARSER_MODES = array(
+    // containers are complex modes that can contain many other modes
+    // hr breaks the principle but they shouldn't be used in tables / lists
+    // so they are put here
+    'container'    => array('listblock','table','quote','hr'),
+
+    // some mode are allowed inside the base mode only
+    'baseonly'     => array('header'),
+
+    // modes for styling text -- footnote behaves similar to styling
+    'formatting'   => array('strong', 'emphasis', 'underline', 'monospace',
+                            'subscript', 'superscript', 'deleted', 'footnote'),
+
+    // modes where the token is simply replaced - they can not contain any
+    // other modes
+    'substition'   => array('acronym','smiley','wordblock','entity',
+                            'camelcaselink', 'internallink','media',
+                            'externallink','linebreak','emaillink',
+                            'windowssharelink','filelink','notoc',
+                            'nocache','multiplyentity','quotes','rss'),
+
+    // modes which have a start and end token but inside which
+    // no other modes should be applied
+    'protected'    => array('preformatted','code','file','php','html','htmlblock','phpblock'),
+
+    // inside this mode no wiki markup should be applied but lineendings
+    // and whitespace isn't preserved
+    'disabled'     => array('unformatted'),
+
+    // used to mark paragraph boundaries
+    'paragraphs'   => array('eol')
+);
+
+//-------------------------------------------------------------------
+
+/**
+ * Sets up the Lexer with modes and points it to the Handler
+ * For an intro to the Lexer see: wiki:parser
+ */
+class Doku_Parser {
+
+    var $Handler;
+
+    /**
+     * @var Doku_Lexer $Lexer
+     */
+    var $Lexer;
+
+    var $modes = array();
+
+    var $connected = false;
+
+    /**
+     * @param Doku_Parser_Mode_base $BaseMode
+     */
+    function addBaseMode($BaseMode) {
+        $this->modes['base'] = $BaseMode;
+        if ( !$this->Lexer ) {
+            $this->Lexer = new Doku_Lexer($this->Handler,'base', true);
+        }
+        $this->modes['base']->Lexer = $this->Lexer;
+    }
+
+    /**
+     * PHP preserves order of associative elements
+     * Mode sequence is important
+     *
+     * @param string $name
+     * @param Doku_Parser_Mode_Interface $Mode
+     */
+    function addMode($name, Doku_Parser_Mode_Interface $Mode) {
+        if ( !isset($this->modes['base']) ) {
+            $this->addBaseMode(new Doku_Parser_Mode_base());
+        }
+        $Mode->Lexer = $this->Lexer;
+        $this->modes[$name] = $Mode;
+    }
+
+    function connectModes() {
+
+        if ( $this->connected ) {
+            return;
+        }
+
+        foreach ( array_keys($this->modes) as $mode ) {
+
+            // Base isn't connected to anything
+            if ( $mode == 'base' ) {
+                continue;
+            }
+            $this->modes[$mode]->preConnect();
+
+            foreach ( array_keys($this->modes) as $cm ) {
+
+                if ( $this->modes[$cm]->accepts($mode) ) {
+                    $this->modes[$mode]->connectTo($cm);
+                }
+
+            }
+
+            $this->modes[$mode]->postConnect();
+        }
+
+        $this->connected = true;
+    }
+
+    function parse($doc) {
+        if ( $this->Lexer ) {
+            $this->connectModes();
+            // Normalize CRs and pad doc
+            $doc = "\n".str_replace("\r\n","\n",$doc)."\n";
+            $this->Lexer->parse($doc);
+            $this->Handler->_finalize();
+            return $this->Handler->calls;
+        } else {
+            return false;
+        }
+    }
+
+}
+
+//-------------------------------------------------------------------
+
+/**
+ * Class Doku_Parser_Mode_Interface
+ *
+ * Defines a mode (syntax component) in the Parser
+ */
+interface Doku_Parser_Mode_Interface {
+    /**
+     * returns a number used to determine in which order modes are added
+     */
+    public function getSort();
+
+    /**
+     * Called before any calls to connectTo
+     * @return void
+     */
+    function preConnect();
+
+    /**
+     * Connects the mode
+     *
+     * @param string $mode
+     * @return void
+     */
+    function connectTo($mode);
+
+    /**
+     * Called after all calls to connectTo
+     * @return void
+     */
+    function postConnect();
+
+    /**
+     * Check if given mode is accepted inside this mode
+     *
+     * @param string $mode
+     * @return bool
+     */
+    function accepts($mode);
+}
+
+/**
+ * This class and all the subclasses below are used to reduce the effort required to register
+ * modes with the Lexer.
+ *
+ * @author Harry Fuecks <hfuecks@gmail.com>
+ */
+class Doku_Parser_Mode implements Doku_Parser_Mode_Interface {
+    /**
+     * @var Doku_Lexer $Lexer
+     */
+    var $Lexer;
+    var $allowedModes = array();
+
+    function getSort() {
+        trigger_error('getSort() not implemented in '.get_class($this), E_USER_WARNING);
+    }
+
+    function preConnect() {}
+    function connectTo($mode) {}
+    function postConnect() {}
+    function accepts($mode) {
+        return in_array($mode, (array) $this->allowedModes );
+    }
+}
+
+/**
+ * Basically the same as Doku_Parser_Mode but extends from DokuWiki_Plugin
+ *
+ * Adds additional functions to syntax plugins
+ */
+class Doku_Parser_Mode_Plugin extends DokuWiki_Plugin implements Doku_Parser_Mode_Interface {
+    /**
+     * @var Doku_Lexer $Lexer
+     */
+    var $Lexer;
+    var $allowedModes = array();
+
+    /**
+     * Sort for applying this mode
+     *
+     * @return int
+     */
+    function getSort() {
+        trigger_error('getSort() not implemented in '.get_class($this), E_USER_WARNING);
+    }
+
+    function preConnect() {}
+    function connectTo($mode) {}
+    function postConnect() {}
+    function accepts($mode) {
+        return in_array($mode, (array) $this->allowedModes );
+    }
+}
+
+//-------------------------------------------------------------------
+class Doku_Parser_Mode_base extends Doku_Parser_Mode {
+
+    function __construct() {
+        global $PARSER_MODES;
+
+        $this->allowedModes = array_merge (
+                $PARSER_MODES['container'],
+                $PARSER_MODES['baseonly'],
+                $PARSER_MODES['paragraphs'],
+                $PARSER_MODES['formatting'],
+                $PARSER_MODES['substition'],
+                $PARSER_MODES['protected'],
+                $PARSER_MODES['disabled']
+            );
+    }
+
+    function getSort() {
+        return 0;
+    }
+}
+
+//-------------------------------------------------------------------
+class Doku_Parser_Mode_footnote extends Doku_Parser_Mode {
+
+    function __construct() {
+        global $PARSER_MODES;
+
+        $this->allowedModes = array_merge (
+                $PARSER_MODES['container'],
+                $PARSER_MODES['formatting'],
+                $PARSER_MODES['substition'],
+                $PARSER_MODES['protected'],
+                $PARSER_MODES['disabled']
+            );
+
+        unset($this->allowedModes[array_search('footnote', $this->allowedModes)]);
+    }
+
+    function connectTo($mode) {
+        $this->Lexer->addEntryPattern(
+            '\x28\x28(?=.*\x29\x29)',$mode,'footnote'
+            );
+    }
+
+    function postConnect() {
+        $this->Lexer->addExitPattern(
+            '\x29\x29','footnote'
+            );
+    }
+
+    function getSort() {
+        return 150;
+    }
+}
+
+//-------------------------------------------------------------------
+class Doku_Parser_Mode_header extends Doku_Parser_Mode {
+
+    function connectTo($mode) {
+        //we're not picky about the closing ones, two are enough
+        $this->Lexer->addSpecialPattern(
+                            '[ \t]*={2,}[^\n]+={2,}[ \t]*(?=\n)',
+                            $mode,
+                            'header'
+                        );
+    }
+
+    function getSort() {
+        return 50;
+    }
+}
+
+//-------------------------------------------------------------------
+class Doku_Parser_Mode_notoc extends Doku_Parser_Mode {
+
+    function connectTo($mode) {
+        $this->Lexer->addSpecialPattern('~~NOTOC~~',$mode,'notoc');
+    }
+
+    function getSort() {
+        return 30;
+    }
+}
+
+//-------------------------------------------------------------------
+class Doku_Parser_Mode_nocache extends Doku_Parser_Mode {
+
+    function connectTo($mode) {
+        $this->Lexer->addSpecialPattern('~~NOCACHE~~',$mode,'nocache');
+    }
+
+    function getSort() {
+        return 40;
+    }
+}
+
+//-------------------------------------------------------------------
+class Doku_Parser_Mode_linebreak extends Doku_Parser_Mode {
+
+    function connectTo($mode) {
+        $this->Lexer->addSpecialPattern('\x5C{2}(?:[ \t]|(?=\n))',$mode,'linebreak');
+    }
+
+    function getSort() {
+        return 140;
+    }
+}
+
+//-------------------------------------------------------------------
+class Doku_Parser_Mode_eol extends Doku_Parser_Mode {
+
+    function connectTo($mode) {
+        $badModes = array('listblock','table');
+        if ( in_array($mode, $badModes) ) {
+            return;
+        }
+        // see FS#1652, pattern extended to swallow preceding whitespace to avoid issues with lines that only contain whitespace
+        $this->Lexer->addSpecialPattern('(?:^[ \t]*)?\n',$mode,'eol');
+    }
+
+    function getSort() {
+        return 370;
+    }
+}
+
+//-------------------------------------------------------------------
+class Doku_Parser_Mode_hr extends Doku_Parser_Mode {
+
+    function connectTo($mode) {
+        $this->Lexer->addSpecialPattern('\n[ \t]*-{4,}[ \t]*(?=\n)',$mode,'hr');
+    }
+
+    function getSort() {
+        return 160;
+    }
+}
+
+//-------------------------------------------------------------------
+/**
+ * This class sets the markup for bold (=strong),
+ * italic (=emphasis), underline etc.
+ */
+class Doku_Parser_Mode_formatting extends Doku_Parser_Mode {
+    var $type;
+
+    var $formatting = array (
+        'strong' => array (
+            'entry'=>'\*\*(?=.*\*\*)',
+            'exit'=>'\*\*',
+            'sort'=>70
+            ),
+
+        'emphasis'=> array (
+            'entry'=>'//(?=[^\x00]*[^:])', //hack for bugs #384 #763 #1468
+            'exit'=>'//',
+            'sort'=>80
+            ),
+
+        'underline'=> array (
+            'entry'=>'__(?=.*__)',
+            'exit'=>'__',
+            'sort'=>90
+            ),
+
+        'monospace'=> array (
+            'entry'=>'\x27\x27(?=.*\x27\x27)',
+            'exit'=>'\x27\x27',
+            'sort'=>100
+            ),
+
+        'subscript'=> array (
+            'entry'=>'<sub>(?=.*</sub>)',
+            'exit'=>'</sub>',
+            'sort'=>110
+            ),
+
+        'superscript'=> array (
+            'entry'=>'<sup>(?=.*</sup>)',
+            'exit'=>'</sup>',
+            'sort'=>120
+            ),
+
+        'deleted'=> array (
+            'entry'=>'<del>(?=.*</del>)',
+            'exit'=>'</del>',
+            'sort'=>130
+            ),
+        );
+
+    /**
+     * @param string $type
+     */
+    function __construct($type) {
+        global $PARSER_MODES;
+
+        if ( !array_key_exists($type, $this->formatting) ) {
+            trigger_error('Invalid formatting type '.$type, E_USER_WARNING);
+        }
+
+        $this->type = $type;
+
+        // formatting may contain other formatting but not it self
+        $modes = $PARSER_MODES['formatting'];
+        $key = array_search($type, $modes);
+        if ( is_int($key) ) {
+            unset($modes[$key]);
+        }
+
+        $this->allowedModes = array_merge (
+                $modes,
+                $PARSER_MODES['substition'],
+                $PARSER_MODES['disabled']
+            );
+    }
+
+    function connectTo($mode) {
+
+        // Can't nest formatting in itself
+        if ( $mode == $this->type ) {
+            return;
+        }
+
+        $this->Lexer->addEntryPattern(
+                $this->formatting[$this->type]['entry'],
+                $mode,
+                $this->type
+            );
+    }
+
+    function postConnect() {
+
+        $this->Lexer->addExitPattern(
+            $this->formatting[$this->type]['exit'],
+            $this->type
+            );
+
+    }
+
+    function getSort() {
+        return $this->formatting[$this->type]['sort'];
+    }
+}
+
+//-------------------------------------------------------------------
+class Doku_Parser_Mode_listblock extends Doku_Parser_Mode {
+
+    function __construct() {
+        global $PARSER_MODES;
+
+        $this->allowedModes = array_merge (
+                $PARSER_MODES['formatting'],
+                $PARSER_MODES['substition'],
+                $PARSER_MODES['disabled'],
+                $PARSER_MODES['protected'] #XXX new
+            );
+
+    //    $this->allowedModes[] = 'footnote';
+    }
+
+    function connectTo($mode) {
+        $this->Lexer->addEntryPattern('[ \t]*\n {2,}[\-\*]',$mode,'listblock');
+        $this->Lexer->addEntryPattern('[ \t]*\n\t{1,}[\-\*]',$mode,'listblock');
+
+        $this->Lexer->addPattern('\n {2,}[\-\*]','listblock');
+        $this->Lexer->addPattern('\n\t{1,}[\-\*]','listblock');
+
+    }
+
+    function postConnect() {
+        $this->Lexer->addExitPattern('\n','listblock');
+    }
+
+    function getSort() {
+        return 10;
+    }
+}
+
+//-------------------------------------------------------------------
+class Doku_Parser_Mode_table extends Doku_Parser_Mode {
+
+    function __construct() {
+        global $PARSER_MODES;
+
+        $this->allowedModes = array_merge (
+                $PARSER_MODES['formatting'],
+                $PARSER_MODES['substition'],
+                $PARSER_MODES['disabled'],
+                $PARSER_MODES['protected']
+            );
+    }
+
+    function connectTo($mode) {
+        $this->Lexer->addEntryPattern('[\t ]*\n\^',$mode,'table');
+        $this->Lexer->addEntryPattern('[\t ]*\n\|',$mode,'table');
+    }
+
+    function postConnect() {
+        $this->Lexer->addPattern('\n\^','table');
+        $this->Lexer->addPattern('\n\|','table');
+        $this->Lexer->addPattern('[\t ]*:::[\t ]*(?=[\|\^])','table');
+        $this->Lexer->addPattern('[\t ]+','table');
+        $this->Lexer->addPattern('\^','table');
+        $this->Lexer->addPattern('\|','table');
+        $this->Lexer->addExitPattern('\n','table');
+    }
+
+    function getSort() {
+        return 60;
+    }
+}
+
+//-------------------------------------------------------------------
+class Doku_Parser_Mode_unformatted extends Doku_Parser_Mode {
+
+    function connectTo($mode) {
+        $this->Lexer->addEntryPattern('<nowiki>(?=.*</nowiki>)',$mode,'unformatted');
+        $this->Lexer->addEntryPattern('%%(?=.*%%)',$mode,'unformattedalt');
+    }
+
+    function postConnect() {
+        $this->Lexer->addExitPattern('</nowiki>','unformatted');
+        $this->Lexer->addExitPattern('%%','unformattedalt');
+        $this->Lexer->mapHandler('unformattedalt','unformatted');
+    }
+
+    function getSort() {
+        return 170;
+    }
+}
+
+//-------------------------------------------------------------------
+class Doku_Parser_Mode_php extends Doku_Parser_Mode {
+
+    function connectTo($mode) {
+        $this->Lexer->addEntryPattern('<php>(?=.*</php>)',$mode,'php');
+        $this->Lexer->addEntryPattern('<PHP>(?=.*</PHP>)',$mode,'phpblock');
+    }
+
+    function postConnect() {
+        $this->Lexer->addExitPattern('</php>','php');
+        $this->Lexer->addExitPattern('</PHP>','phpblock');
+    }
+
+    function getSort() {
+        return 180;
+    }
+}
+
+//-------------------------------------------------------------------
+class Doku_Parser_Mode_html extends Doku_Parser_Mode {
+
+    function connectTo($mode) {
+        $this->Lexer->addEntryPattern('<html>(?=.*</html>)',$mode,'html');
+        $this->Lexer->addEntryPattern('<HTML>(?=.*</HTML>)',$mode,'htmlblock');
+    }
+
+    function postConnect() {
+        $this->Lexer->addExitPattern('</html>','html');
+        $this->Lexer->addExitPattern('</HTML>','htmlblock');
+    }
+
+    function getSort() {
+        return 190;
+    }
+}
+
+//-------------------------------------------------------------------
+class Doku_Parser_Mode_preformatted extends Doku_Parser_Mode {
+
+    function connectTo($mode) {
+        // Has hard coded awareness of lists...
+        $this->Lexer->addEntryPattern('\n  (?![\*\-])',$mode,'preformatted');
+        $this->Lexer->addEntryPattern('\n\t(?![\*\-])',$mode,'preformatted');
+
+        // How to effect a sub pattern with the Lexer!
+        $this->Lexer->addPattern('\n  ','preformatted');
+        $this->Lexer->addPattern('\n\t','preformatted');
+
+    }
+
+    function postConnect() {
+        $this->Lexer->addExitPattern('\n','preformatted');
+    }
+
+    function getSort() {
+        return 20;
+    }
+}
+
+//-------------------------------------------------------------------
+class Doku_Parser_Mode_code extends Doku_Parser_Mode {
+
+    function connectTo($mode) {
+        $this->Lexer->addEntryPattern('<code\b(?=.*</code>)',$mode,'code');
+    }
+
+    function postConnect() {
+        $this->Lexer->addExitPattern('</code>','code');
+    }
+
+    function getSort() {
+        return 200;
+    }
+}
+
+//-------------------------------------------------------------------
+class Doku_Parser_Mode_file extends Doku_Parser_Mode {
+
+    function connectTo($mode) {
+        $this->Lexer->addEntryPattern('<file\b(?=.*</file>)',$mode,'file');
+    }
+
+    function postConnect() {
+        $this->Lexer->addExitPattern('</file>','file');
+    }
+
+    function getSort() {
+        return 210;
+    }
+}
+
+//-------------------------------------------------------------------
+class Doku_Parser_Mode_quote extends Doku_Parser_Mode {
+
+    function __construct() {
+        global $PARSER_MODES;
+
+        $this->allowedModes = array_merge (
+                $PARSER_MODES['formatting'],
+                $PARSER_MODES['substition'],
+                $PARSER_MODES['disabled'],
+                $PARSER_MODES['protected'] #XXX new
+            );
+            #$this->allowedModes[] = 'footnote';
+            #$this->allowedModes[] = 'preformatted';
+            #$this->allowedModes[] = 'unformatted';
+    }
+
+    function connectTo($mode) {
+        $this->Lexer->addEntryPattern('\n>{1,}',$mode,'quote');
+    }
+
+    function postConnect() {
+        $this->Lexer->addPattern('\n>{1,}','quote');
+        $this->Lexer->addExitPattern('\n','quote');
+    }
+
+    function getSort() {
+        return 220;
+    }
+}
+
+//-------------------------------------------------------------------
+class Doku_Parser_Mode_acronym extends Doku_Parser_Mode {
+    // A list
+    var $acronyms = array();
+    var $pattern = '';
+
+    function __construct($acronyms) {
+        usort($acronyms,array($this,'_compare'));
+        $this->acronyms = $acronyms;
+    }
+
+    function preConnect() {
+        if(!count($this->acronyms)) return;
+
+        $bound = '[\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]';
+        $acronyms = array_map('Doku_Lexer_Escape',$this->acronyms);
+        $this->pattern = '(?<=^|'.$bound.')(?:'.join('|',$acronyms).')(?='.$bound.')';
+    }
+
+    function connectTo($mode) {
+        if(!count($this->acronyms)) return;
+
+        if ( strlen($this->pattern) > 0 ) {
+            $this->Lexer->addSpecialPattern($this->pattern,$mode,'acronym');
+        }
+    }
+
+    function getSort() {
+        return 240;
+    }
+
+    /**
+     * sort callback to order by string length descending
+     *
+     * @param string $a
+     * @param string $b
+     *
+     * @return int
+     */
+    function _compare($a,$b) {
+        $a_len = strlen($a);
+        $b_len = strlen($b);
+        if ($a_len > $b_len) {
+            return -1;
+        } else if ($a_len < $b_len) {
+            return 1;
+        }
+
+        return 0;
+    }
+}
+
+//-------------------------------------------------------------------
+class Doku_Parser_Mode_smiley extends Doku_Parser_Mode {
+    // A list
+    var $smileys = array();
+    var $pattern = '';
+
+    function __construct($smileys) {
+        $this->smileys = $smileys;
+    }
+
+    function preConnect() {
+        if(!count($this->smileys) || $this->pattern != '') return;
+
+        $sep = '';
+        foreach ( $this->smileys as $smiley ) {
+            $this->pattern .= $sep.'(?<=\W|^)'.Doku_Lexer_Escape($smiley).'(?=\W|$)';
+            $sep = '|';
+        }
+    }
+
+    function connectTo($mode) {
+        if(!count($this->smileys)) return;
+
+        if ( strlen($this->pattern) > 0 ) {
+            $this->Lexer->addSpecialPattern($this->pattern,$mode,'smiley');
+        }
+    }
+
+    function getSort() {
+        return 230;
+    }
+}
+
+//-------------------------------------------------------------------
+class Doku_Parser_Mode_wordblock extends Doku_Parser_Mode {
+    // A list
+    var $badwords = array();
+    var $pattern = '';
+
+    function __construct($badwords) {
+        $this->badwords = $badwords;
+    }
+
+    function preConnect() {
+
+        if ( count($this->badwords) == 0 || $this->pattern != '') {
+            return;
+        }
+
+        $sep = '';
+        foreach ( $this->badwords as $badword ) {
+            $this->pattern .= $sep.'(?<=\b)(?i)'.Doku_Lexer_Escape($badword).'(?-i)(?=\b)';
+            $sep = '|';
+        }
+
+    }
+
+    function connectTo($mode) {
+        if ( strlen($this->pattern) > 0 ) {
+            $this->Lexer->addSpecialPattern($this->pattern,$mode,'wordblock');
+        }
+    }
+
+    function getSort() {
+        return 250;
+    }
+}
+
+//-------------------------------------------------------------------
+class Doku_Parser_Mode_entity extends Doku_Parser_Mode {
+    // A list
+    var $entities = array();
+    var $pattern = '';
+
+    function __construct($entities) {
+        $this->entities = $entities;
+    }
+
+    function preConnect() {
+        if(!count($this->entities) || $this->pattern != '') return;
+
+        $sep = '';
+        foreach ( $this->entities as $entity ) {
+            $this->pattern .= $sep.Doku_Lexer_Escape($entity);
+            $sep = '|';
+        }
+    }
+
+    function connectTo($mode) {
+        if(!count($this->entities)) return;
+
+        if ( strlen($this->pattern) > 0 ) {
+            $this->Lexer->addSpecialPattern($this->pattern,$mode,'entity');
+        }
+    }
+
+    function getSort() {
+        return 260;
+    }
+}
+
+//-------------------------------------------------------------------
+// Implements the 640x480 replacement
+class Doku_Parser_Mode_multiplyentity extends Doku_Parser_Mode {
+
+    function connectTo($mode) {
+
+        $this->Lexer->addSpecialPattern(
+                    '(?<=\b)(?:[1-9]|\d{2,})[xX]\d+(?=\b)',$mode,'multiplyentity'
+                );
+
+    }
+
+    function getSort() {
+        return 270;
+    }
+}
+
+//-------------------------------------------------------------------
+class Doku_Parser_Mode_quotes extends Doku_Parser_Mode {
+
+    function connectTo($mode) {
+        global $conf;
+
+        $ws   =  '\s/\#~:+=&%@\-\x28\x29\]\[{}><"\'';   // whitespace
+        $punc =  ';,\.?!';
+
+        if($conf['typography'] == 2){
+            $this->Lexer->addSpecialPattern(
+                        "(?<=^|[$ws])'(?=[^$ws$punc])",$mode,'singlequoteopening'
+                    );
+            $this->Lexer->addSpecialPattern(
+                        "(?<=^|[^$ws]|[$punc])'(?=$|[$ws$punc])",$mode,'singlequoteclosing'
+                    );
+            $this->Lexer->addSpecialPattern(
+                        "(?<=^|[^$ws$punc])'(?=$|[^$ws$punc])",$mode,'apostrophe'
+                    );
+        }
+
+        $this->Lexer->addSpecialPattern(
+                    "(?<=^|[$ws])\"(?=[^$ws$punc])",$mode,'doublequoteopening'
+                );
+        $this->Lexer->addSpecialPattern(
+                    "\"",$mode,'doublequoteclosing'
+                );
+
+    }
+
+    function getSort() {
+        return 280;
+    }
+}
+
+//-------------------------------------------------------------------
+class Doku_Parser_Mode_camelcaselink extends Doku_Parser_Mode {
+
+    function connectTo($mode) {
+        $this->Lexer->addSpecialPattern(
+                '\b[A-Z]+[a-z]+[A-Z][A-Za-z]*\b',$mode,'camelcaselink'
+            );
+    }
+
+    function getSort() {
+        return 290;
+    }
+}
+
+//-------------------------------------------------------------------
+class Doku_Parser_Mode_internallink extends Doku_Parser_Mode {
+
+    function connectTo($mode) {
+        // Word boundaries?
+        $this->Lexer->addSpecialPattern("\[\[.*?\]\](?!\])",$mode,'internallink');
+    }
+
+    function getSort() {
+        return 300;
+    }
+}
+
+//-------------------------------------------------------------------
+class Doku_Parser_Mode_media extends Doku_Parser_Mode {
+
+    function connectTo($mode) {
+        // Word boundaries?
+        $this->Lexer->addSpecialPattern("\{\{(?:[^\}]|(?:\}[^\}]))+\}\}",$mode,'media');
+    }
+
+    function getSort() {
+        return 320;
+    }
+}
+
+//-------------------------------------------------------------------
+class Doku_Parser_Mode_rss extends Doku_Parser_Mode {
+
+    function connectTo($mode) {
+        $this->Lexer->addSpecialPattern("\{\{rss>[^\}]+\}\}",$mode,'rss');
+    }
+
+    function getSort() {
+        return 310;
+    }
+}
+
+//-------------------------------------------------------------------
+class Doku_Parser_Mode_externallink extends Doku_Parser_Mode {
+    var $schemes = array();
+    var $patterns = array();
+
+    function preConnect() {
+        if(count($this->patterns)) return;
+
+        $ltrs = '\w';
+        $gunk = '/\#~:.?+=&%@!\-\[\]';
+        $punc = '.:?\-;,';
+        $host = $ltrs.$punc;
+        $any  = $ltrs.$gunk.$punc;
+
+        $this->schemes = getSchemes();
+        foreach ( $this->schemes as $scheme ) {
+            $this->patterns[] = '\b(?i)'.$scheme.'(?-i)://['.$any.']+?(?=['.$punc.']*[^'.$any.'])';
+        }
+
+        $this->patterns[] = '(?<=\s)(?i)www?(?-i)\.['.$host.']+?\.['.$host.']+?['.$any.']+?(?=['.$punc.']*[^'.$any.'])';
+        $this->patterns[] = '(?<=\s)(?i)ftp?(?-i)\.['.$host.']+?\.['.$host.']+?['.$any.']+?(?=['.$punc.']*[^'.$any.'])';
+    }
+
+    function connectTo($mode) {
+
+        foreach ( $this->patterns as $pattern ) {
+            $this->Lexer->addSpecialPattern($pattern,$mode,'externallink');
+        }
+    }
+
+    function getSort() {
+        return 330;
+    }
+}
+
+//-------------------------------------------------------------------
+class Doku_Parser_Mode_filelink extends Doku_Parser_Mode {
+
+    var $pattern;
+
+    function preConnect() {
+
+        $ltrs = '\w';
+        $gunk = '/\#~:.?+=&%@!\-';
+        $punc = '.:?\-;,';
+        $host = $ltrs.$punc;
+        $any  = $ltrs.$gunk.$punc;
+
+        $this->pattern = '\b(?i)file(?-i)://['.$any.']+?['.
+            $punc.']*[^'.$any.']';
+    }
+
+    function connectTo($mode) {
+        $this->Lexer->addSpecialPattern(
+            $this->pattern,$mode,'filelink');
+    }
+
+    function getSort() {
+        return 360;
+    }
+}
+
+//-------------------------------------------------------------------
+class Doku_Parser_Mode_windowssharelink extends Doku_Parser_Mode {
+
+    var $pattern;
+
+    function preConnect() {
+        $this->pattern = "\\\\\\\\\w+?(?:\\\\[\w\-$]+)+";
+    }
+
+    function connectTo($mode) {
+        $this->Lexer->addSpecialPattern(
+            $this->pattern,$mode,'windowssharelink');
+    }
+
+    function getSort() {
+        return 350;
+    }
+}
+
+//-------------------------------------------------------------------
+class Doku_Parser_Mode_emaillink extends Doku_Parser_Mode {
+
+    function connectTo($mode) {
+        // pattern below is defined in inc/mail.php
+        $this->Lexer->addSpecialPattern('<'.PREG_PATTERN_VALID_EMAIL.'>',$mode,'emaillink');
+    }
+
+    function getSort() {
+        return 340;
+    }
+}
+
+
+//Setup VIM: ex: et ts=4 :
diff --git a/wiki/inc/parser/renderer.php b/wiki/inc/parser/renderer.php
new file mode 100644
index 0000000..83b51d4
--- /dev/null
+++ b/wiki/inc/parser/renderer.php
@@ -0,0 +1,883 @@
+<?php
+/**
+ * Renderer output base class
+ *
+ * @author Harry Fuecks <hfuecks@gmail.com>
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+if(!defined('DOKU_INC')) die('meh.');
+
+/**
+ * Allowed chars in $language for code highlighting
+ * @see GeSHi::set_language()
+ */
+define('PREG_PATTERN_VALID_LANGUAGE', '#[^a-zA-Z0-9\-_]#');
+
+/**
+ * An empty renderer, produces no output
+ *
+ * Inherits from DokuWiki_Plugin for giving additional functions to render plugins
+ *
+ * The renderer transforms the syntax instructions created by the parser and handler into the
+ * desired output format. For each instruction a corresponding method defined in this class will
+ * be called. That method needs to produce the desired output for the instruction and add it to the
+ * $doc field. When all instructions are processed, the $doc field contents will be cached by
+ * DokuWiki and sent to the user.
+ */
+class Doku_Renderer extends DokuWiki_Plugin {
+    /** @var array Settings, control the behavior of the renderer */
+    public $info = array(
+        'cache' => true, // may the rendered result cached?
+        'toc'   => true, // render the TOC?
+    );
+
+    /** @var array contains the smiley configuration, set in p_render() */
+    public $smileys = array();
+    /** @var array contains the entity configuration, set in p_render() */
+    public $entities = array();
+    /** @var array contains the acronym configuration, set in p_render() */
+    public $acronyms = array();
+    /** @var array contains the interwiki configuration, set in p_render() */
+    public $interwiki = array();
+
+    /**
+     * @var string the rendered document, this will be cached after the renderer ran through
+     */
+    public $doc = '';
+
+    /**
+     * clean out any per-use values
+     *
+     * This is called before each use of the renderer object and should be used to
+     * completely reset the state of the renderer to be reused for a new document
+     */
+    function reset() {
+    }
+
+    /**
+     * Allow the plugin to prevent DokuWiki from reusing an instance
+     *
+     * Since most renderer plugins fail to implement Doku_Renderer::reset() we default
+     * to reinstantiating the renderer here
+     *
+     * @return bool   false if the plugin has to be instantiated
+     */
+    function isSingleton() {
+        return false;
+    }
+
+    /**
+     * Returns the format produced by this renderer.
+     *
+     * Has to be overidden by sub classes
+     *
+     * @return string
+     */
+    function getFormat() {
+        trigger_error('getFormat() not implemented in '.get_class($this), E_USER_WARNING);
+        return '';
+    }
+
+    /**
+     * Disable caching of this renderer's output
+     */
+    function nocache() {
+        $this->info['cache'] = false;
+    }
+
+    /**
+     * Disable TOC generation for this renderer's output
+     *
+     * This might not be used for certain sub renderer
+     */
+    function notoc() {
+        $this->info['toc'] = false;
+    }
+
+    /**
+     * Handle plugin rendering
+     *
+     * Most likely this needs NOT to be overwritten by sub classes
+     *
+     * @param string $name  Plugin name
+     * @param mixed  $data  custom data set by handler
+     * @param string $state matched state if any
+     * @param string $match raw matched syntax
+     */
+    function plugin($name, $data, $state = '', $match = '') {
+        /** @var DokuWiki_Syntax_Plugin $plugin */
+        $plugin = plugin_load('syntax', $name);
+        if($plugin != null) {
+            $plugin->render($this->getFormat(), $this, $data);
+        }
+    }
+
+    /**
+     * handle nested render instructions
+     * this method (and nest_close method) should not be overloaded in actual renderer output classes
+     *
+     * @param array $instructions
+     */
+    function nest($instructions) {
+        foreach($instructions as $instruction) {
+            // execute the callback against ourself
+            if(method_exists($this, $instruction[0])) {
+                call_user_func_array(array($this, $instruction[0]), $instruction[1] ? $instruction[1] : array());
+            }
+        }
+    }
+
+    /**
+     * dummy closing instruction issued by Doku_Handler_Nest
+     *
+     * normally the syntax mode should override this instruction when instantiating Doku_Handler_Nest -
+     * however plugins will not be able to - as their instructions require data.
+     */
+    function nest_close() {
+    }
+
+    #region Syntax modes - sub classes will need to implement them to fill $doc
+
+    /**
+     * Initialize the document
+     */
+    function document_start() {
+    }
+
+    /**
+     * Finalize the document
+     */
+    function document_end() {
+    }
+
+    /**
+     * Render the Table of Contents
+     *
+     * @return string
+     */
+    function render_TOC() {
+        return '';
+    }
+
+    /**
+     * Add an item to the TOC
+     *
+     * @param string $id       the hash link
+     * @param string $text     the text to display
+     * @param int    $level    the nesting level
+     */
+    function toc_additem($id, $text, $level) {
+    }
+
+    /**
+     * Render a heading
+     *
+     * @param string $text  the text to display
+     * @param int    $level header level
+     * @param int    $pos   byte position in the original source
+     */
+    function header($text, $level, $pos) {
+    }
+
+    /**
+     * Open a new section
+     *
+     * @param int $level section level (as determined by the previous header)
+     */
+    function section_open($level) {
+    }
+
+    /**
+     * Close the current section
+     */
+    function section_close() {
+    }
+
+    /**
+     * Render plain text data
+     *
+     * @param string $text
+     */
+    function cdata($text) {
+    }
+
+    /**
+     * Open a paragraph
+     */
+    function p_open() {
+    }
+
+    /**
+     * Close a paragraph
+     */
+    function p_close() {
+    }
+
+    /**
+     * Create a line break
+     */
+    function linebreak() {
+    }
+
+    /**
+     * Create a horizontal line
+     */
+    function hr() {
+    }
+
+    /**
+     * Start strong (bold) formatting
+     */
+    function strong_open() {
+    }
+
+    /**
+     * Stop strong (bold) formatting
+     */
+    function strong_close() {
+    }
+
+    /**
+     * Start emphasis (italics) formatting
+     */
+    function emphasis_open() {
+    }
+
+    /**
+     * Stop emphasis (italics) formatting
+     */
+    function emphasis_close() {
+    }
+
+    /**
+     * Start underline formatting
+     */
+    function underline_open() {
+    }
+
+    /**
+     * Stop underline formatting
+     */
+    function underline_close() {
+    }
+
+    /**
+     * Start monospace formatting
+     */
+    function monospace_open() {
+    }
+
+    /**
+     * Stop monospace formatting
+     */
+    function monospace_close() {
+    }
+
+    /**
+     * Start a subscript
+     */
+    function subscript_open() {
+    }
+
+    /**
+     * Stop a subscript
+     */
+    function subscript_close() {
+    }
+
+    /**
+     * Start a superscript
+     */
+    function superscript_open() {
+    }
+
+    /**
+     * Stop a superscript
+     */
+    function superscript_close() {
+    }
+
+    /**
+     * Start deleted (strike-through) formatting
+     */
+    function deleted_open() {
+    }
+
+    /**
+     * Stop deleted (strike-through) formatting
+     */
+    function deleted_close() {
+    }
+
+    /**
+     * Start a footnote
+     */
+    function footnote_open() {
+    }
+
+    /**
+     * Stop a footnote
+     */
+    function footnote_close() {
+    }
+
+    /**
+     * Open an unordered list
+     */
+    function listu_open() {
+    }
+
+    /**
+     * Close an unordered list
+     */
+    function listu_close() {
+    }
+
+    /**
+     * Open an ordered list
+     */
+    function listo_open() {
+    }
+
+    /**
+     * Close an ordered list
+     */
+    function listo_close() {
+    }
+
+    /**
+     * Open a list item
+     *
+     * @param int $level the nesting level
+     * @param bool $node true when a node; false when a leaf
+     */
+    function listitem_open($level,$node=false) {
+    }
+
+    /**
+     * Close a list item
+     */
+    function listitem_close() {
+    }
+
+    /**
+     * Start the content of a list item
+     */
+    function listcontent_open() {
+    }
+
+    /**
+     * Stop the content of a list item
+     */
+    function listcontent_close() {
+    }
+
+    /**
+     * Output unformatted $text
+     *
+     * Defaults to $this->cdata()
+     *
+     * @param string $text
+     */
+    function unformatted($text) {
+        $this->cdata($text);
+    }
+
+    /**
+     * Output inline PHP code
+     *
+     * If $conf['phpok'] is true this should evaluate the given code and append the result
+     * to $doc
+     *
+     * @param string $text The PHP code
+     */
+    function php($text) {
+    }
+
+    /**
+     * Output block level PHP code
+     *
+     * If $conf['phpok'] is true this should evaluate the given code and append the result
+     * to $doc
+     *
+     * @param string $text The PHP code
+     */
+    function phpblock($text) {
+    }
+
+    /**
+     * Output raw inline HTML
+     *
+     * If $conf['htmlok'] is true this should add the code as is to $doc
+     *
+     * @param string $text The HTML
+     */
+    function html($text) {
+    }
+
+    /**
+     * Output raw block-level HTML
+     *
+     * If $conf['htmlok'] is true this should add the code as is to $doc
+     *
+     * @param string $text The HTML
+     */
+    function htmlblock($text) {
+    }
+
+    /**
+     * Output preformatted text
+     *
+     * @param string $text
+     */
+    function preformatted($text) {
+    }
+
+    /**
+     * Start a block quote
+     */
+    function quote_open() {
+    }
+
+    /**
+     * Stop a block quote
+     */
+    function quote_close() {
+    }
+
+    /**
+     * Display text as file content, optionally syntax highlighted
+     *
+     * @param string $text text to show
+     * @param string $lang programming language to use for syntax highlighting
+     * @param string $file file path label
+     */
+    function file($text, $lang = null, $file = null) {
+    }
+
+    /**
+     * Display text as code content, optionally syntax highlighted
+     *
+     * @param string $text text to show
+     * @param string $lang programming language to use for syntax highlighting
+     * @param string $file file path label
+     */
+    function code($text, $lang = null, $file = null) {
+    }
+
+    /**
+     * Format an acronym
+     *
+     * Uses $this->acronyms
+     *
+     * @param string $acronym
+     */
+    function acronym($acronym) {
+    }
+
+    /**
+     * Format a smiley
+     *
+     * Uses $this->smiley
+     *
+     * @param string $smiley
+     */
+    function smiley($smiley) {
+    }
+
+    /**
+     * Format an entity
+     *
+     * Entities are basically small text replacements
+     *
+     * Uses $this->entities
+     *
+     * @param string $entity
+     */
+    function entity($entity) {
+    }
+
+    /**
+     * Typographically format a multiply sign
+     *
+     * Example: ($x=640, $y=480) should result in "640×480"
+     *
+     * @param string|int $x first value
+     * @param string|int $y second value
+     */
+    function multiplyentity($x, $y) {
+    }
+
+    /**
+     * Render an opening single quote char (language specific)
+     */
+    function singlequoteopening() {
+    }
+
+    /**
+     * Render a closing single quote char (language specific)
+     */
+    function singlequoteclosing() {
+    }
+
+    /**
+     * Render an apostrophe char (language specific)
+     */
+    function apostrophe() {
+    }
+
+    /**
+     * Render an opening double quote char (language specific)
+     */
+    function doublequoteopening() {
+    }
+
+    /**
+     * Render an closinging double quote char (language specific)
+     */
+    function doublequoteclosing() {
+    }
+
+    /**
+     * Render a CamelCase link
+     *
+     * @param string $link The link name
+     * @see http://en.wikipedia.org/wiki/CamelCase
+     */
+    function camelcaselink($link) {
+    }
+
+    /**
+     * Render a page local link
+     *
+     * @param string $hash hash link identifier
+     * @param string $name name for the link
+     */
+    function locallink($hash, $name = null) {
+    }
+
+    /**
+     * Render a wiki internal link
+     *
+     * @param string       $link  page ID to link to. eg. 'wiki:syntax'
+     * @param string|array $title name for the link, array for media file
+     */
+    function internallink($link, $title = null) {
+    }
+
+    /**
+     * Render an external link
+     *
+     * @param string       $link  full URL with scheme
+     * @param string|array $title name for the link, array for media file
+     */
+    function externallink($link, $title = null) {
+    }
+
+    /**
+     * Render the output of an RSS feed
+     *
+     * @param string $url    URL of the feed
+     * @param array  $params Finetuning of the output
+     */
+    function rss($url, $params) {
+    }
+
+    /**
+     * Render an interwiki link
+     *
+     * You may want to use $this->_resolveInterWiki() here
+     *
+     * @param string       $link     original link - probably not much use
+     * @param string|array $title    name for the link, array for media file
+     * @param string       $wikiName indentifier (shortcut) for the remote wiki
+     * @param string       $wikiUri  the fragment parsed from the original link
+     */
+    function interwikilink($link, $title = null, $wikiName, $wikiUri) {
+    }
+
+    /**
+     * Link to file on users OS
+     *
+     * @param string       $link  the link
+     * @param string|array $title name for the link, array for media file
+     */
+    function filelink($link, $title = null) {
+    }
+
+    /**
+     * Link to windows share
+     *
+     * @param string       $link  the link
+     * @param string|array $title name for the link, array for media file
+     */
+    function windowssharelink($link, $title = null) {
+    }
+
+    /**
+     * Render a linked E-Mail Address
+     *
+     * Should honor $conf['mailguard'] setting
+     *
+     * @param string $address Email-Address
+     * @param string|array $name name for the link, array for media file
+     */
+    function emaillink($address, $name = null) {
+    }
+
+    /**
+     * Render an internal media file
+     *
+     * @param string $src     media ID
+     * @param string $title   descriptive text
+     * @param string $align   left|center|right
+     * @param int    $width   width of media in pixel
+     * @param int    $height  height of media in pixel
+     * @param string $cache   cache|recache|nocache
+     * @param string $linking linkonly|detail|nolink
+     */
+    function internalmedia($src, $title = null, $align = null, $width = null,
+                           $height = null, $cache = null, $linking = null) {
+    }
+
+    /**
+     * Render an external media file
+     *
+     * @param string $src     full media URL
+     * @param string $title   descriptive text
+     * @param string $align   left|center|right
+     * @param int    $width   width of media in pixel
+     * @param int    $height  height of media in pixel
+     * @param string $cache   cache|recache|nocache
+     * @param string $linking linkonly|detail|nolink
+     */
+    function externalmedia($src, $title = null, $align = null, $width = null,
+                           $height = null, $cache = null, $linking = null) {
+    }
+
+    /**
+     * Render a link to an internal media file
+     *
+     * @param string $src     media ID
+     * @param string $title   descriptive text
+     * @param string $align   left|center|right
+     * @param int    $width   width of media in pixel
+     * @param int    $height  height of media in pixel
+     * @param string $cache   cache|recache|nocache
+     */
+    function internalmedialink($src, $title = null, $align = null,
+                               $width = null, $height = null, $cache = null) {
+    }
+
+    /**
+     * Render a link to an external media file
+     *
+     * @param string $src     media ID
+     * @param string $title   descriptive text
+     * @param string $align   left|center|right
+     * @param int    $width   width of media in pixel
+     * @param int    $height  height of media in pixel
+     * @param string $cache   cache|recache|nocache
+     */
+    function externalmedialink($src, $title = null, $align = null,
+                               $width = null, $height = null, $cache = null) {
+    }
+
+    /**
+     * Start a table
+     *
+     * @param int $maxcols maximum number of columns
+     * @param int $numrows NOT IMPLEMENTED
+     * @param int $pos     byte position in the original source
+     */
+    function table_open($maxcols = null, $numrows = null, $pos = null) {
+    }
+
+    /**
+     * Close a table
+     *
+     * @param int $pos byte position in the original source
+     */
+    function table_close($pos = null) {
+    }
+
+    /**
+     * Open a table header
+     */
+    function tablethead_open() {
+    }
+
+    /**
+     * Close a table header
+     */
+    function tablethead_close() {
+    }
+
+    /**
+     * Open a table body
+     */
+    function tabletbody_open() {
+    }
+
+    /**
+     * Close a table body
+     */
+    function tabletbody_close() {
+    }
+
+    /**
+     * Open a table footer
+     */
+    function tabletfoot_open() {
+    }
+
+    /**
+     * Close a table footer
+     */
+    function tabletfoot_close() {
+    }
+
+    /**
+     * Open a table row
+     */
+    function tablerow_open() {
+    }
+
+    /**
+     * Close a table row
+     */
+    function tablerow_close() {
+    }
+
+    /**
+     * Open a table header cell
+     *
+     * @param int    $colspan
+     * @param string $align left|center|right
+     * @param int    $rowspan
+     */
+    function tableheader_open($colspan = 1, $align = null, $rowspan = 1) {
+    }
+
+    /**
+     * Close a table header cell
+     */
+    function tableheader_close() {
+    }
+
+    /**
+     * Open a table cell
+     *
+     * @param int    $colspan
+     * @param string $align left|center|right
+     * @param int    $rowspan
+     */
+    function tablecell_open($colspan = 1, $align = null, $rowspan = 1) {
+    }
+
+    /**
+     * Close a table cell
+     */
+    function tablecell_close() {
+    }
+
+    #endregion
+
+    #region util functions, you probably won't need to reimplement them
+
+    /**
+     * Removes any Namespace from the given name but keeps
+     * casing and special chars
+     *
+     * @author Andreas Gohr <andi@splitbrain.org>
+     *
+     * @param string $name
+     * @return string
+     */
+    function _simpleTitle($name) {
+        global $conf;
+
+        //if there is a hash we use the ancor name only
+        @list($name, $hash) = explode('#', $name, 2);
+        if($hash) return $hash;
+
+        if($conf['useslash']) {
+            $name = strtr($name, ';/', ';:');
+        } else {
+            $name = strtr($name, ';', ':');
+        }
+
+        return noNSorNS($name);
+    }
+
+    /**
+     * Resolve an interwikilink
+     *
+     * @param string    $shortcut  identifier for the interwiki link
+     * @param string    $reference fragment that refers the content
+     * @param null|bool $exists    reference which returns if an internal page exists
+     * @return string interwikilink
+     */
+    function _resolveInterWiki(&$shortcut, $reference, &$exists = null) {
+        //get interwiki URL
+        if(isset($this->interwiki[$shortcut])) {
+            $url = $this->interwiki[$shortcut];
+        } else {
+            // Default to Google I'm feeling lucky
+            $url      = 'https://www.google.com/search?q={URL}&amp;btnI=lucky';
+            $shortcut = 'go';
+        }
+
+        //split into hash and url part
+        $hash = strrchr($reference, '#');
+        if($hash) {
+            $reference = substr($reference, 0, -strlen($hash));
+            $hash = substr($hash, 1);
+        }
+
+        //replace placeholder
+        if(preg_match('#\{(URL|NAME|SCHEME|HOST|PORT|PATH|QUERY)\}#', $url)) {
+            //use placeholders
+            $url    = str_replace('{URL}', rawurlencode($reference), $url);
+            //wiki names will be cleaned next, otherwise urlencode unsafe chars
+            $url    = str_replace('{NAME}', ($url{0} === ':') ? $reference :
+                                  preg_replace_callback('/[[\\\\\]^`{|}#%]/', function($match) {
+                                    return rawurlencode($match[0]);
+                                  }, $reference), $url);
+            $parsed = parse_url($reference);
+            if (empty($parsed['scheme'])) $parsed['scheme'] = '';
+            if (empty($parsed['host'])) $parsed['host'] = '';
+            if (empty($parsed['port'])) $parsed['port'] = 80;
+            if (empty($parsed['path'])) $parsed['path'] = '';
+            if (empty($parsed['query'])) $parsed['query'] = '';
+            $url = strtr($url,[
+                '{SCHEME}' => $parsed['scheme'],
+                '{HOST}' => $parsed['host'],
+                '{PORT}' => $parsed['port'],
+                '{PATH}' => $parsed['path'],
+                '{QUERY}' => $parsed['query'] ,
+            ]);
+        } else {
+            //default
+            $url = $url.rawurlencode($reference);
+        }
+        //handle as wiki links
+        if($url{0} === ':') {
+            $urlparam = null;
+            $id = $url;
+            if (strpos($url, '?') !== false) {
+                list($id, $urlparam) = explode('?', $url, 2);
+            }
+            $url    = wl(cleanID($id), $urlparam);
+            $exists = page_exists($id);
+        }
+        if($hash) $url .= '#'.rawurlencode($hash);
+
+        return $url;
+    }
+
+    #endregion
+}
+
+
+//Setup VIM: ex: et ts=4 :
diff --git a/wiki/inc/parser/xhtml.php b/wiki/inc/parser/xhtml.php
new file mode 100644
index 0000000..a3e7b45
--- /dev/null
+++ b/wiki/inc/parser/xhtml.php
@@ -0,0 +1,1970 @@
+<?php
+/**
+ * Renderer for XHTML output
+ *
+ * @author Harry Fuecks <hfuecks@gmail.com>
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+if(!defined('DOKU_INC')) die('meh.');
+
+if(!defined('DOKU_LF')) {
+    // Some whitespace to help View > Source
+    define ('DOKU_LF', "\n");
+}
+
+if(!defined('DOKU_TAB')) {
+    // Some whitespace to help View > Source
+    define ('DOKU_TAB', "\t");
+}
+
+/**
+ * The XHTML Renderer
+ *
+ * This is DokuWiki's main renderer used to display page content in the wiki
+ */
+class Doku_Renderer_xhtml extends Doku_Renderer {
+    /** @var array store the table of contents */
+    public $toc = array();
+
+    /** @var array A stack of section edit data */
+    protected $sectionedits = array();
+    var $date_at = '';    // link pages and media against this revision
+
+    /** @var int last section edit id, used by startSectionEdit */
+    protected $lastsecid = 0;
+
+    /** @var array the list of headers used to create unique link ids */
+    protected $headers = array();
+
+    /** @var array a list of footnotes, list starts at 1! */
+    protected $footnotes = array();
+
+    /** @var int current section level */
+    protected $lastlevel = 0;
+    /** @var array section node tracker */
+    protected $node = array(0, 0, 0, 0, 0);
+
+    /** @var string temporary $doc store */
+    protected $store = '';
+
+    /** @var array global counter, for table classes etc. */
+    protected $_counter = array(); //
+
+    /** @var int counts the code and file blocks, used to provide download links */
+    protected $_codeblock = 0;
+
+    /** @var array list of allowed URL schemes */
+    protected $schemes = null;
+
+    /**
+     * Register a new edit section range
+     *
+     * @param int    $start  The byte position for the edit start
+     * @param array  $data   Associative array with section data:
+     *                       Key 'name': the section name/title
+     *                       Key 'target': the target for the section edit,
+     *                                     e.g. 'section' or 'table'
+     *                       Key 'hid': header id
+     *                       Key 'codeblockOffset': actual code block index
+     *                       Key 'start': set in startSectionEdit(),
+     *                                    do not set yourself
+     *                       Key 'range': calculated from 'start' and
+     *                                    $key in finishSectionEdit(),
+     *                                    do not set yourself
+     * @return string  A marker class for the starting HTML element
+     *
+     * @author Adrian Lang <lang@cosmocode.de>
+     */
+    public function startSectionEdit($start, $data) {
+        if (!is_array($data)) {
+            msg(
+                sprintf(
+                    'startSectionEdit: $data "%s" is NOT an array! One of your plugins needs an update.',
+                    hsc((string) $data)
+                ), -1
+            );
+
+            // @deprecated 2018-04-14, backward compatibility
+            $args = func_get_args();
+            $data = array();
+            if(isset($args[1])) $data['target'] = $args[1];
+            if(isset($args[2])) $data['name'] = $args[2];
+            if(isset($args[3])) $data['hid'] = $args[3];
+        }
+        $data['secid'] = ++$this->lastsecid;
+        $data['start'] = $start;
+        $this->sectionedits[] = $data;
+        return 'sectionedit'.$data['secid'];
+    }
+
+    /**
+     * Finish an edit section range
+     *
+     * @param int  $end     The byte position for the edit end; null for the rest of the page
+     *
+     * @author Adrian Lang <lang@cosmocode.de>
+     */
+    public function finishSectionEdit($end = null, $hid = null) {
+        $data = array_pop($this->sectionedits);
+        if(!is_null($end) && $end <= $data['start']) {
+            return;
+        }
+        if(!is_null($hid)) {
+            $data['hid'] .= $hid;
+        }
+        $data['range'] = $data['start'].'-'.(is_null($end) ? '' : $end);
+        unset($data['start']);
+        $this->doc .= '<!-- EDIT'.hsc(json_encode ($data)).' -->';
+    }
+
+    /**
+     * Returns the format produced by this renderer.
+     *
+     * @return string always 'xhtml'
+     */
+    function getFormat() {
+        return 'xhtml';
+    }
+
+    /**
+     * Initialize the document
+     */
+    function document_start() {
+        //reset some internals
+        $this->toc     = array();
+        $this->headers = array();
+    }
+
+    /**
+     * Finalize the document
+     */
+    function document_end() {
+        // Finish open section edits.
+        while(count($this->sectionedits) > 0) {
+            if($this->sectionedits[count($this->sectionedits) - 1]['start'] <= 1) {
+                // If there is only one section, do not write a section edit
+                // marker.
+                array_pop($this->sectionedits);
+            } else {
+                $this->finishSectionEdit();
+            }
+        }
+
+        if(count($this->footnotes) > 0) {
+            $this->doc .= '<div class="footnotes">'.DOKU_LF;
+
+            foreach($this->footnotes as $id => $footnote) {
+                // check its not a placeholder that indicates actual footnote text is elsewhere
+                if(substr($footnote, 0, 5) != "@@FNT") {
+
+                    // open the footnote and set the anchor and backlink
+                    $this->doc .= '<div class="fn">';
+                    $this->doc .= '<sup><a href="#fnt__'.$id.'" id="fn__'.$id.'" class="fn_bot">';
+                    $this->doc .= $id.')</a></sup> '.DOKU_LF;
+
+                    // get any other footnotes that use the same markup
+                    $alt = array_keys($this->footnotes, "@@FNT$id");
+
+                    if(count($alt)) {
+                        foreach($alt as $ref) {
+                            // set anchor and backlink for the other footnotes
+                            $this->doc .= ', <sup><a href="#fnt__'.($ref).'" id="fn__'.($ref).'" class="fn_bot">';
+                            $this->doc .= ($ref).')</a></sup> '.DOKU_LF;
+                        }
+                    }
+
+                    // add footnote markup and close this footnote
+                    $this->doc .= '<div class="content">'.$footnote.'</div>';
+                    $this->doc .= '</div>'.DOKU_LF;
+                }
+            }
+            $this->doc .= '</div>'.DOKU_LF;
+        }
+
+        // Prepare the TOC
+        global $conf;
+        if($this->info['toc'] && is_array($this->toc) && $conf['tocminheads'] && count($this->toc) >= $conf['tocminheads']) {
+            global $TOC;
+            $TOC = $this->toc;
+        }
+
+        // make sure there are no empty paragraphs
+        $this->doc = preg_replace('#<p>\s*</p>#', '', $this->doc);
+    }
+
+    /**
+     * Add an item to the TOC
+     *
+     * @param string $id       the hash link
+     * @param string $text     the text to display
+     * @param int    $level    the nesting level
+     */
+    function toc_additem($id, $text, $level) {
+        global $conf;
+
+        //handle TOC
+        if($level >= $conf['toptoclevel'] && $level <= $conf['maxtoclevel']) {
+            $this->toc[] = html_mktocitem($id, $text, $level - $conf['toptoclevel'] + 1);
+        }
+    }
+
+    /**
+     * Render a heading
+     *
+     * @param string $text  the text to display
+     * @param int    $level header level
+     * @param int    $pos   byte position in the original source
+     */
+    function header($text, $level, $pos) {
+        global $conf;
+
+        if(blank($text)) return; //skip empty headlines
+
+        $hid = $this->_headerToLink($text, true);
+
+        //only add items within configured levels
+        $this->toc_additem($hid, $text, $level);
+
+        // adjust $node to reflect hierarchy of levels
+        $this->node[$level - 1]++;
+        if($level < $this->lastlevel) {
+            for($i = 0; $i < $this->lastlevel - $level; $i++) {
+                $this->node[$this->lastlevel - $i - 1] = 0;
+            }
+        }
+        $this->lastlevel = $level;
+
+        if($level <= $conf['maxseclevel'] &&
+            count($this->sectionedits) > 0 &&
+            $this->sectionedits[count($this->sectionedits) - 1]['target'] === 'section'
+        ) {
+            $this->finishSectionEdit($pos - 1);
+        }
+
+        // write the header
+        $this->doc .= DOKU_LF.'<h'.$level;
+        if($level <= $conf['maxseclevel']) {
+            $data = array();
+            $data['target'] = 'section';
+            $data['name'] = $text;
+            $data['hid'] = $hid;
+            $data['codeblockOffset'] = $this->_codeblock;
+            $this->doc .= ' class="'.$this->startSectionEdit($pos, $data).'"';
+        }
+        $this->doc .= ' id="'.$hid.'">';
+        $this->doc .= $this->_xmlEntities($text);
+        $this->doc .= "</h$level>".DOKU_LF;
+    }
+
+    /**
+     * Open a new section
+     *
+     * @param int $level section level (as determined by the previous header)
+     */
+    function section_open($level) {
+        $this->doc .= '<div class="level'.$level.'">'.DOKU_LF;
+    }
+
+    /**
+     * Close the current section
+     */
+    function section_close() {
+        $this->doc .= DOKU_LF.'</div>'.DOKU_LF;
+    }
+
+    /**
+     * Render plain text data
+     *
+     * @param $text
+     */
+    function cdata($text) {
+        $this->doc .= $this->_xmlEntities($text);
+    }
+
+    /**
+     * Open a paragraph
+     */
+    function p_open() {
+        $this->doc .= DOKU_LF.'<p>'.DOKU_LF;
+    }
+
+    /**
+     * Close a paragraph
+     */
+    function p_close() {
+        $this->doc .= DOKU_LF.'</p>'.DOKU_LF;
+    }
+
+    /**
+     * Create a line break
+     */
+    function linebreak() {
+        $this->doc .= '<br/>'.DOKU_LF;
+    }
+
+    /**
+     * Create a horizontal line
+     */
+    function hr() {
+        $this->doc .= '<hr />'.DOKU_LF;
+    }
+
+    /**
+     * Start strong (bold) formatting
+     */
+    function strong_open() {
+        $this->doc .= '<strong>';
+    }
+
+    /**
+     * Stop strong (bold) formatting
+     */
+    function strong_close() {
+        $this->doc .= '</strong>';
+    }
+
+    /**
+     * Start emphasis (italics) formatting
+     */
+    function emphasis_open() {
+        $this->doc .= '<em>';
+    }
+
+    /**
+     * Stop emphasis (italics) formatting
+     */
+    function emphasis_close() {
+        $this->doc .= '</em>';
+    }
+
+    /**
+     * Start underline formatting
+     */
+    function underline_open() {
+        $this->doc .= '<em class="u">';
+    }
+
+    /**
+     * Stop underline formatting
+     */
+    function underline_close() {
+        $this->doc .= '</em>';
+    }
+
+    /**
+     * Start monospace formatting
+     */
+    function monospace_open() {
+        $this->doc .= '<code>';
+    }
+
+    /**
+     * Stop monospace formatting
+     */
+    function monospace_close() {
+        $this->doc .= '</code>';
+    }
+
+    /**
+     * Start a subscript
+     */
+    function subscript_open() {
+        $this->doc .= '<sub>';
+    }
+
+    /**
+     * Stop a subscript
+     */
+    function subscript_close() {
+        $this->doc .= '</sub>';
+    }
+
+    /**
+     * Start a superscript
+     */
+    function superscript_open() {
+        $this->doc .= '<sup>';
+    }
+
+    /**
+     * Stop a superscript
+     */
+    function superscript_close() {
+        $this->doc .= '</sup>';
+    }
+
+    /**
+     * Start deleted (strike-through) formatting
+     */
+    function deleted_open() {
+        $this->doc .= '<del>';
+    }
+
+    /**
+     * Stop deleted (strike-through) formatting
+     */
+    function deleted_close() {
+        $this->doc .= '</del>';
+    }
+
+    /**
+     * Callback for footnote start syntax
+     *
+     * All following content will go to the footnote instead of
+     * the document. To achieve this the previous rendered content
+     * is moved to $store and $doc is cleared
+     *
+     * @author Andreas Gohr <andi@splitbrain.org>
+     */
+    function footnote_open() {
+
+        // move current content to store and record footnote
+        $this->store = $this->doc;
+        $this->doc   = '';
+    }
+
+    /**
+     * Callback for footnote end syntax
+     *
+     * All rendered content is moved to the $footnotes array and the old
+     * content is restored from $store again
+     *
+     * @author Andreas Gohr
+     */
+    function footnote_close() {
+        /** @var $fnid int takes track of seen footnotes, assures they are unique even across multiple docs FS#2841 */
+        static $fnid = 0;
+        // assign new footnote id (we start at 1)
+        $fnid++;
+
+        // recover footnote into the stack and restore old content
+        $footnote    = $this->doc;
+        $this->doc   = $this->store;
+        $this->store = '';
+
+        // check to see if this footnote has been seen before
+        $i = array_search($footnote, $this->footnotes);
+
+        if($i === false) {
+            // its a new footnote, add it to the $footnotes array
+            $this->footnotes[$fnid] = $footnote;
+        } else {
+            // seen this one before, save a placeholder
+            $this->footnotes[$fnid] = "@@FNT".($i);
+        }
+
+        // output the footnote reference and link
+        $this->doc .= '<sup><a href="#fn__'.$fnid.'" id="fnt__'.$fnid.'" class="fn_top">'.$fnid.')</a></sup>';
+    }
+
+    /**
+     * Open an unordered list
+     *
+     * @param string|string[] $classes css classes - have to be valid, do not pass unfiltered user input
+     */
+    function listu_open($classes = null) {
+        $class = '';
+        if($classes !== null) {
+            if(is_array($classes)) $classes = join(' ', $classes);
+            $class = " class=\"$classes\"";
+        }
+        $this->doc .= "<ul$class>".DOKU_LF;
+    }
+
+    /**
+     * Close an unordered list
+     */
+    function listu_close() {
+        $this->doc .= '</ul>'.DOKU_LF;
+    }
+
+    /**
+     * Open an ordered list
+     *
+     * @param string|string[] $classes css classes - have to be valid, do not pass unfiltered user input
+     */
+    function listo_open($classes = null) {
+        $class = '';
+        if($classes !== null) {
+            if(is_array($classes)) $classes = join(' ', $classes);
+            $class = " class=\"$classes\"";
+        }
+        $this->doc .= "<ol$class>".DOKU_LF;
+    }
+
+    /**
+     * Close an ordered list
+     */
+    function listo_close() {
+        $this->doc .= '</ol>'.DOKU_LF;
+    }
+
+    /**
+     * Open a list item
+     *
+     * @param int $level the nesting level
+     * @param bool $node true when a node; false when a leaf
+     */
+    function listitem_open($level, $node=false) {
+        $branching = $node ? ' node' : '';
+        $this->doc .= '<li class="level'.$level.$branching.'">';
+    }
+
+    /**
+     * Close a list item
+     */
+    function listitem_close() {
+        $this->doc .= '</li>'.DOKU_LF;
+    }
+
+    /**
+     * Start the content of a list item
+     */
+    function listcontent_open() {
+        $this->doc .= '<div class="li">';
+    }
+
+    /**
+     * Stop the content of a list item
+     */
+    function listcontent_close() {
+        $this->doc .= '</div>'.DOKU_LF;
+    }
+
+    /**
+     * Output unformatted $text
+     *
+     * Defaults to $this->cdata()
+     *
+     * @param string $text
+     */
+    function unformatted($text) {
+        $this->doc .= $this->_xmlEntities($text);
+    }
+
+    /**
+     * Execute PHP code if allowed
+     *
+     * @param  string $text      PHP code that is either executed or printed
+     * @param  string $wrapper   html element to wrap result if $conf['phpok'] is okff
+     *
+     * @author Andreas Gohr <andi@splitbrain.org>
+     */
+    function php($text, $wrapper = 'code') {
+        global $conf;
+
+        if($conf['phpok']) {
+            ob_start();
+            eval($text);
+            $this->doc .= ob_get_contents();
+            ob_end_clean();
+        } else {
+            $this->doc .= p_xhtml_cached_geshi($text, 'php', $wrapper);
+        }
+    }
+
+    /**
+     * Output block level PHP code
+     *
+     * If $conf['phpok'] is true this should evaluate the given code and append the result
+     * to $doc
+     *
+     * @param string $text The PHP code
+     */
+    function phpblock($text) {
+        $this->php($text, 'pre');
+    }
+
+    /**
+     * Insert HTML if allowed
+     *
+     * @param  string $text      html text
+     * @param  string $wrapper   html element to wrap result if $conf['htmlok'] is okff
+     *
+     * @author Andreas Gohr <andi@splitbrain.org>
+     */
+    function html($text, $wrapper = 'code') {
+        global $conf;
+
+        if($conf['htmlok']) {
+            $this->doc .= $text;
+        } else {
+            $this->doc .= p_xhtml_cached_geshi($text, 'html4strict', $wrapper);
+        }
+    }
+
+    /**
+     * Output raw block-level HTML
+     *
+     * If $conf['htmlok'] is true this should add the code as is to $doc
+     *
+     * @param string $text The HTML
+     */
+    function htmlblock($text) {
+        $this->html($text, 'pre');
+    }
+
+    /**
+     * Start a block quote
+     */
+    function quote_open() {
+        $this->doc .= '<blockquote><div class="no">'.DOKU_LF;
+    }
+
+    /**
+     * Stop a block quote
+     */
+    function quote_close() {
+        $this->doc .= '</div></blockquote>'.DOKU_LF;
+    }
+
+    /**
+     * Output preformatted text
+     *
+     * @param string $text
+     */
+    function preformatted($text) {
+        $this->doc .= '<pre class="code">'.trim($this->_xmlEntities($text), "\n\r").'</pre>'.DOKU_LF;
+    }
+
+    /**
+     * Display text as file content, optionally syntax highlighted
+     *
+     * @param string $text     text to show
+     * @param string $language programming language to use for syntax highlighting
+     * @param string $filename file path label
+     * @param array  $options  assoziative array with additional geshi options
+     */
+    function file($text, $language = null, $filename = null, $options=null) {
+        $this->_highlight('file', $text, $language, $filename, $options);
+    }
+
+    /**
+     * Display text as code content, optionally syntax highlighted
+     *
+     * @param string $text     text to show
+     * @param string $language programming language to use for syntax highlighting
+     * @param string $filename file path label
+     * @param array  $options  assoziative array with additional geshi options
+     */
+    function code($text, $language = null, $filename = null, $options=null) {
+        $this->_highlight('code', $text, $language, $filename, $options);
+    }
+
+    /**
+     * Use GeSHi to highlight language syntax in code and file blocks
+     *
+     * @author Andreas Gohr <andi@splitbrain.org>
+     * @param string $type     code|file
+     * @param string $text     text to show
+     * @param string $language programming language to use for syntax highlighting
+     * @param string $filename file path label
+     * @param array  $options  assoziative array with additional geshi options
+     */
+    function _highlight($type, $text, $language = null, $filename = null, $options = null) {
+        global $ID;
+        global $lang;
+        global $INPUT;
+
+        $language = preg_replace(PREG_PATTERN_VALID_LANGUAGE, '', $language);
+
+        $language = preg_replace(PREG_PATTERN_VALID_LANGUAGE, '', $language);
+
+        if($filename) {
+            // add icon
+            list($ext) = mimetype($filename, false);
+            $class = preg_replace('/[^_\-a-z0-9]+/i', '_', $ext);
+            $class = 'mediafile mf_'.$class;
+
+            $offset = 0;
+            if ($INPUT->has('codeblockOffset')) {
+                $offset = $INPUT->str('codeblockOffset');
+            }
+            $this->doc .= '<dl class="'.$type.'">'.DOKU_LF;
+            $this->doc .= '<dt><a href="'.exportlink($ID, 'code', array('codeblock' => $offset+$this->_codeblock)).'" title="'.$lang['download'].'" class="'.$class.'">';
+            $this->doc .= hsc($filename);
+            $this->doc .= '</a></dt>'.DOKU_LF.'<dd>';
+        }
+
+        if($text{0} == "\n") {
+            $text = substr($text, 1);
+        }
+        if(substr($text, -1) == "\n") {
+            $text = substr($text, 0, -1);
+        }
+
+        if(empty($language)) { // empty is faster than is_null and can prevent '' string
+            $this->doc .= '<pre class="'.$type.'">'.$this->_xmlEntities($text).'</pre>'.DOKU_LF;
+        } else {
+            $class = 'code'; //we always need the code class to make the syntax highlighting apply
+            if($type != 'code') $class .= ' '.$type;
+
+            $this->doc .= "<pre class=\"$class $language\">".p_xhtml_cached_geshi($text, $language, '', $options).'</pre>'.DOKU_LF;
+        }
+
+        if($filename) {
+            $this->doc .= '</dd></dl>'.DOKU_LF;
+        }
+
+        $this->_codeblock++;
+    }
+
+    /**
+     * Format an acronym
+     *
+     * Uses $this->acronyms
+     *
+     * @param string $acronym
+     */
+    function acronym($acronym) {
+
+        if(array_key_exists($acronym, $this->acronyms)) {
+
+            $title = $this->_xmlEntities($this->acronyms[$acronym]);
+
+            $this->doc .= '<abbr title="'.$title
+                .'">'.$this->_xmlEntities($acronym).'</abbr>';
+
+        } else {
+            $this->doc .= $this->_xmlEntities($acronym);
+        }
+    }
+
+    /**
+     * Format a smiley
+     *
+     * Uses $this->smiley
+     *
+     * @param string $smiley
+     */
+    function smiley($smiley) {
+        if(array_key_exists($smiley, $this->smileys)) {
+            $this->doc .= '<img src="'.DOKU_BASE.'lib/images/smileys/'.$this->smileys[$smiley].
+                '" class="icon" alt="'.
+                $this->_xmlEntities($smiley).'" />';
+        } else {
+            $this->doc .= $this->_xmlEntities($smiley);
+        }
+    }
+
+    /**
+     * Format an entity
+     *
+     * Entities are basically small text replacements
+     *
+     * Uses $this->entities
+     *
+     * @param string $entity
+     */
+    function entity($entity) {
+        if(array_key_exists($entity, $this->entities)) {
+            $this->doc .= $this->entities[$entity];
+        } else {
+            $this->doc .= $this->_xmlEntities($entity);
+        }
+    }
+
+    /**
+     * Typographically format a multiply sign
+     *
+     * Example: ($x=640, $y=480) should result in "640×480"
+     *
+     * @param string|int $x first value
+     * @param string|int $y second value
+     */
+    function multiplyentity($x, $y) {
+        $this->doc .= "$x&times;$y";
+    }
+
+    /**
+     * Render an opening single quote char (language specific)
+     */
+    function singlequoteopening() {
+        global $lang;
+        $this->doc .= $lang['singlequoteopening'];
+    }
+
+    /**
+     * Render a closing single quote char (language specific)
+     */
+    function singlequoteclosing() {
+        global $lang;
+        $this->doc .= $lang['singlequoteclosing'];
+    }
+
+    /**
+     * Render an apostrophe char (language specific)
+     */
+    function apostrophe() {
+        global $lang;
+        $this->doc .= $lang['apostrophe'];
+    }
+
+    /**
+     * Render an opening double quote char (language specific)
+     */
+    function doublequoteopening() {
+        global $lang;
+        $this->doc .= $lang['doublequoteopening'];
+    }
+
+    /**
+     * Render an closinging double quote char (language specific)
+     */
+    function doublequoteclosing() {
+        global $lang;
+        $this->doc .= $lang['doublequoteclosing'];
+    }
+
+    /**
+     * Render a CamelCase link
+     *
+     * @param string $link       The link name
+     * @param bool   $returnonly whether to return html or write to doc attribute
+     * @return void|string writes to doc attribute or returns html depends on $returnonly
+     *
+     * @see http://en.wikipedia.org/wiki/CamelCase
+     */
+    function camelcaselink($link, $returnonly = false) {
+        if($returnonly) {
+          return $this->internallink($link, $link, null, true);
+        } else {
+          $this->internallink($link, $link);
+        }
+    }
+
+    /**
+     * Render a page local link
+     *
+     * @param string $hash       hash link identifier
+     * @param string $name       name for the link
+     * @param bool   $returnonly whether to return html or write to doc attribute
+     * @return void|string writes to doc attribute or returns html depends on $returnonly
+     */
+    function locallink($hash, $name = null, $returnonly = false) {
+        global $ID;
+        $name  = $this->_getLinkTitle($name, $hash, $isImage);
+        $hash  = $this->_headerToLink($hash);
+        $title = $ID.' ↵';
+
+        $doc = '<a href="#'.$hash.'" title="'.$title.'" class="wikilink1">';
+        $doc .= $name;
+        $doc .= '</a>';
+
+        if($returnonly) {
+          return $doc;
+        } else {
+          $this->doc .= $doc;
+        }
+    }
+
+    /**
+     * Render an internal Wiki Link
+     *
+     * $search,$returnonly & $linktype are not for the renderer but are used
+     * elsewhere - no need to implement them in other renderers
+     *
+     * @author Andreas Gohr <andi@splitbrain.org>
+     * @param string      $id         pageid
+     * @param string|null $name       link name
+     * @param string|null $search     adds search url param
+     * @param bool        $returnonly whether to return html or write to doc attribute
+     * @param string      $linktype   type to set use of headings
+     * @return void|string writes to doc attribute or returns html depends on $returnonly
+     */
+    function internallink($id, $name = null, $search = null, $returnonly = false, $linktype = 'content') {
+        global $conf;
+        global $ID;
+        global $INFO;
+
+        $params = '';
+        $parts  = explode('?', $id, 2);
+        if(count($parts) === 2) {
+            $id     = $parts[0];
+            $params = $parts[1];
+        }
+
+        // For empty $id we need to know the current $ID
+        // We need this check because _simpleTitle needs
+        // correct $id and resolve_pageid() use cleanID($id)
+        // (some things could be lost)
+        if($id === '') {
+            $id = $ID;
+        }
+
+        // default name is based on $id as given
+        $default = $this->_simpleTitle($id);
+
+        // now first resolve and clean up the $id
+        resolve_pageid(getNS($ID), $id, $exists, $this->date_at, true);
+
+        $link = array();
+        $name = $this->_getLinkTitle($name, $default, $isImage, $id, $linktype);
+        if(!$isImage) {
+            if($exists) {
+                $class = 'wikilink1';
+            } else {
+                $class       = 'wikilink2';
+                $link['rel'] = 'nofollow';
+            }
+        } else {
+            $class = 'media';
+        }
+
+        //keep hash anchor
+        @list($id, $hash) = explode('#', $id, 2);
+        if(!empty($hash)) $hash = $this->_headerToLink($hash);
+
+        //prepare for formating
+        $link['target'] = $conf['target']['wiki'];
+        $link['style']  = '';
+        $link['pre']    = '';
+        $link['suf']    = '';
+        // highlight link to current page
+        if($id == $INFO['id']) {
+            $link['pre'] = '<span class="curid">';
+            $link['suf'] = '</span>';
+        }
+        $link['more']   = '';
+        $link['class']  = $class;
+        if($this->date_at) {
+            $params = $params.'&at='.rawurlencode($this->date_at);
+        }
+        $link['url']    = wl($id, $params);
+        $link['name']   = $name;
+        $link['title']  = $id;
+        //add search string
+        if($search) {
+            ($conf['userewrite']) ? $link['url'] .= '?' : $link['url'] .= '&amp;';
+            if(is_array($search)) {
+                $search = array_map('rawurlencode', $search);
+                $link['url'] .= 's[]='.join('&amp;s[]=', $search);
+            } else {
+                $link['url'] .= 's='.rawurlencode($search);
+            }
+        }
+
+        //keep hash
+        if($hash) $link['url'] .= '#'.$hash;
+
+        //output formatted
+        if($returnonly) {
+            return $this->_formatLink($link);
+        } else {
+            $this->doc .= $this->_formatLink($link);
+        }
+    }
+
+    /**
+     * Render an external link
+     *
+     * @param string       $url        full URL with scheme
+     * @param string|array $name       name for the link, array for media file
+     * @param bool         $returnonly whether to return html or write to doc attribute
+     * @return void|string writes to doc attribute or returns html depends on $returnonly
+     */
+    function externallink($url, $name = null, $returnonly = false) {
+        global $conf;
+
+        $name = $this->_getLinkTitle($name, $url, $isImage);
+
+        // url might be an attack vector, only allow registered protocols
+        if(is_null($this->schemes)) $this->schemes = getSchemes();
+        list($scheme) = explode('://', $url);
+        $scheme = strtolower($scheme);
+        if(!in_array($scheme, $this->schemes)) $url = '';
+
+        // is there still an URL?
+        if(!$url) {
+            if($returnonly) {
+                return $name;
+            } else {
+                $this->doc .= $name;
+            }
+            return;
+        }
+
+        // set class
+        if(!$isImage) {
+            $class = 'urlextern';
+        } else {
+            $class = 'media';
+        }
+
+        //prepare for formating
+        $link = array();
+        $link['target'] = $conf['target']['extern'];
+        $link['style']  = '';
+        $link['pre']    = '';
+        $link['suf']    = '';
+        $link['more']   = '';
+        $link['class']  = $class;
+        $link['url']    = $url;
+        $link['rel']    = '';
+
+        $link['name']  = $name;
+        $link['title'] = $this->_xmlEntities($url);
+        if($conf['relnofollow']) $link['rel'] .= ' nofollow';
+        if($conf['target']['extern']) $link['rel'] .= ' noopener';
+
+        //output formatted
+        if($returnonly) {
+            return $this->_formatLink($link);
+        } else {
+            $this->doc .= $this->_formatLink($link);
+        }
+    }
+
+    /**
+     * Render an interwiki link
+     *
+     * You may want to use $this->_resolveInterWiki() here
+     *
+     * @param string       $match      original link - probably not much use
+     * @param string|array $name       name for the link, array for media file
+     * @param string       $wikiName   indentifier (shortcut) for the remote wiki
+     * @param string       $wikiUri    the fragment parsed from the original link
+     * @param bool         $returnonly whether to return html or write to doc attribute
+     * @return void|string writes to doc attribute or returns html depends on $returnonly
+     */
+    function interwikilink($match, $name = null, $wikiName, $wikiUri, $returnonly = false) {
+        global $conf;
+
+        $link           = array();
+        $link['target'] = $conf['target']['interwiki'];
+        $link['pre']    = '';
+        $link['suf']    = '';
+        $link['more']   = '';
+        $link['name']   = $this->_getLinkTitle($name, $wikiUri, $isImage);
+        $link['rel']    = '';
+
+        //get interwiki URL
+        $exists = null;
+        $url    = $this->_resolveInterWiki($wikiName, $wikiUri, $exists);
+
+        if(!$isImage) {
+            $class         = preg_replace('/[^_\-a-z0-9]+/i', '_', $wikiName);
+            $link['class'] = "interwiki iw_$class";
+        } else {
+            $link['class'] = 'media';
+        }
+
+        //do we stay at the same server? Use local target
+        if(strpos($url, DOKU_URL) === 0 OR strpos($url, DOKU_BASE) === 0) {
+            $link['target'] = $conf['target']['wiki'];
+        }
+        if($exists !== null && !$isImage) {
+            if($exists) {
+                $link['class'] .= ' wikilink1';
+            } else {
+                $link['class'] .= ' wikilink2';
+                $link['rel'] .= ' nofollow';
+            }
+        }
+        if($conf['target']['interwiki']) $link['rel'] .= ' noopener';
+
+        $link['url']   = $url;
+        $link['title'] = htmlspecialchars($link['url']);
+
+        //output formatted
+        if($returnonly) {
+            return $this->_formatLink($link);
+        } else {
+            $this->doc .= $this->_formatLink($link);
+        }
+    }
+
+    /**
+     * Link to windows share
+     *
+     * @param string       $url        the link
+     * @param string|array $name       name for the link, array for media file
+     * @param bool         $returnonly whether to return html or write to doc attribute
+     * @return void|string writes to doc attribute or returns html depends on $returnonly
+     */
+    function windowssharelink($url, $name = null, $returnonly = false) {
+        global $conf;
+
+        //simple setup
+        $link = array();
+        $link['target'] = $conf['target']['windows'];
+        $link['pre']    = '';
+        $link['suf']    = '';
+        $link['style']  = '';
+
+        $link['name'] = $this->_getLinkTitle($name, $url, $isImage);
+        if(!$isImage) {
+            $link['class'] = 'windows';
+        } else {
+            $link['class'] = 'media';
+        }
+
+        $link['title'] = $this->_xmlEntities($url);
+        $url           = str_replace('\\', '/', $url);
+        $url           = 'file:///'.$url;
+        $link['url']   = $url;
+
+        //output formatted
+        if($returnonly) {
+            return $this->_formatLink($link);
+        } else {
+            $this->doc .= $this->_formatLink($link);
+        }
+    }
+
+    /**
+     * Render a linked E-Mail Address
+     *
+     * Honors $conf['mailguard'] setting
+     *
+     * @param string       $address    Email-Address
+     * @param string|array $name       name for the link, array for media file
+     * @param bool         $returnonly whether to return html or write to doc attribute
+     * @return void|string writes to doc attribute or returns html depends on $returnonly
+     */
+    function emaillink($address, $name = null, $returnonly = false) {
+        global $conf;
+        //simple setup
+        $link           = array();
+        $link['target'] = '';
+        $link['pre']    = '';
+        $link['suf']    = '';
+        $link['style']  = '';
+        $link['more']   = '';
+
+        $name = $this->_getLinkTitle($name, '', $isImage);
+        if(!$isImage) {
+            $link['class'] = 'mail';
+        } else {
+            $link['class'] = 'media';
+        }
+
+        $address = $this->_xmlEntities($address);
+        $address = obfuscate($address);
+        $title   = $address;
+
+        if(empty($name)) {
+            $name = $address;
+        }
+
+        if($conf['mailguard'] == 'visible') $address = rawurlencode($address);
+
+        $link['url']   = 'mailto:'.$address;
+        $link['name']  = $name;
+        $link['title'] = $title;
+
+        //output formatted
+        if($returnonly) {
+            return $this->_formatLink($link);
+        } else {
+            $this->doc .= $this->_formatLink($link);
+        }
+    }
+
+    /**
+     * Render an internal media file
+     *
+     * @param string $src       media ID
+     * @param string $title     descriptive text
+     * @param string $align     left|center|right
+     * @param int    $width     width of media in pixel
+     * @param int    $height    height of media in pixel
+     * @param string $cache     cache|recache|nocache
+     * @param string $linking   linkonly|detail|nolink
+     * @param bool   $return    return HTML instead of adding to $doc
+     * @return void|string writes to doc attribute or returns html depends on $return
+     */
+    function internalmedia($src, $title = null, $align = null, $width = null,
+                           $height = null, $cache = null, $linking = null, $return = false) {
+        global $ID;
+        if (strpos($src, '#') !== false) {
+            list($src, $hash) = explode('#', $src, 2);
+        }
+        resolve_mediaid(getNS($ID), $src, $exists, $this->date_at, true);
+
+        $noLink = false;
+        $render = ($linking == 'linkonly') ? false : true;
+        $link   = $this->_getMediaLinkConf($src, $title, $align, $width, $height, $cache, $render);
+
+        list($ext, $mime) = mimetype($src, false);
+        if(substr($mime, 0, 5) == 'image' && $render) {
+            $link['url'] = ml($src, array('id' => $ID, 'cache' => $cache, 'rev'=>$this->_getLastMediaRevisionAt($src)), ($linking == 'direct'));
+        } elseif(($mime == 'application/x-shockwave-flash' || media_supportedav($mime)) && $render) {
+            // don't link movies
+            $noLink = true;
+        } else {
+            // add file icons
+            $class = preg_replace('/[^_\-a-z0-9]+/i', '_', $ext);
+            $link['class'] .= ' mediafile mf_'.$class;
+            $link['url'] = ml($src, array('id' => $ID, 'cache' => $cache , 'rev'=>$this->_getLastMediaRevisionAt($src)), true);
+            if($exists) $link['title'] .= ' ('.filesize_h(filesize(mediaFN($src))).')';
+        }
+
+        if (!empty($hash)) $link['url'] .= '#'.$hash;
+
+        //markup non existing files
+        if(!$exists) {
+            $link['class'] .= ' wikilink2';
+        }
+
+        //output formatted
+        if($return) {
+            if($linking == 'nolink' || $noLink) return $link['name'];
+            else return $this->_formatLink($link);
+        } else {
+            if($linking == 'nolink' || $noLink) $this->doc .= $link['name'];
+            else $this->doc .= $this->_formatLink($link);
+        }
+    }
+
+    /**
+     * Render an external media file
+     *
+     * @param string $src     full media URL
+     * @param string $title   descriptive text
+     * @param string $align   left|center|right
+     * @param int    $width   width of media in pixel
+     * @param int    $height  height of media in pixel
+     * @param string $cache   cache|recache|nocache
+     * @param string $linking linkonly|detail|nolink
+     * @param bool   $return  return HTML instead of adding to $doc
+     * @return void|string writes to doc attribute or returns html depends on $return
+     */
+    function externalmedia($src, $title = null, $align = null, $width = null,
+                           $height = null, $cache = null, $linking = null, $return = false) {
+        if(link_isinterwiki($src)){
+            list($shortcut, $reference) = explode('>', $src, 2);
+            $exists = null;
+            $src = $this->_resolveInterWiki($shortcut, $reference, $exists);
+        }
+        list($src, $hash) = explode('#', $src, 2);
+        $noLink = false;
+        $render = ($linking == 'linkonly') ? false : true;
+        $link   = $this->_getMediaLinkConf($src, $title, $align, $width, $height, $cache, $render);
+
+        $link['url'] = ml($src, array('cache' => $cache));
+
+        list($ext, $mime) = mimetype($src, false);
+        if(substr($mime, 0, 5) == 'image' && $render) {
+            // link only jpeg images
+            // if ($ext != 'jpg' && $ext != 'jpeg') $noLink = true;
+        } elseif(($mime == 'application/x-shockwave-flash' || media_supportedav($mime)) && $render) {
+            // don't link movies
+            $noLink = true;
+        } else {
+            // add file icons
+            $class = preg_replace('/[^_\-a-z0-9]+/i', '_', $ext);
+            $link['class'] .= ' mediafile mf_'.$class;
+        }
+
+        if($hash) $link['url'] .= '#'.$hash;
+
+        //output formatted
+        if($return) {
+            if($linking == 'nolink' || $noLink) return $link['name'];
+            else return $this->_formatLink($link);
+        } else {
+            if($linking == 'nolink' || $noLink) $this->doc .= $link['name'];
+            else $this->doc .= $this->_formatLink($link);
+        }
+    }
+
+    /**
+     * Renders an RSS feed
+     *
+     * @param string $url    URL of the feed
+     * @param array  $params Finetuning of the output
+     *
+     * @author Andreas Gohr <andi@splitbrain.org>
+     */
+    function rss($url, $params) {
+        global $lang;
+        global $conf;
+
+        require_once(DOKU_INC.'inc/FeedParser.php');
+        $feed = new FeedParser();
+        $feed->set_feed_url($url);
+
+        //disable warning while fetching
+        if(!defined('DOKU_E_LEVEL')) {
+            $elvl = error_reporting(E_ERROR);
+        }
+        $rc = $feed->init();
+        if(isset($elvl)) {
+            error_reporting($elvl);
+        }
+
+        if($params['nosort']) $feed->enable_order_by_date(false);
+
+        //decide on start and end
+        if($params['reverse']) {
+            $mod   = -1;
+            $start = $feed->get_item_quantity() - 1;
+            $end   = $start - ($params['max']);
+            $end   = ($end < -1) ? -1 : $end;
+        } else {
+            $mod   = 1;
+            $start = 0;
+            $end   = $feed->get_item_quantity();
+            $end   = ($end > $params['max']) ? $params['max'] : $end;
+        }
+
+        $this->doc .= '<ul class="rss">';
+        if($rc) {
+            for($x = $start; $x != $end; $x += $mod) {
+                $item = $feed->get_item($x);
+                $this->doc .= '<li><div class="li">';
+                // support feeds without links
+                $lnkurl = $item->get_permalink();
+                if($lnkurl) {
+                    // title is escaped by SimplePie, we unescape here because it
+                    // is escaped again in externallink() FS#1705
+                    $this->externallink(
+                        $item->get_permalink(),
+                        html_entity_decode($item->get_title(), ENT_QUOTES, 'UTF-8')
+                    );
+                } else {
+                    $this->doc .= ' '.$item->get_title();
+                }
+                if($params['author']) {
+                    $author = $item->get_author(0);
+                    if($author) {
+                        $name = $author->get_name();
+                        if(!$name) $name = $author->get_email();
+                        if($name) $this->doc .= ' '.$lang['by'].' '.hsc($name);
+                    }
+                }
+                if($params['date']) {
+                    $this->doc .= ' ('.$item->get_local_date($conf['dformat']).')';
+                }
+                if($params['details']) {
+                    $this->doc .= '<div class="detail">';
+                    if($conf['htmlok']) {
+                        $this->doc .= $item->get_description();
+                    } else {
+                        $this->doc .= strip_tags($item->get_description());
+                    }
+                    $this->doc .= '</div>';
+                }
+
+                $this->doc .= '</div></li>';
+            }
+        } else {
+            $this->doc .= '<li><div class="li">';
+            $this->doc .= '<em>'.$lang['rssfailed'].'</em>';
+            $this->externallink($url);
+            if($conf['allowdebug']) {
+                $this->doc .= '<!--'.hsc($feed->error).'-->';
+            }
+            $this->doc .= '</div></li>';
+        }
+        $this->doc .= '</ul>';
+    }
+
+    /**
+     * Start a table
+     *
+     * @param int $maxcols maximum number of columns
+     * @param int $numrows NOT IMPLEMENTED
+     * @param int $pos byte position in the original source
+     * @param string|string[] $classes css classes - have to be valid, do not pass unfiltered user input
+     */
+    function table_open($maxcols = null, $numrows = null, $pos = null, $classes = null) {
+        // initialize the row counter used for classes
+        $this->_counter['row_counter'] = 0;
+        $class                         = 'table';
+        if($classes !== null) {
+            if(is_array($classes)) $classes = join(' ', $classes);
+            $class .= ' ' . $classes;
+        }
+        if($pos !== null) {
+            $hid = $this->_headerToLink($class, true);
+            $data = array();
+            $data['target'] = 'table';
+            $data['name'] = '';
+            $data['hid'] = $hid;
+            $class .= ' '.$this->startSectionEdit($pos, $data);
+        }
+        $this->doc .= '<div class="'.$class.'"><table class="inline">'.
+            DOKU_LF;
+    }
+
+    /**
+     * Close a table
+     *
+     * @param int $pos byte position in the original source
+     */
+    function table_close($pos = null) {
+        $this->doc .= '</table></div>'.DOKU_LF;
+        if($pos !== null) {
+            $this->finishSectionEdit($pos);
+        }
+    }
+
+    /**
+     * Open a table header
+     */
+    function tablethead_open() {
+        $this->doc .= DOKU_TAB.'<thead>'.DOKU_LF;
+    }
+
+    /**
+     * Close a table header
+     */
+    function tablethead_close() {
+        $this->doc .= DOKU_TAB.'</thead>'.DOKU_LF;
+    }
+
+    /**
+     * Open a table body
+     */
+    function tabletbody_open() {
+        $this->doc .= DOKU_TAB.'<tbody>'.DOKU_LF;
+    }
+
+    /**
+     * Close a table body
+     */
+    function tabletbody_close() {
+        $this->doc .= DOKU_TAB.'</tbody>'.DOKU_LF;
+    }
+
+    /**
+     * Open a table footer
+     */
+    function tabletfoot_open() {
+        $this->doc .= DOKU_TAB.'<tfoot>'.DOKU_LF;
+    }
+
+    /**
+     * Close a table footer
+     */
+    function tabletfoot_close() {
+        $this->doc .= DOKU_TAB.'</tfoot>'.DOKU_LF;
+    }
+
+    /**
+     * Open a table row
+     *
+     * @param string|string[] $classes css classes - have to be valid, do not pass unfiltered user input
+     */
+    function tablerow_open($classes = null) {
+        // initialize the cell counter used for classes
+        $this->_counter['cell_counter'] = 0;
+        $class                          = 'row'.$this->_counter['row_counter']++;
+        if($classes !== null) {
+            if(is_array($classes)) $classes = join(' ', $classes);
+            $class .= ' ' . $classes;
+        }
+        $this->doc .= DOKU_TAB.'<tr class="'.$class.'">'.DOKU_LF.DOKU_TAB.DOKU_TAB;
+    }
+
+    /**
+     * Close a table row
+     */
+    function tablerow_close() {
+        $this->doc .= DOKU_LF.DOKU_TAB.'</tr>'.DOKU_LF;
+    }
+
+    /**
+     * Open a table header cell
+     *
+     * @param int    $colspan
+     * @param string $align left|center|right
+     * @param int    $rowspan
+     * @param string|string[] $classes css classes - have to be valid, do not pass unfiltered user input
+     */
+    function tableheader_open($colspan = 1, $align = null, $rowspan = 1, $classes = null) {
+        $class = 'class="col'.$this->_counter['cell_counter']++;
+        if(!is_null($align)) {
+            $class .= ' '.$align.'align';
+        }
+        if($classes !== null) {
+            if(is_array($classes)) $classes = join(' ', $classes);
+            $class .= ' ' . $classes;
+        }
+        $class .= '"';
+        $this->doc .= '<th '.$class;
+        if($colspan > 1) {
+            $this->_counter['cell_counter'] += $colspan - 1;
+            $this->doc .= ' colspan="'.$colspan.'"';
+        }
+        if($rowspan > 1) {
+            $this->doc .= ' rowspan="'.$rowspan.'"';
+        }
+        $this->doc .= '>';
+    }
+
+    /**
+     * Close a table header cell
+     */
+    function tableheader_close() {
+        $this->doc .= '</th>';
+    }
+
+    /**
+     * Open a table cell
+     *
+     * @param int       $colspan
+     * @param string    $align left|center|right
+     * @param int       $rowspan
+     * @param string|string[]    $classes css classes - have to be valid, do not pass unfiltered user input
+     */
+    function tablecell_open($colspan = 1, $align = null, $rowspan = 1, $classes = null) {
+        $class = 'class="col'.$this->_counter['cell_counter']++;
+        if(!is_null($align)) {
+            $class .= ' '.$align.'align';
+        }
+        if($classes !== null) {
+            if(is_array($classes)) $classes = join(' ', $classes);
+            $class .= ' ' . $classes;
+        }
+        $class .= '"';
+        $this->doc .= '<td '.$class;
+        if($colspan > 1) {
+            $this->_counter['cell_counter'] += $colspan - 1;
+            $this->doc .= ' colspan="'.$colspan.'"';
+        }
+        if($rowspan > 1) {
+            $this->doc .= ' rowspan="'.$rowspan.'"';
+        }
+        $this->doc .= '>';
+    }
+
+    /**
+     * Close a table cell
+     */
+    function tablecell_close() {
+        $this->doc .= '</td>';
+    }
+
+    /**
+     * Returns the current header level.
+     * (required e.g. by the filelist plugin)
+     *
+     * @return int The current header level
+     */
+    function getLastlevel() {
+        return $this->lastlevel;
+    }
+
+    #region Utility functions
+
+    /**
+     * Build a link
+     *
+     * Assembles all parts defined in $link returns HTML for the link
+     *
+     * @param array $link attributes of a link
+     * @return string
+     *
+     * @author Andreas Gohr <andi@splitbrain.org>
+     */
+    function _formatLink($link) {
+        //make sure the url is XHTML compliant (skip mailto)
+        if(substr($link['url'], 0, 7) != 'mailto:') {
+            $link['url'] = str_replace('&', '&amp;', $link['url']);
+            $link['url'] = str_replace('&amp;amp;', '&amp;', $link['url']);
+        }
+        //remove double encodings in titles
+        $link['title'] = str_replace('&amp;amp;', '&amp;', $link['title']);
+
+        // be sure there are no bad chars in url or title
+        // (we can't do this for name because it can contain an img tag)
+        $link['url']   = strtr($link['url'], array('>' => '%3E', '<' => '%3C', '"' => '%22'));
+        $link['title'] = strtr($link['title'], array('>' => '&gt;', '<' => '&lt;', '"' => '&quot;'));
+
+        $ret = '';
+        $ret .= $link['pre'];
+        $ret .= '<a href="'.$link['url'].'"';
+        if(!empty($link['class'])) $ret .= ' class="'.$link['class'].'"';
+        if(!empty($link['target'])) $ret .= ' target="'.$link['target'].'"';
+        if(!empty($link['title'])) $ret .= ' title="'.$link['title'].'"';
+        if(!empty($link['style'])) $ret .= ' style="'.$link['style'].'"';
+        if(!empty($link['rel'])) $ret .= ' rel="'.trim($link['rel']).'"';
+        if(!empty($link['more'])) $ret .= ' '.$link['more'];
+        $ret .= '>';
+        $ret .= $link['name'];
+        $ret .= '</a>';
+        $ret .= $link['suf'];
+        return $ret;
+    }
+
+    /**
+     * Renders internal and external media
+     *
+     * @author Andreas Gohr <andi@splitbrain.org>
+     * @param string $src       media ID
+     * @param string $title     descriptive text
+     * @param string $align     left|center|right
+     * @param int    $width     width of media in pixel
+     * @param int    $height    height of media in pixel
+     * @param string $cache     cache|recache|nocache
+     * @param bool   $render    should the media be embedded inline or just linked
+     * @return string
+     */
+    function _media($src, $title = null, $align = null, $width = null,
+                    $height = null, $cache = null, $render = true) {
+
+        $ret = '';
+
+        list($ext, $mime) = mimetype($src);
+        if(substr($mime, 0, 5) == 'image') {
+            // first get the $title
+            if(!is_null($title)) {
+                $title = $this->_xmlEntities($title);
+            } elseif($ext == 'jpg' || $ext == 'jpeg') {
+                //try to use the caption from IPTC/EXIF
+                require_once(DOKU_INC.'inc/JpegMeta.php');
+                $jpeg = new JpegMeta(mediaFN($src));
+                if($jpeg !== false) $cap = $jpeg->getTitle();
+                if(!empty($cap)) {
+                    $title = $this->_xmlEntities($cap);
+                }
+            }
+            if(!$render) {
+                // if the picture is not supposed to be rendered
+                // return the title of the picture
+                if(!$title) {
+                    // just show the sourcename
+                    $title = $this->_xmlEntities(utf8_basename(noNS($src)));
+                }
+                return $title;
+            }
+            //add image tag
+            $ret .= '<img src="'.ml($src, array('w' => $width, 'h' => $height, 'cache' => $cache, 'rev'=>$this->_getLastMediaRevisionAt($src))).'"';
+            $ret .= ' class="media'.$align.'"';
+
+            if($title) {
+                $ret .= ' title="'.$title.'"';
+                $ret .= ' alt="'.$title.'"';
+            } else {
+                $ret .= ' alt=""';
+            }
+
+            if(!is_null($width))
+                $ret .= ' width="'.$this->_xmlEntities($width).'"';
+
+            if(!is_null($height))
+                $ret .= ' height="'.$this->_xmlEntities($height).'"';
+
+            $ret .= ' />';
+
+        } elseif(media_supportedav($mime, 'video') || media_supportedav($mime, 'audio')) {
+            // first get the $title
+            $title = !is_null($title) ? $this->_xmlEntities($title) : false;
+            if(!$render) {
+                // if the file is not supposed to be rendered
+                // return the title of the file (just the sourcename if there is no title)
+                return $title ? $title : $this->_xmlEntities(utf8_basename(noNS($src)));
+            }
+
+            $att          = array();
+            $att['class'] = "media$align";
+            if($title) {
+                $att['title'] = $title;
+            }
+
+            if(media_supportedav($mime, 'video')) {
+                //add video
+                $ret .= $this->_video($src, $width, $height, $att);
+            }
+            if(media_supportedav($mime, 'audio')) {
+                //add audio
+                $ret .= $this->_audio($src, $att);
+            }
+
+        } elseif($mime == 'application/x-shockwave-flash') {
+            if(!$render) {
+                // if the flash is not supposed to be rendered
+                // return the title of the flash
+                if(!$title) {
+                    // just show the sourcename
+                    $title = utf8_basename(noNS($src));
+                }
+                return $this->_xmlEntities($title);
+            }
+
+            $att          = array();
+            $att['class'] = "media$align";
+            if($align == 'right') $att['align'] = 'right';
+            if($align == 'left') $att['align'] = 'left';
+            $ret .= html_flashobject(
+                ml($src, array('cache' => $cache), true, '&'), $width, $height,
+                array('quality' => 'high'),
+                null,
+                $att,
+                $this->_xmlEntities($title)
+            );
+        } elseif($title) {
+            // well at least we have a title to display
+            $ret .= $this->_xmlEntities($title);
+        } else {
+            // just show the sourcename
+            $ret .= $this->_xmlEntities(utf8_basename(noNS($src)));
+        }
+
+        return $ret;
+    }
+
+    /**
+     * Escape string for output
+     *
+     * @param $string
+     * @return string
+     */
+    function _xmlEntities($string) {
+        return htmlspecialchars($string, ENT_QUOTES, 'UTF-8');
+    }
+
+    /**
+     * Creates a linkid from a headline
+     *
+     * @author Andreas Gohr <andi@splitbrain.org>
+     * @param string  $title   The headline title
+     * @param boolean $create  Create a new unique ID?
+     * @return string
+     */
+    function _headerToLink($title, $create = false) {
+        if($create) {
+            return sectionID($title, $this->headers);
+        } else {
+            $check = false;
+            return sectionID($title, $check);
+        }
+    }
+
+    /**
+     * Construct a title and handle images in titles
+     *
+     * @author Harry Fuecks <hfuecks@gmail.com>
+     * @param string|array $title    either string title or media array
+     * @param string       $default  default title if nothing else is found
+     * @param bool         $isImage  will be set to true if it's a media file
+     * @param null|string  $id       linked page id (used to extract title from first heading)
+     * @param string       $linktype content|navigation
+     * @return string      HTML of the title, might be full image tag or just escaped text
+     */
+    function _getLinkTitle($title, $default, &$isImage, $id = null, $linktype = 'content') {
+        $isImage = false;
+        if(is_array($title)) {
+            $isImage = true;
+            return $this->_imageTitle($title);
+        } elseif(is_null($title) || trim($title) == '') {
+            if(useHeading($linktype) && $id) {
+                $heading = p_get_first_heading($id);
+                if(!blank($heading)) {
+                    return $this->_xmlEntities($heading);
+                }
+            }
+            return $this->_xmlEntities($default);
+        } else {
+            return $this->_xmlEntities($title);
+        }
+    }
+
+    /**
+     * Returns HTML code for images used in link titles
+     *
+     * @author Andreas Gohr <andi@splitbrain.org>
+     * @param array $img
+     * @return string HTML img tag or similar
+     */
+    function _imageTitle($img) {
+        global $ID;
+
+        // some fixes on $img['src']
+        // see internalmedia() and externalmedia()
+        list($img['src']) = explode('#', $img['src'], 2);
+        if($img['type'] == 'internalmedia') {
+            resolve_mediaid(getNS($ID), $img['src'], $exists ,$this->date_at, true);
+        }
+
+        return $this->_media(
+            $img['src'],
+            $img['title'],
+            $img['align'],
+            $img['width'],
+            $img['height'],
+            $img['cache']
+        );
+    }
+
+    /**
+     * helperfunction to return a basic link to a media
+     *
+     * used in internalmedia() and externalmedia()
+     *
+     * @author   Pierre Spring <pierre.spring@liip.ch>
+     * @param string $src       media ID
+     * @param string $title     descriptive text
+     * @param string $align     left|center|right
+     * @param int    $width     width of media in pixel
+     * @param int    $height    height of media in pixel
+     * @param string $cache     cache|recache|nocache
+     * @param bool   $render    should the media be embedded inline or just linked
+     * @return array associative array with link config
+     */
+    function _getMediaLinkConf($src, $title, $align, $width, $height, $cache, $render) {
+        global $conf;
+
+        $link           = array();
+        $link['class']  = 'media';
+        $link['style']  = '';
+        $link['pre']    = '';
+        $link['suf']    = '';
+        $link['more']   = '';
+        $link['target'] = $conf['target']['media'];
+        if($conf['target']['media']) $link['rel'] = 'noopener';
+        $link['title']  = $this->_xmlEntities($src);
+        $link['name']   = $this->_media($src, $title, $align, $width, $height, $cache, $render);
+
+        return $link;
+    }
+
+    /**
+     * Embed video(s) in HTML
+     *
+     * @author Anika Henke <anika@selfthinker.org>
+     * @author Schplurtz le Déboulonné <Schplurtz@laposte.net>
+     *
+     * @param string $src         - ID of video to embed
+     * @param int    $width       - width of the video in pixels
+     * @param int    $height      - height of the video in pixels
+     * @param array  $atts        - additional attributes for the <video> tag
+     * @return string
+     */
+    function _video($src, $width, $height, $atts = null) {
+        // prepare width and height
+        if(is_null($atts)) $atts = array();
+        $atts['width']  = (int) $width;
+        $atts['height'] = (int) $height;
+        if(!$atts['width']) $atts['width'] = 320;
+        if(!$atts['height']) $atts['height'] = 240;
+
+        $posterUrl = '';
+        $files = array();
+        $tracks = array();
+        $isExternal = media_isexternal($src);
+
+        if ($isExternal) {
+            // take direct source for external files
+            list(/*ext*/, $srcMime) = mimetype($src);
+            $files[$srcMime] = $src;
+        } else {
+            // prepare alternative formats
+            $extensions   = array('webm', 'ogv', 'mp4');
+            $files        = media_alternativefiles($src, $extensions);
+            $poster       = media_alternativefiles($src, array('jpg', 'png'));
+            $tracks       = media_trackfiles($src);
+            if(!empty($poster)) {
+                $posterUrl = ml(reset($poster), '', true, '&');
+            }
+        }
+
+        $out = '';
+        // open video tag
+        $out .= '<video '.buildAttributes($atts).' controls="controls"';
+        if($posterUrl) $out .= ' poster="'.hsc($posterUrl).'"';
+        $out .= '>'.NL;
+        $fallback = '';
+
+        // output source for each alternative video format
+        foreach($files as $mime => $file) {
+            if ($isExternal) {
+                $url = $file;
+                $linkType = 'externalmedia';
+            } else {
+                $url = ml($file, '', true, '&');
+                $linkType = 'internalmedia';
+            }
+            $title = $atts['title'] ? $atts['title'] : $this->_xmlEntities(utf8_basename(noNS($file)));
+
+            $out .= '<source src="'.hsc($url).'" type="'.$mime.'" />'.NL;
+            // alternative content (just a link to the file)
+            $fallback .= $this->$linkType($file, $title, null, null, null, $cache = null, $linking = 'linkonly', $return = true);
+        }
+
+        // output each track if any
+        foreach( $tracks as $trackid => $info ) {
+            list( $kind, $srclang ) = array_map( 'hsc', $info );
+            $out .= "<track kind=\"$kind\" srclang=\"$srclang\" ";
+            $out .= "label=\"$srclang\" ";
+            $out .= 'src="'.ml($trackid, '', true).'">'.NL;
+        }
+
+        // finish
+        $out .= $fallback;
+        $out .= '</video>'.NL;
+        return $out;
+    }
+
+    /**
+     * Embed audio in HTML
+     *
+     * @author Anika Henke <anika@selfthinker.org>
+     *
+     * @param string $src       - ID of audio to embed
+     * @param array  $atts      - additional attributes for the <audio> tag
+     * @return string
+     */
+    function _audio($src, $atts = array()) {
+        $files = array();
+        $isExternal = media_isexternal($src);
+
+        if ($isExternal) {
+            // take direct source for external files
+            list(/*ext*/, $srcMime) = mimetype($src);
+            $files[$srcMime] = $src;
+        } else {
+            // prepare alternative formats
+            $extensions   = array('ogg', 'mp3', 'wav');
+            $files        = media_alternativefiles($src, $extensions);
+        }
+
+        $out = '';
+        // open audio tag
+        $out .= '<audio '.buildAttributes($atts).' controls="controls">'.NL;
+        $fallback = '';
+
+        // output source for each alternative audio format
+        foreach($files as $mime => $file) {
+            if ($isExternal) {
+                $url = $file;
+                $linkType = 'externalmedia';
+            } else {
+                $url = ml($file, '', true, '&');
+                $linkType = 'internalmedia';
+            }
+            $title = $atts['title'] ? $atts['title'] : $this->_xmlEntities(utf8_basename(noNS($file)));
+
+            $out .= '<source src="'.hsc($url).'" type="'.$mime.'" />'.NL;
+            // alternative content (just a link to the file)
+            $fallback .= $this->$linkType($file, $title, null, null, null, $cache = null, $linking = 'linkonly', $return = true);
+        }
+
+        // finish
+        $out .= $fallback;
+        $out .= '</audio>'.NL;
+        return $out;
+    }
+
+    /**
+     * _getLastMediaRevisionAt is a helperfunction to internalmedia() and _media()
+     * which returns an existing media revision less or equal to rev or date_at
+     *
+     * @author lisps
+     * @param string $media_id
+     * @access protected
+     * @return string revision ('' for current)
+     */
+    function _getLastMediaRevisionAt($media_id){
+        if(!$this->date_at || media_isexternal($media_id)) return '';
+        $pagelog = new MediaChangeLog($media_id);
+        return $pagelog->getLastRevisionAt($this->date_at);
+    }
+
+    #endregion
+}
+
+//Setup VIM: ex: et ts=4 :
diff --git a/wiki/inc/parser/xhtmlsummary.php b/wiki/inc/parser/xhtmlsummary.php
new file mode 100644
index 0000000..867b71f
--- /dev/null
+++ b/wiki/inc/parser/xhtmlsummary.php
@@ -0,0 +1,89 @@
+<?php
+if(!defined('DOKU_INC')) die('meh.');
+
+/**
+ * The summary XHTML form selects either up to the first two paragraphs
+ * it find in a page or the first section (whichever comes first)
+ * It strips out the table of contents if one exists
+ * Section divs are not used - everything should be nested in a single
+ * div with CSS class "page"
+ * Headings have their a name link removed and section editing links
+ * removed
+ * It also attempts to capture the first heading in a page for
+ * use as the title of the page.
+ *
+ *
+ * @author Harry Fuecks <hfuecks@gmail.com>
+ * @todo   Is this currently used anywhere? Should it?
+ */
+class Doku_Renderer_xhtmlsummary extends Doku_Renderer_xhtml {
+
+    // Namespace these variables to
+    // avoid clashes with parent classes
+    var $sum_paragraphs = 0;
+    var $sum_capture = true;
+    var $sum_inSection = false;
+    var $sum_summary = '';
+    var $sum_pageTitle = false;
+
+    function document_start() {
+        $this->doc .= DOKU_LF.'<div>'.DOKU_LF;
+    }
+
+    function document_end() {
+        $this->doc = $this->sum_summary;
+        $this->doc .= DOKU_LF.'</div>'.DOKU_LF;
+    }
+
+    // FIXME not supported anymore
+    function toc_open() {
+        $this->sum_summary .= $this->doc;
+    }
+
+    // FIXME not supported anymore
+    function toc_close() {
+        $this->doc = '';
+    }
+
+    function header($text, $level, $pos) {
+        if ( !$this->sum_pageTitle ) {
+            $this->info['sum_pagetitle'] = $text;
+            $this->sum_pageTitle = true;
+        }
+        $this->doc .= DOKU_LF.'<h'.$level.'>';
+        $this->doc .= $this->_xmlEntities($text);
+        $this->doc .= "</h$level>".DOKU_LF;
+    }
+
+    function section_open($level) {
+        if ( $this->sum_capture ) {
+            $this->sum_inSection = true;
+        }
+    }
+
+    function section_close() {
+        if ( $this->sum_capture && $this->sum_inSection ) {
+            $this->sum_summary .= $this->doc;
+            $this->sum_capture = false;
+        }
+    }
+
+    function p_open() {
+        if ( $this->sum_capture && $this->sum_paragraphs < 2 ) {
+            $this->sum_paragraphs++;
+        }
+        parent :: p_open();
+    }
+
+    function p_close() {
+        parent :: p_close();
+        if ( $this->sum_capture && $this->sum_paragraphs >= 2 ) {
+            $this->sum_summary .= $this->doc;
+            $this->sum_capture = false;
+        }
+    }
+
+}
+
+
+//Setup VIM: ex: et ts=2 :
diff --git a/wiki/inc/parserutils.php b/wiki/inc/parserutils.php
new file mode 100644
index 0000000..5b0cab0
--- /dev/null
+++ b/wiki/inc/parserutils.php
@@ -0,0 +1,790 @@
+<?php
+/**
+ * Utilities for accessing the parser
+ *
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author     Harry Fuecks <hfuecks@gmail.com>
+ * @author     Andreas Gohr <andi@splitbrain.org>
+ */
+
+if(!defined('DOKU_INC')) die('meh.');
+
+/**
+ * How many pages shall be rendered for getting metadata during one request
+ * at maximum? Note that this limit isn't respected when METADATA_RENDER_UNLIMITED
+ * is passed as render parameter to p_get_metadata.
+ */
+if (!defined('P_GET_METADATA_RENDER_LIMIT')) define('P_GET_METADATA_RENDER_LIMIT', 5);
+
+/** Don't render metadata even if it is outdated or doesn't exist */
+define('METADATA_DONT_RENDER', 0);
+/**
+ * Render metadata when the page is really newer or the metadata doesn't exist.
+ * Uses just a simple check, but should work pretty well for loading simple
+ * metadata values like the page title and avoids rendering a lot of pages in
+ * one request. The P_GET_METADATA_RENDER_LIMIT is used in this mode.
+ * Use this if it is unlikely that the metadata value you are requesting
+ * does depend e.g. on pages that are included in the current page using
+ * the include plugin (this is very likely the case for the page title, but
+ * not for relation references).
+ */
+define('METADATA_RENDER_USING_SIMPLE_CACHE', 1);
+/**
+ * Render metadata using the metadata cache logic. The P_GET_METADATA_RENDER_LIMIT
+ * is used in this mode. Use this mode when you are requesting more complex
+ * metadata. Although this will cause rendering more often it might actually have
+ * the effect that less current metadata is returned as it is more likely than in
+ * the simple cache mode that metadata needs to be rendered for all pages at once
+ * which means that when the metadata for the page is requested that actually needs
+ * to be updated the limit might have been reached already.
+ */
+define('METADATA_RENDER_USING_CACHE', 2);
+/**
+ * Render metadata without limiting the number of pages for which metadata is
+ * rendered. Use this mode with care, normally it should only be used in places
+ * like the indexer or in cli scripts where the execution time normally isn't
+ * limited. This can be combined with the simple cache using
+ * METADATA_RENDER_USING_CACHE | METADATA_RENDER_UNLIMITED.
+ */
+define('METADATA_RENDER_UNLIMITED', 4);
+
+/**
+ * Returns the parsed Wikitext in XHTML for the given id and revision.
+ *
+ * If $excuse is true an explanation is returned if the file
+ * wasn't found
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param string $id page id
+ * @param string|int $rev revision timestamp or empty string
+ * @param bool $excuse
+ * @param string $date_at
+ *
+ * @return null|string
+ */
+function p_wiki_xhtml($id, $rev='', $excuse=true,$date_at=''){
+    $file = wikiFN($id,$rev);
+    $ret  = '';
+
+    //ensure $id is in global $ID (needed for parsing)
+    global $ID;
+    $keep = $ID;
+    $ID   = $id;
+
+    if($rev || $date_at){
+        if(file_exists($file)){
+            $ret = p_render('xhtml',p_get_instructions(io_readWikiPage($file,$id,$rev)),$info,$date_at); //no caching on old revisions
+        }elseif($excuse){
+            $ret = p_locale_xhtml('norev');
+        }
+    }else{
+        if(file_exists($file)){
+            $ret = p_cached_output($file,'xhtml',$id);
+        }elseif($excuse){
+            $ret = p_locale_xhtml('newpage');
+        }
+    }
+
+    //restore ID (just in case)
+    $ID = $keep;
+
+    return $ret;
+}
+
+/**
+ * Returns the specified local text in parsed format
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param string $id page id
+ * @return null|string
+ */
+function p_locale_xhtml($id){
+    //fetch parsed locale
+    $html = p_cached_output(localeFN($id));
+    return $html;
+}
+
+/**
+ * Returns the given file parsed into the requested output format
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @author Chris Smith <chris@jalakai.co.uk>
+ *
+ * @param string $file filename, path to file
+ * @param string $format
+ * @param string $id page id
+ * @return null|string
+ */
+function p_cached_output($file, $format='xhtml', $id='') {
+    global $conf;
+
+    $cache = new cache_renderer($id, $file, $format);
+    if ($cache->useCache()) {
+        $parsed = $cache->retrieveCache(false);
+        if($conf['allowdebug'] && $format=='xhtml') {
+            $parsed .= "\n<!-- cachefile {$cache->cache} used -->\n";
+        }
+    } else {
+        $parsed = p_render($format, p_cached_instructions($file,false,$id), $info);
+
+        if ($info['cache'] && $cache->storeCache($parsed)) {              // storeCache() attempts to save cachefile
+            if($conf['allowdebug'] && $format=='xhtml') {
+                $parsed .= "\n<!-- no cachefile used, but created {$cache->cache} -->\n";
+            }
+        }else{
+            $cache->removeCache();                     //try to delete cachefile
+            if($conf['allowdebug'] && $format=='xhtml') {
+                $parsed .= "\n<!-- no cachefile used, caching forbidden -->\n";
+            }
+        }
+    }
+
+    return $parsed;
+}
+
+/**
+ * Returns the render instructions for a file
+ *
+ * Uses and creates a serialized cache file
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param string $file      filename, path to file
+ * @param bool   $cacheonly
+ * @param string $id        page id
+ * @return array|null
+ */
+function p_cached_instructions($file,$cacheonly=false,$id='') {
+    static $run = null;
+    if(is_null($run)) $run = array();
+
+    $cache = new cache_instructions($id, $file);
+
+    if ($cacheonly || $cache->useCache() || (isset($run[$file]) && !defined('DOKU_UNITTEST'))) {
+        return $cache->retrieveCache();
+    } else if (file_exists($file)) {
+        // no cache - do some work
+        $ins = p_get_instructions(io_readWikiPage($file,$id));
+        if ($cache->storeCache($ins)) {
+            $run[$file] = true; // we won't rebuild these instructions in the same run again
+        } else {
+            msg('Unable to save cache file. Hint: disk full; file permissions; safe_mode setting.',-1);
+        }
+        return $ins;
+    }
+
+    return null;
+}
+
+/**
+ * turns a page into a list of instructions
+ *
+ * @author Harry Fuecks <hfuecks@gmail.com>
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param string $text  raw wiki syntax text
+ * @return array a list of instruction arrays
+ */
+function p_get_instructions($text){
+
+    $modes = p_get_parsermodes();
+
+    // Create the parser
+    $Parser = new Doku_Parser();
+
+    // Add the Handler
+    $Parser->Handler = new Doku_Handler();
+
+    //add modes to parser
+    foreach($modes as $mode){
+        $Parser->addMode($mode['mode'],$mode['obj']);
+    }
+
+    // Do the parsing
+    trigger_event('PARSER_WIKITEXT_PREPROCESS', $text);
+    $p = $Parser->parse($text);
+    //  dbg($p);
+    return $p;
+}
+
+/**
+ * returns the metadata of a page
+ *
+ * @param string $id      The id of the page the metadata should be returned from
+ * @param string $key     The key of the metdata value that shall be read (by default everything) - separate hierarchies by " " like "date created"
+ * @param int    $render  If the page should be rendererd - possible values:
+ *     METADATA_DONT_RENDER, METADATA_RENDER_USING_SIMPLE_CACHE, METADATA_RENDER_USING_CACHE
+ *     METADATA_RENDER_UNLIMITED (also combined with the previous two options),
+ *     default: METADATA_RENDER_USING_CACHE
+ * @return mixed The requested metadata fields
+ *
+ * @author Esther Brunner <esther@kaffeehaus.ch>
+ * @author Michael Hamann <michael@content-space.de>
+ */
+function p_get_metadata($id, $key='', $render=METADATA_RENDER_USING_CACHE){
+    global $ID;
+    static $render_count = 0;
+    // track pages that have already been rendered in order to avoid rendering the same page
+    // again
+    static $rendered_pages = array();
+
+    // cache the current page
+    // Benchmarking shows the current page's metadata is generally the only page metadata
+    // accessed several times. This may catch a few other pages, but that shouldn't be an issue.
+    $cache = ($ID == $id);
+    $meta = p_read_metadata($id, $cache);
+
+    if (!is_numeric($render)) {
+        if ($render) {
+            $render = METADATA_RENDER_USING_SIMPLE_CACHE;
+        } else {
+            $render = METADATA_DONT_RENDER;
+        }
+    }
+
+    // prevent recursive calls in the cache
+    static $recursion = false;
+    if (!$recursion && $render != METADATA_DONT_RENDER && !isset($rendered_pages[$id])&& page_exists($id)){
+        $recursion = true;
+
+        $cachefile = new cache_renderer($id, wikiFN($id), 'metadata');
+
+        $do_render = false;
+        if ($render & METADATA_RENDER_UNLIMITED || $render_count < P_GET_METADATA_RENDER_LIMIT) {
+            if ($render & METADATA_RENDER_USING_SIMPLE_CACHE) {
+                $pagefn = wikiFN($id);
+                $metafn = metaFN($id, '.meta');
+                if (!file_exists($metafn) || @filemtime($pagefn) > @filemtime($cachefile->cache)) {
+                    $do_render = true;
+                }
+            } elseif (!$cachefile->useCache()){
+                $do_render = true;
+            }
+        }
+        if ($do_render) {
+            if (!defined('DOKU_UNITTEST')) {
+                ++$render_count;
+                $rendered_pages[$id] = true;
+            }
+            $old_meta = $meta;
+            $meta = p_render_metadata($id, $meta);
+            // only update the file when the metadata has been changed
+            if ($meta == $old_meta || p_save_metadata($id, $meta)) {
+                // store a timestamp in order to make sure that the cachefile is touched
+                // this timestamp is also stored when the meta data is still the same
+                $cachefile->storeCache(time());
+            } else {
+                msg('Unable to save metadata file. Hint: disk full; file permissions; safe_mode setting.',-1);
+            }
+        }
+
+        $recursion = false;
+    }
+
+    $val = $meta['current'];
+
+    // filter by $key
+    foreach(preg_split('/\s+/', $key, 2, PREG_SPLIT_NO_EMPTY) as $cur_key) {
+        if (!isset($val[$cur_key])) {
+            return null;
+        }
+        $val = $val[$cur_key];
+    }
+    return $val;
+}
+
+/**
+ * sets metadata elements of a page
+ *
+ * @see http://www.dokuwiki.org/devel:metadata#functions_to_get_and_set_metadata
+ *
+ * @param String  $id         is the ID of a wiki page
+ * @param Array   $data       is an array with key ⇒ value pairs to be set in the metadata
+ * @param Boolean $render     whether or not the page metadata should be generated with the renderer
+ * @param Boolean $persistent indicates whether or not the particular metadata value will persist through
+ *                            the next metadata rendering.
+ * @return boolean true on success
+ *
+ * @author Esther Brunner <esther@kaffeehaus.ch>
+ * @author Michael Hamann <michael@content-space.de>
+ */
+function p_set_metadata($id, $data, $render=false, $persistent=true){
+    if (!is_array($data)) return false;
+
+    global $ID, $METADATA_RENDERERS;
+
+    // if there is currently a renderer change the data in the renderer instead
+    if (isset($METADATA_RENDERERS[$id])) {
+        $orig =& $METADATA_RENDERERS[$id];
+        $meta = $orig;
+    } else {
+        // cache the current page
+        $cache = ($ID == $id);
+        $orig = p_read_metadata($id, $cache);
+
+        // render metadata first?
+        $meta = $render ? p_render_metadata($id, $orig) : $orig;
+    }
+
+    // now add the passed metadata
+    $protected = array('description', 'date', 'contributor');
+    foreach ($data as $key => $value){
+
+        // be careful with sub-arrays of $meta['relation']
+        if ($key == 'relation'){
+
+            foreach ($value as $subkey => $subvalue){
+                if(isset($meta['current'][$key][$subkey]) && is_array($meta['current'][$key][$subkey])) {
+                    $meta['current'][$key][$subkey] = array_replace($meta['current'][$key][$subkey], (array)$subvalue);
+                } else {
+                    $meta['current'][$key][$subkey] = $subvalue;
+                }
+                if($persistent) {
+                    if(isset($meta['persistent'][$key][$subkey]) && is_array($meta['persistent'][$key][$subkey])) {
+                        $meta['persistent'][$key][$subkey] = array_replace($meta['persistent'][$key][$subkey], (array)$subvalue);
+                    } else {
+                        $meta['persistent'][$key][$subkey] = $subvalue;
+                    }
+                }
+            }
+
+            // be careful with some senisitive arrays of $meta
+        } elseif (in_array($key, $protected)){
+
+            // these keys, must have subkeys - a legitimate value must be an array
+            if (is_array($value)) {
+                $meta['current'][$key] = !empty($meta['current'][$key]) ? array_replace((array)$meta['current'][$key],$value) : $value;
+
+                if ($persistent) {
+                    $meta['persistent'][$key] = !empty($meta['persistent'][$key]) ? array_replace((array)$meta['persistent'][$key],$value) : $value;
+                }
+            }
+
+            // no special treatment for the rest
+        } else {
+            $meta['current'][$key] = $value;
+            if ($persistent) $meta['persistent'][$key] = $value;
+        }
+    }
+
+    // save only if metadata changed
+    if ($meta == $orig) return true;
+
+    if (isset($METADATA_RENDERERS[$id])) {
+        // set both keys individually as the renderer has references to the individual keys
+        $METADATA_RENDERERS[$id]['current']    = $meta['current'];
+        $METADATA_RENDERERS[$id]['persistent'] = $meta['persistent'];
+        return true;
+    } else {
+        return p_save_metadata($id, $meta);
+    }
+}
+
+/**
+ * Purges the non-persistant part of the meta data
+ * used on page deletion
+ *
+ * @author Michael Klier <chi@chimeric.de>
+ *
+ * @param string $id page id
+ * @return bool  success / fail
+ */
+function p_purge_metadata($id) {
+    $meta = p_read_metadata($id);
+    foreach($meta['current'] as $key => $value) {
+        if(is_array($meta[$key])) {
+            $meta['current'][$key] = array();
+        } else {
+            $meta['current'][$key] = '';
+        }
+
+    }
+    return p_save_metadata($id, $meta);
+}
+
+/**
+ * read the metadata from source/cache for $id
+ * (internal use only - called by p_get_metadata & p_set_metadata)
+ *
+ * @author   Christopher Smith <chris@jalakai.co.uk>
+ *
+ * @param    string   $id      absolute wiki page id
+ * @param    bool     $cache   whether or not to cache metadata in memory
+ *                             (only use for metadata likely to be accessed several times)
+ *
+ * @return   array             metadata
+ */
+function p_read_metadata($id,$cache=false) {
+    global $cache_metadata;
+
+    if (isset($cache_metadata[(string)$id])) return $cache_metadata[(string)$id];
+
+    $file = metaFN($id, '.meta');
+    $meta = file_exists($file) ? unserialize(io_readFile($file, false)) : array('current'=>array(),'persistent'=>array());
+
+    if ($cache) {
+        $cache_metadata[(string)$id] = $meta;
+    }
+
+    return $meta;
+}
+
+/**
+ * This is the backend function to save a metadata array to a file
+ *
+ * @param    string   $id      absolute wiki page id
+ * @param    array    $meta    metadata
+ *
+ * @return   bool              success / fail
+ */
+function p_save_metadata($id, $meta) {
+    // sync cached copies, including $INFO metadata
+    global $cache_metadata, $INFO;
+
+    if (isset($cache_metadata[$id])) $cache_metadata[$id] = $meta;
+    if (!empty($INFO) && ($id == $INFO['id'])) { $INFO['meta'] = $meta['current']; }
+
+    return io_saveFile(metaFN($id, '.meta'), serialize($meta));
+}
+
+/**
+ * renders the metadata of a page
+ *
+ * @author Esther Brunner <esther@kaffeehaus.ch>
+ *
+ * @param string $id    page id
+ * @param array  $orig  the original metadata
+ * @return array|null array('current'=> array,'persistent'=> array);
+ */
+function p_render_metadata($id, $orig){
+    // make sure the correct ID is in global ID
+    global $ID, $METADATA_RENDERERS;
+
+    // avoid recursive rendering processes for the same id
+    if (isset($METADATA_RENDERERS[$id])) {
+        return $orig;
+    }
+
+    // store the original metadata in the global $METADATA_RENDERERS so p_set_metadata can use it
+    $METADATA_RENDERERS[$id] =& $orig;
+
+    $keep = $ID;
+    $ID   = $id;
+
+    // add an extra key for the event - to tell event handlers the page whose metadata this is
+    $orig['page'] = $id;
+    $evt = new Doku_Event('PARSER_METADATA_RENDER', $orig);
+    if ($evt->advise_before()) {
+
+        // get instructions
+        $instructions = p_cached_instructions(wikiFN($id),false,$id);
+        if(is_null($instructions)){
+            $ID = $keep;
+            unset($METADATA_RENDERERS[$id]);
+            return null; // something went wrong with the instructions
+        }
+
+        // set up the renderer
+        $renderer = new Doku_Renderer_metadata();
+        $renderer->meta =& $orig['current'];
+        $renderer->persistent =& $orig['persistent'];
+
+        // loop through the instructions
+        foreach ($instructions as $instruction){
+            // execute the callback against the renderer
+            call_user_func_array(array(&$renderer, $instruction[0]), (array) $instruction[1]);
+        }
+
+        $evt->result = array('current'=>&$renderer->meta,'persistent'=>&$renderer->persistent);
+    }
+    $evt->advise_after();
+
+    // clean up
+    $ID = $keep;
+    unset($METADATA_RENDERERS[$id]);
+    return $evt->result;
+}
+
+/**
+ * returns all available parser syntax modes in correct order
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @return array[] with for each plugin the array('sort' => sortnumber, 'mode' => mode string, 'obj'  => plugin object)
+ */
+function p_get_parsermodes(){
+    global $conf;
+
+    //reuse old data
+    static $modes = null;
+    if($modes != null && !defined('DOKU_UNITTEST')){
+        return $modes;
+    }
+
+    //import parser classes and mode definitions
+    require_once DOKU_INC . 'inc/parser/parser.php';
+
+    // we now collect all syntax modes and their objects, then they will
+    // be sorted and added to the parser in correct order
+    $modes = array();
+
+    // add syntax plugins
+    $pluginlist = plugin_list('syntax');
+    if(count($pluginlist)){
+        global $PARSER_MODES;
+        $obj = null;
+        foreach($pluginlist as $p){
+            /** @var DokuWiki_Syntax_Plugin $obj */
+            if(!$obj = plugin_load('syntax',$p)) continue; //attempt to load plugin into $obj
+            $PARSER_MODES[$obj->getType()][] = "plugin_$p"; //register mode type
+            //add to modes
+            $modes[] = array(
+                    'sort' => $obj->getSort(),
+                    'mode' => "plugin_$p",
+                    'obj'  => $obj,
+                    );
+            unset($obj); //remove the reference
+        }
+    }
+
+    // add default modes
+    $std_modes = array('listblock','preformatted','notoc','nocache',
+            'header','table','linebreak','footnote','hr',
+            'unformatted','php','html','code','file','quote',
+            'internallink','rss','media','externallink',
+            'emaillink','windowssharelink','eol');
+    if($conf['typography']){
+        $std_modes[] = 'quotes';
+        $std_modes[] = 'multiplyentity';
+    }
+    foreach($std_modes as $m){
+        $class = "Doku_Parser_Mode_$m";
+        $obj   = new $class();
+        $modes[] = array(
+                'sort' => $obj->getSort(),
+                'mode' => $m,
+                'obj'  => $obj
+                );
+    }
+
+    // add formatting modes
+    $fmt_modes = array('strong','emphasis','underline','monospace',
+            'subscript','superscript','deleted');
+    foreach($fmt_modes as $m){
+        $obj   = new Doku_Parser_Mode_formatting($m);
+        $modes[] = array(
+                'sort' => $obj->getSort(),
+                'mode' => $m,
+                'obj'  => $obj
+                );
+    }
+
+    // add modes which need files
+    $obj     = new Doku_Parser_Mode_smiley(array_keys(getSmileys()));
+    $modes[] = array('sort' => $obj->getSort(), 'mode' => 'smiley','obj'  => $obj );
+    $obj     = new Doku_Parser_Mode_acronym(array_keys(getAcronyms()));
+    $modes[] = array('sort' => $obj->getSort(), 'mode' => 'acronym','obj'  => $obj );
+    $obj     = new Doku_Parser_Mode_entity(array_keys(getEntities()));
+    $modes[] = array('sort' => $obj->getSort(), 'mode' => 'entity','obj'  => $obj );
+
+    // add optional camelcase mode
+    if($conf['camelcase']){
+        $obj     = new Doku_Parser_Mode_camelcaselink();
+        $modes[] = array('sort' => $obj->getSort(), 'mode' => 'camelcaselink','obj'  => $obj );
+    }
+
+    //sort modes
+    usort($modes,'p_sort_modes');
+
+    return $modes;
+}
+
+/**
+ * Callback function for usort
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param array $a
+ * @param array $b
+ * @return int $a is lower/equal/higher than $b
+ */
+function p_sort_modes($a, $b){
+    if($a['sort'] == $b['sort']) return 0;
+    return ($a['sort'] < $b['sort']) ? -1 : 1;
+}
+
+/**
+ * Renders a list of instruction to the specified output mode
+ *
+ * In the $info array is information from the renderer returned
+ *
+ * @author Harry Fuecks <hfuecks@gmail.com>
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param string $mode
+ * @param array|null|false $instructions
+ * @param array $info returns render info like enabled toc and cache
+ * @param string $date_at
+ * @return null|string rendered output
+ */
+function p_render($mode,$instructions,&$info,$date_at=''){
+    if(is_null($instructions)) return '';
+    if($instructions === false) return '';
+
+    $Renderer = p_get_renderer($mode);
+    if (is_null($Renderer)) return null;
+
+    $Renderer->reset();
+
+    if($date_at) {
+        $Renderer->date_at = $date_at;
+    }
+
+    $Renderer->smileys = getSmileys();
+    $Renderer->entities = getEntities();
+    $Renderer->acronyms = getAcronyms();
+    $Renderer->interwiki = getInterwiki();
+
+    // Loop through the instructions
+    foreach ( $instructions as $instruction ) {
+        // Execute the callback against the Renderer
+        if(method_exists($Renderer, $instruction[0])){
+            call_user_func_array(array(&$Renderer, $instruction[0]), $instruction[1] ? $instruction[1] : array());
+        }
+    }
+
+    //set info array
+    $info = $Renderer->info;
+
+    // Post process and return the output
+    $data = array($mode,& $Renderer->doc);
+    trigger_event('RENDERER_CONTENT_POSTPROCESS',$data);
+    return $Renderer->doc;
+}
+
+/**
+ * Figure out the correct renderer class to use for $mode,
+ * instantiate and return it
+ *
+ * @param string $mode Mode of the renderer to get
+ * @return null|Doku_Renderer The renderer
+ *
+ * @author Christopher Smith <chris@jalakai.co.uk>
+ */
+function p_get_renderer($mode) {
+    /** @var Doku_Plugin_Controller $plugin_controller */
+    global $conf, $plugin_controller;
+
+    $rname = !empty($conf['renderer_'.$mode]) ? $conf['renderer_'.$mode] : $mode;
+    $rclass = "Doku_Renderer_$rname";
+
+    // if requested earlier or a bundled renderer
+    if( class_exists($rclass) ) {
+        $Renderer = new $rclass();
+        return $Renderer;
+    }
+
+    // not bundled, see if its an enabled renderer plugin & when $mode is 'xhtml', the renderer can supply that format.
+    /** @var Doku_Renderer $Renderer */
+    $Renderer = $plugin_controller->load('renderer',$rname);
+    if ($Renderer && is_a($Renderer, 'Doku_Renderer')  && ($mode != 'xhtml' || $mode == $Renderer->getFormat())) {
+        return $Renderer;
+    }
+
+    // there is a configuration error!
+    // not bundled, not a valid enabled plugin, use $mode to try to fallback to a bundled renderer
+    $rclass = "Doku_Renderer_$mode";
+    if ( class_exists($rclass) ) {
+        // viewers should see renderered output, so restrict the warning to admins only
+        $msg = "No renderer '$rname' found for mode '$mode', check your plugins";
+        if ($mode == 'xhtml') {
+            $msg .= " and the 'renderer_xhtml' config setting";
+        }
+        $msg .= ".<br/>Attempting to fallback to the bundled renderer.";
+        msg($msg,-1,'','',MSG_ADMINS_ONLY);
+
+        $Renderer = new $rclass;
+        $Renderer->nocache();     // fallback only (and may include admin alerts), don't cache
+        return $Renderer;
+    }
+
+    // fallback failed, alert the world
+    msg("No renderer '$rname' found for mode '$mode'",-1);
+    return null;
+}
+
+/**
+ * Gets the first heading from a file
+ *
+ * @param   string   $id       dokuwiki page id
+ * @param   int      $render   rerender if first heading not known
+ *                             default: METADATA_RENDER_USING_SIMPLE_CACHE
+ *                             Possible values: METADATA_DONT_RENDER,
+ *                                              METADATA_RENDER_USING_SIMPLE_CACHE,
+ *                                              METADATA_RENDER_USING_CACHE,
+ *                                              METADATA_RENDER_UNLIMITED
+ * @return string|null The first heading
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @author Michael Hamann <michael@content-space.de>
+ */
+function p_get_first_heading($id, $render=METADATA_RENDER_USING_SIMPLE_CACHE){
+    return p_get_metadata(cleanID($id),'title',$render);
+}
+
+/**
+ * Wrapper for GeSHi Code Highlighter, provides caching of its output
+ *
+ * @param  string   $code       source code to be highlighted
+ * @param  string   $language   language to provide highlighting
+ * @param  string   $wrapper    html element to wrap the returned highlighted text
+ * @return string xhtml code
+ *
+ * @author Christopher Smith <chris@jalakai.co.uk>
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+function p_xhtml_cached_geshi($code, $language, $wrapper='pre', array $options=null) {
+    global $conf, $config_cascade, $INPUT;
+    $language = strtolower($language);
+
+    // remove any leading or trailing blank lines
+    $code = preg_replace('/^\s*?\n|\s*?\n$/','',$code);
+
+    $optionsmd5 = md5(serialize($options));
+    $cache = getCacheName($language.$code.$optionsmd5,".code");
+    $ctime = @filemtime($cache);
+    if($ctime && !$INPUT->bool('purge') &&
+            $ctime > filemtime(DOKU_INC.'vendor/composer/installed.json') &&  // libraries changed
+            $ctime > filemtime(reset($config_cascade['main']['default']))){ // dokuwiki changed
+        $highlighted_code = io_readFile($cache, false);
+    } else {
+
+        $geshi = new GeSHi($code, $language);
+        $geshi->set_encoding('utf-8');
+        $geshi->enable_classes();
+        $geshi->set_header_type(GESHI_HEADER_PRE);
+        $geshi->set_link_target($conf['target']['extern']);
+        if($options !== null) {
+            foreach ($options as $function => $params) {
+                if(is_callable(array($geshi, $function))) {
+                    $geshi->$function($params);
+                }
+            }
+        }
+
+        // remove GeSHi's wrapper element (we'll replace it with our own later)
+        // we need to use a GeSHi wrapper to avoid <BR> throughout the highlighted text
+        $highlighted_code = trim(preg_replace('!^<pre[^>]*>|</pre>$!','',$geshi->parse_code()),"\n\r");
+        io_saveFile($cache,$highlighted_code);
+    }
+
+    // add a wrapper element if required
+    if ($wrapper) {
+        return "<$wrapper class=\"code $language\">$highlighted_code</$wrapper>";
+    } else {
+        return $highlighted_code;
+    }
+}
+
diff --git a/wiki/inc/plugincontroller.class.php b/wiki/inc/plugincontroller.class.php
new file mode 100644
index 0000000..fd8cd96
--- /dev/null
+++ b/wiki/inc/plugincontroller.class.php
@@ -0,0 +1,347 @@
+<?php
+/**
+ * Class to encapsulate access to dokuwiki plugins
+ *
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author     Christopher Smith <chris@jalakai.co.uk>
+ */
+
+// plugin related constants
+if(!defined('DOKU_PLUGIN'))  define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/');
+
+class Doku_Plugin_Controller {
+
+    protected $list_bytype = array();
+    protected $tmp_plugins = array();
+    protected $plugin_cascade = array('default'=>array(),'local'=>array(),'protected'=>array());
+    protected $last_local_config_file = '';
+
+    /**
+     * Populates the master list of plugins
+     */
+    public function __construct() {
+        $this->loadConfig();
+        $this->_populateMasterList();
+    }
+
+    /**
+     * Returns a list of available plugins of given type
+     *
+     * @param $type  string, plugin_type name;
+     *               the type of plugin to return,
+     *               use empty string for all types
+     * @param $all   bool;
+     *               false to only return enabled plugins,
+     *               true to return both enabled and disabled plugins
+     *
+     * @return       array of
+     *                  - plugin names when $type = ''
+     *                  - or plugin component names when a $type is given
+     *
+     * @author Andreas Gohr <andi@splitbrain.org>
+     */
+    public function getList($type='',$all=false){
+
+        // request the complete list
+        if (!$type) {
+            return $all ? array_keys($this->tmp_plugins) : array_keys(array_filter($this->tmp_plugins));
+        }
+
+        if (!isset($this->list_bytype[$type]['enabled'])) {
+            $this->list_bytype[$type]['enabled'] = $this->_getListByType($type,true);
+        }
+        if ($all && !isset($this->list_bytype[$type]['disabled'])) {
+            $this->list_bytype[$type]['disabled'] = $this->_getListByType($type,false);
+        }
+
+        return $all ? array_merge($this->list_bytype[$type]['enabled'],$this->list_bytype[$type]['disabled']) : $this->list_bytype[$type]['enabled'];
+    }
+
+    /**
+     * Loads the given plugin and creates an object of it
+     *
+     * @author Andreas Gohr <andi@splitbrain.org>
+     *
+     * @param  $type     string type of plugin to load
+     * @param  $name     string name of the plugin to load
+     * @param  $new      bool   true to return a new instance of the plugin, false to use an already loaded instance
+     * @param  $disabled bool   true to load even disabled plugins
+     * @return DokuWiki_PluginInterface|null  the plugin object or null on failure
+     */
+    public function load($type,$name,$new=false,$disabled=false){
+
+        //we keep all loaded plugins available in global scope for reuse
+        global $DOKU_PLUGINS;
+
+        list($plugin, /* $component */) = $this->_splitName($name);
+
+        // check if disabled
+        if(!$disabled && $this->isdisabled($plugin)){
+            return null;
+        }
+
+        $class = $type.'_plugin_'.$name;
+
+        //plugin already loaded?
+        if(!empty($DOKU_PLUGINS[$type][$name])){
+            if ($new || !$DOKU_PLUGINS[$type][$name]->isSingleton()) {
+                return class_exists($class, true) ? new $class : null;
+            } else {
+                return $DOKU_PLUGINS[$type][$name];
+            }
+        }
+
+        //construct class and instantiate
+        if (!class_exists($class, true)) {
+
+            # the plugin might be in the wrong directory
+            $dir = $this->get_directory($plugin);
+            $inf = confToHash(DOKU_PLUGIN."$dir/plugin.info.txt");
+            if($inf['base'] && $inf['base'] != $plugin){
+                msg(sprintf("Plugin installed incorrectly. Rename plugin directory '%s' to '%s'.", hsc($plugin), hsc($inf['base'])), -1);
+            } elseif (preg_match('/^'.DOKU_PLUGIN_NAME_REGEX.'$/', $plugin) !== 1) {
+                msg(sprintf("Plugin name '%s' is not a valid plugin name, only the characters a-z and 0-9 are allowed. ".
+                                'Maybe the plugin has been installed in the wrong directory?', hsc($plugin)), -1);
+            }
+            return null;
+        }
+
+        $DOKU_PLUGINS[$type][$name] = new $class;
+        return $DOKU_PLUGINS[$type][$name];
+    }
+
+    /**
+     * Whether plugin is disabled
+     *
+     * @param string $plugin name of plugin
+     * @return bool  true disabled, false enabled
+     */
+    public function isdisabled($plugin) {
+        return empty($this->tmp_plugins[$plugin]);
+    }
+
+    /**
+     * Disable the plugin
+     *
+     * @param string $plugin name of plugin
+     * @return bool  true saving succeed, false saving failed
+     */
+    public function disable($plugin) {
+        if(array_key_exists($plugin,$this->plugin_cascade['protected'])) return false;
+        $this->tmp_plugins[$plugin] = 0;
+        return $this->saveList();
+    }
+
+    /**
+     * Enable the plugin
+     *
+     * @param string $plugin name of plugin
+     * @return bool  true saving succeed, false saving failed
+     */
+    public function enable($plugin) {
+        if(array_key_exists($plugin,$this->plugin_cascade['protected'])) return false;
+        $this->tmp_plugins[$plugin] = 1;
+        return $this->saveList();
+    }
+
+    /**
+     * Returns directory name of plugin
+     *
+     * @param string $plugin name of plugin
+     * @return string name of directory
+     */
+    public function get_directory($plugin) {
+        return $plugin;
+    }
+
+    /**
+     * Returns cascade of the config files
+     *
+     * @return array with arrays of plugin configs
+     */
+    public function getCascade() {
+        return $this->plugin_cascade;
+    }
+
+    protected function _populateMasterList() {
+        global $conf;
+
+        if ($dh = @opendir(DOKU_PLUGIN)) {
+            $all_plugins = array();
+            while (false !== ($plugin = readdir($dh))) {
+                if ($plugin[0] == '.') continue;               // skip hidden entries
+                if (is_file(DOKU_PLUGIN.$plugin)) continue;    // skip files, we're only interested in directories
+
+                if (array_key_exists($plugin,$this->tmp_plugins) && $this->tmp_plugins[$plugin] == 0){
+                    $all_plugins[$plugin] = 0;
+
+                } elseif ((array_key_exists($plugin,$this->tmp_plugins) && $this->tmp_plugins[$plugin] == 1)) {
+                    $all_plugins[$plugin] = 1;
+                } else {
+                    $all_plugins[$plugin] = 1;
+                }
+            }
+            $this->tmp_plugins = $all_plugins;
+            if (!file_exists($this->last_local_config_file)) {
+                $this->saveList(true);
+            }
+        }
+    }
+
+    /**
+     * Includes the plugin config $files
+     * and returns the entries of the $plugins array set in these files
+     *
+     * @param array $files list of files to include, latter overrides previous
+     * @return array with entries of the $plugins arrays of the included files
+     */
+    protected function checkRequire($files) {
+        $plugins = array();
+        foreach($files as $file) {
+            if(file_exists($file)) {
+                include_once($file);
+            }
+        }
+        return $plugins;
+    }
+
+    /**
+     * Save the current list of plugins
+     *
+     * @param bool $forceSave;
+     *              false to save only when config changed
+     *              true to always save
+     * @return bool  true saving succeed, false saving failed
+     */
+    protected function saveList($forceSave = false) {
+        global $conf;
+
+        if (empty($this->tmp_plugins)) return false;
+
+        // Rebuild list of local settings
+        $local_plugins = $this->rebuildLocal();
+        if($local_plugins != $this->plugin_cascade['local'] || $forceSave) {
+            $file = $this->last_local_config_file;
+            $out = "<?php\n/*\n * Local plugin enable/disable settings\n * Auto-generated through plugin/extension manager\n *\n".
+                   " * NOTE: Plugins will not be added to this file unless there is a need to override a default setting. Plugins are\n".
+                   " *       enabled by default.\n */\n";
+            foreach ($local_plugins as $plugin => $value) {
+                $out .= "\$plugins['$plugin'] = $value;\n";
+            }
+            // backup current file (remove any existing backup)
+            if (file_exists($file)) {
+                $backup = $file.'.bak';
+                if (file_exists($backup)) @unlink($backup);
+                if (!@copy($file,$backup)) return false;
+                if (!empty($conf['fperm'])) chmod($backup, $conf['fperm']);
+            }
+            //check if can open for writing, else restore
+            return io_saveFile($file,$out);
+        }
+        return false;
+    }
+
+    /**
+     * Rebuild the set of local plugins
+     *
+     * @return array array of plugins to be saved in end($config_cascade['plugins']['local'])
+     */
+    protected function rebuildLocal() {
+        //assign to local variable to avoid overwriting
+        $backup = $this->tmp_plugins;
+        //Can't do anything about protected one so rule them out completely
+        $local_default = array_diff_key($backup,$this->plugin_cascade['protected']);
+        //Diff between local+default and default
+        //gives us the ones we need to check and save
+        $diffed_ones = array_diff_key($local_default,$this->plugin_cascade['default']);
+        //The ones which we are sure of (list of 0s not in default)
+        $sure_plugins = array_filter($diffed_ones,array($this,'negate'));
+        //the ones in need of diff
+        $conflicts = array_diff_key($local_default,$diffed_ones);
+        //The final list
+        return array_merge($sure_plugins,array_diff_assoc($conflicts,$this->plugin_cascade['default']));
+    }
+
+    /**
+     * Build the list of plugins and cascade
+     *
+     */
+    protected function loadConfig() {
+        global $config_cascade;
+        foreach(array('default','protected') as $type) {
+            if(array_key_exists($type,$config_cascade['plugins']))
+                $this->plugin_cascade[$type] = $this->checkRequire($config_cascade['plugins'][$type]);
+        }
+        $local = $config_cascade['plugins']['local'];
+        $this->last_local_config_file = array_pop($local);
+        $this->plugin_cascade['local'] = $this->checkRequire(array($this->last_local_config_file));
+        if(is_array($local)) {
+            $this->plugin_cascade['default'] = array_merge($this->plugin_cascade['default'],$this->checkRequire($local));
+        }
+        $this->tmp_plugins = array_merge($this->plugin_cascade['default'],$this->plugin_cascade['local'],$this->plugin_cascade['protected']);
+    }
+
+    /**
+     * Returns a list of available plugin components of given type
+     *
+     * @param string $type      plugin_type name; the type of plugin to return,
+     * @param bool   $enabled   true to return enabled plugins,
+     *                          false to return disabled plugins
+     * @return array of plugin components of requested type
+     */
+    protected function _getListByType($type, $enabled) {
+        $master_list = $enabled ? array_keys(array_filter($this->tmp_plugins)) : array_keys(array_filter($this->tmp_plugins,array($this,'negate')));
+        $plugins = array();
+
+        foreach ($master_list as $plugin) {
+
+            $basedir = $this->get_directory($plugin);
+            if (file_exists(DOKU_PLUGIN."$basedir/$type.php")){
+                $plugins[] = $plugin;
+                continue;
+            }
+
+            $typedir = DOKU_PLUGIN."$basedir/$type/";
+            if (is_dir($typedir)) {
+                if ($dp = opendir($typedir)) {
+                    while (false !== ($component = readdir($dp))) {
+                        if (substr($component,0,1) == '.' || strtolower(substr($component, -4)) != ".php") continue;
+                        if (is_file($typedir.$component)) {
+                            $plugins[] = $plugin.'_'.substr($component, 0, -4);
+                        }
+                    }
+                    closedir($dp);
+                }
+            }
+
+        }//foreach
+
+        return $plugins;
+    }
+
+    /**
+     * Split name in a plugin name and a component name
+     *
+     * @param string $name
+     * @return array with
+     *              - plugin name
+     *              - and component name when available, otherwise empty string
+     */
+    protected function _splitName($name) {
+        if (array_search($name, array_keys($this->tmp_plugins)) === false) {
+            return explode('_',$name,2);
+        }
+
+        return array($name,'');
+    }
+
+    /**
+     * Returns inverse boolean value of the input
+     *
+     * @param mixed $input
+     * @return bool inversed boolean value of input
+     */
+    protected function negate($input) {
+        return !(bool) $input;
+    }
+}
diff --git a/wiki/inc/pluginutils.php b/wiki/inc/pluginutils.php
new file mode 100644
index 0000000..a395be4
--- /dev/null
+++ b/wiki/inc/pluginutils.php
@@ -0,0 +1,136 @@
+<?php
+/**
+ * Utilities for handling plugins
+ *
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author     Andreas Gohr <andi@splitbrain.org>
+ */
+
+// plugin related constants
+if(!defined('DOKU_PLUGIN'))  define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/');
+// note that only [a-z0-9]+ is officially supported, this is only to support plugins that don't follow these conventions, too
+if(!defined('DOKU_PLUGIN_NAME_REGEX')) define('DOKU_PLUGIN_NAME_REGEX', '[a-zA-Z0-9\x7f-\xff]+');
+
+/**
+ * Original plugin functions, remain for backwards compatibility
+ */
+
+/**
+ * Return list of available plugins
+ *
+ * @param string $type type of plugins; empty string for all
+ * @param bool $all; true to retrieve all, false to retrieve only enabled plugins
+ * @return array with plugin names or plugin component names
+ */
+function plugin_list($type='',$all=false) {
+    /** @var $plugin_controller Doku_Plugin_Controller */
+    global $plugin_controller;
+    return $plugin_controller->getList($type,$all);
+}
+
+/**
+ * Returns plugin object
+ * Returns only new instances of a plugin when $new is true or if plugin is not Singleton,
+ * otherwise an already loaded instance.
+ *
+ * @param  $type     string type of plugin to load
+ * @param  $name     string name of the plugin to load
+ * @param  $new      bool   true to return a new instance of the plugin, false to use an already loaded instance
+ * @param  $disabled bool   true to load even disabled plugins
+ * @return DokuWiki_PluginInterface|null  the plugin object or null on failure
+ */
+function plugin_load($type,$name,$new=false,$disabled=false) {
+    /** @var $plugin_controller Doku_Plugin_Controller */
+    global $plugin_controller;
+    return $plugin_controller->load($type,$name,$new,$disabled);
+}
+
+/**
+ * Whether plugin is disabled
+ *
+ * @param string $plugin name of plugin
+ * @return bool true disabled, false enabled
+ */
+function plugin_isdisabled($plugin) {
+    /** @var $plugin_controller Doku_Plugin_Controller */
+    global $plugin_controller;
+    return $plugin_controller->isdisabled($plugin);
+}
+
+/**
+ * Enable the plugin
+ *
+ * @param string $plugin name of plugin
+ * @return bool true saving succeed, false saving failed
+ */
+function plugin_enable($plugin) {
+    /** @var $plugin_controller Doku_Plugin_Controller */
+    global $plugin_controller;
+    return $plugin_controller->enable($plugin);
+}
+
+/**
+ * Disable the plugin
+ *
+ * @param string $plugin name of plugin
+ * @return bool  true saving succeed, false saving failed
+ */
+function plugin_disable($plugin) {
+    /** @var $plugin_controller Doku_Plugin_Controller */
+    global $plugin_controller;
+    return $plugin_controller->disable($plugin);
+}
+
+/**
+ * Returns directory name of plugin
+ *
+ * @param string $plugin name of plugin
+ * @return string name of directory
+ */
+function plugin_directory($plugin) {
+    /** @var $plugin_controller Doku_Plugin_Controller */
+    global $plugin_controller;
+    return $plugin_controller->get_directory($plugin);
+}
+
+/**
+ * Returns cascade of the config files
+ *
+ * @return array with arrays of plugin configs
+ */
+function plugin_getcascade() {
+    /** @var $plugin_controller Doku_Plugin_Controller */
+    global $plugin_controller;
+    return $plugin_controller->getCascade();
+}
+
+
+/**
+ * Return the currently operating admin plugin or null
+ * if not on an admin plugin page
+ *
+ * @return Doku_Plugin_Admin
+ */
+function plugin_getRequestAdminPlugin(){
+    static $admin_plugin = false;
+    global $ACT,$INPUT,$INFO;
+
+    if ($admin_plugin === false) {
+        if (($ACT == 'admin') && ($page = $INPUT->str('page', '', true)) != '') {
+            $pluginlist = plugin_list('admin');
+            if (in_array($page, $pluginlist)) {
+                // attempt to load the plugin
+                /** @var $admin_plugin DokuWiki_Admin_Plugin */
+                $admin_plugin = plugin_load('admin', $page);
+                // verify
+                if ($admin_plugin && $admin_plugin->forAdminOnly() && !$INFO['isadmin']) {
+                    $admin_plugin = null;
+                    $INPUT->remove('page');
+                    msg('For admins only',-1);
+                }
+            }
+        }
+    }
+
+    return $admin_plugin;
+}
diff --git a/wiki/inc/preload.php.dist b/wiki/inc/preload.php.dist
new file mode 100644
index 0000000..7acda0e
--- /dev/null
+++ b/wiki/inc/preload.php.dist
@@ -0,0 +1,17 @@
+<?php
+/**
+ * This is an example for a farm setup. Simply copy this file to preload.php and
+ * uncomment what you need. See http://www.dokuwiki.org/farms for more information.
+ * You can also use preload.php for other things than farming, e.g. for moving
+ * local configuration files out of the main ./conf directory.
+ */
+
+// set this to your farm directory
+//if(!defined('DOKU_FARMDIR')) define('DOKU_FARMDIR', '/var/www/farm');
+
+// include this after DOKU_FARMDIR if you want to use farms
+//include(fullpath(dirname(__FILE__)).'/farm.php');
+
+// you can overwrite the $config_cascade to your liking
+//$config_cascade = array(
+//);
diff --git a/wiki/inc/remote.php b/wiki/inc/remote.php
new file mode 100644
index 0000000..2d2e327
--- /dev/null
+++ b/wiki/inc/remote.php
@@ -0,0 +1,357 @@
+<?php
+
+if (!defined('DOKU_INC')) die();
+
+class RemoteException extends Exception {}
+class RemoteAccessDeniedException extends RemoteException {}
+
+/**
+ * This class provides information about remote access to the wiki.
+ *
+ * == Types of methods ==
+ * There are two types of remote methods. The first is the core methods.
+ * These are always available and provided by dokuwiki.
+ * The other is plugin methods. These are provided by remote plugins.
+ *
+ * == Information structure ==
+ * The information about methods will be given in an array with the following structure:
+ * array(
+ *     'method.remoteName' => array(
+ *          'args' => array(
+ *              'type eg. string|int|...|date|file',
+ *          )
+ *          'name' => 'method name in class',
+ *          'return' => 'type',
+ *          'public' => 1/0 - method bypass default group check (used by login)
+ *          ['doc' = 'method documentation'],
+ *     )
+ * )
+ *
+ * plugin names are formed the following:
+ *   core methods begin by a 'dokuwiki' or 'wiki' followed by a . and the method name itself.
+ *   i.e.: dokuwiki.version or wiki.getPage
+ *
+ * plugin methods are formed like 'plugin.<plugin name>.<method name>'.
+ * i.e.: plugin.clock.getTime or plugin.clock_gmt.getTime
+ *
+ * @throws RemoteException
+ */
+class RemoteAPI {
+
+    /**
+     * @var RemoteAPICore
+     */
+    private $coreMethods = null;
+
+    /**
+     * @var array remote methods provided by dokuwiki plugins - will be filled lazy via
+     * {@see RemoteAPI#getPluginMethods}
+     */
+    private $pluginMethods = null;
+
+    /**
+     * @var array contains custom calls to the api. Plugins can use the XML_CALL_REGISTER event.
+     * The data inside is 'custom.call.something' => array('plugin name', 'remote method name')
+     *
+     * The remote method name is the same as in the remote name returned by _getMethods().
+     */
+    private $pluginCustomCalls = null;
+
+    private $dateTransformation;
+    private $fileTransformation;
+
+    /**
+     * constructor
+     */
+    public function __construct() {
+        $this->dateTransformation = array($this, 'dummyTransformation');
+        $this->fileTransformation = array($this, 'dummyTransformation');
+    }
+
+    /**
+     * Get all available methods with remote access.
+     *
+     * @return array with information to all available methods
+     */
+    public function getMethods() {
+        return array_merge($this->getCoreMethods(), $this->getPluginMethods());
+    }
+
+    /**
+     * Call a method via remote api.
+     *
+     * @param string $method name of the method to call.
+     * @param array $args arguments to pass to the given method
+     * @return mixed result of method call, must be a primitive type.
+     */
+    public function call($method, $args = array()) {
+        if ($args === null) {
+            $args = array();
+        }
+        list($type, $pluginName, /* $call */) = explode('.', $method, 3);
+        if ($type === 'plugin') {
+            return $this->callPlugin($pluginName, $method, $args);
+        }
+        if ($this->coreMethodExist($method)) {
+            return $this->callCoreMethod($method, $args);
+        }
+        return $this->callCustomCallPlugin($method, $args);
+    }
+
+    /**
+     * Check existance of core methods
+     *
+     * @param string $name name of the method
+     * @return bool if method exists
+     */
+    private function coreMethodExist($name) {
+        $coreMethods = $this->getCoreMethods();
+        return array_key_exists($name, $coreMethods);
+    }
+
+    /**
+     * Try to call custom methods provided by plugins
+     *
+     * @param string $method name of method
+     * @param array  $args
+     * @return mixed
+     * @throws RemoteException if method not exists
+     */
+    private function  callCustomCallPlugin($method, $args) {
+        $customCalls = $this->getCustomCallPlugins();
+        if (!array_key_exists($method, $customCalls)) {
+            throw new RemoteException('Method does not exist', -32603);
+        }
+        $customCall = $customCalls[$method];
+        return $this->callPlugin($customCall[0], $customCall[1], $args);
+    }
+
+    /**
+     * Returns plugin calls that are registered via RPC_CALL_ADD action
+     *
+     * @return array with pairs of custom plugin calls
+     * @triggers RPC_CALL_ADD
+     */
+    private function getCustomCallPlugins() {
+        if ($this->pluginCustomCalls === null) {
+            $data = array();
+            trigger_event('RPC_CALL_ADD', $data);
+            $this->pluginCustomCalls = $data;
+        }
+        return $this->pluginCustomCalls;
+    }
+
+    /**
+     * Call a plugin method
+     *
+     * @param string $pluginName
+     * @param string $method method name
+     * @param array  $args
+     * @return mixed return of custom method
+     * @throws RemoteException
+     */
+    private function callPlugin($pluginName, $method, $args) {
+        $plugin = plugin_load('remote', $pluginName);
+        $methods = $this->getPluginMethods();
+        if (!$plugin) {
+            throw new RemoteException('Method does not exist', -32603);
+        }
+        $this->checkAccess($methods[$method]);
+        $name = $this->getMethodName($methods, $method);
+        return call_user_func_array(array($plugin, $name), $args);
+    }
+
+    /**
+     * Call a core method
+     *
+     * @param string $method name of method
+     * @param array  $args
+     * @return mixed
+     * @throws RemoteException if method not exist
+     */
+    private function callCoreMethod($method, $args) {
+        $coreMethods = $this->getCoreMethods();
+        $this->checkAccess($coreMethods[$method]);
+        if (!isset($coreMethods[$method])) {
+            throw new RemoteException('Method does not exist', -32603);
+        }
+        $this->checkArgumentLength($coreMethods[$method], $args);
+        return call_user_func_array(array($this->coreMethods, $this->getMethodName($coreMethods, $method)), $args);
+    }
+
+    /**
+     * Check if access should be checked
+     *
+     * @param array $methodMeta data about the method
+     */
+    private function checkAccess($methodMeta) {
+        if (!isset($methodMeta['public'])) {
+            $this->forceAccess();
+        } else{
+            if ($methodMeta['public'] == '0') {
+                $this->forceAccess();
+            }
+        }
+    }
+
+    /**
+     * Check the number of parameters
+     *
+     * @param array $methodMeta data about the method
+     * @param array $args
+     * @throws RemoteException if wrong parameter count
+     */
+    private function checkArgumentLength($methodMeta, $args) {
+        if (count($methodMeta['args']) < count($args)) {
+            throw new RemoteException('Method does not exist - wrong parameter count.', -32603);
+        }
+    }
+
+    /**
+     * Determine the name of the real method
+     *
+     * @param array $methodMeta list of data of the methods
+     * @param string $method name of method
+     * @return string
+     */
+    private function getMethodName($methodMeta, $method) {
+        if (isset($methodMeta[$method]['name'])) {
+            return $methodMeta[$method]['name'];
+        }
+        $method = explode('.', $method);
+        return $method[count($method)-1];
+    }
+
+    /**
+     * Perform access check for current user
+     *
+     * @return bool true if the current user has access to remote api.
+     * @throws RemoteAccessDeniedException If remote access disabled
+     */
+    public function hasAccess() {
+        global $conf;
+        global $USERINFO;
+        /** @var Input $INPUT */
+        global $INPUT;
+
+        if (!$conf['remote']) {
+            throw new RemoteAccessDeniedException('server error. RPC server not enabled.',-32604); //should not be here,just throw
+        }
+        if(trim($conf['remoteuser']) == '!!not set!!') {
+            return false;
+        }
+        if(!$conf['useacl']) {
+            return true;
+        }
+        if(trim($conf['remoteuser']) == '') {
+            return true;
+        }
+
+        return auth_isMember($conf['remoteuser'], $INPUT->server->str('REMOTE_USER'), (array) $USERINFO['grps']);
+    }
+
+    /**
+     * Requests access
+     *
+     * @return void
+     * @throws RemoteException On denied access.
+     */
+    public function forceAccess() {
+        if (!$this->hasAccess()) {
+            throw new RemoteAccessDeniedException('server error. not authorized to call method', -32604);
+        }
+    }
+
+    /**
+     * Collects all the methods of the enabled Remote Plugins
+     *
+     * @return array all plugin methods.
+     * @throws RemoteException if not implemented
+     */
+    public function getPluginMethods() {
+        if ($this->pluginMethods === null) {
+            $this->pluginMethods = array();
+            $plugins = plugin_list('remote');
+
+            foreach ($plugins as $pluginName) {
+                /** @var DokuWiki_Remote_Plugin $plugin */
+                $plugin = plugin_load('remote', $pluginName);
+                if (!is_subclass_of($plugin, 'DokuWiki_Remote_Plugin')) {
+                    throw new RemoteException("Plugin $pluginName does not implement DokuWiki_Remote_Plugin");
+                }
+
+                $methods = $plugin->_getMethods();
+                foreach ($methods as $method => $meta) {
+                    $this->pluginMethods["plugin.$pluginName.$method"] = $meta;
+                }
+            }
+        }
+        return $this->pluginMethods;
+    }
+
+    /**
+     * Collects all the core methods
+     *
+     * @param RemoteAPICore $apiCore this parameter is used for testing. Here you can pass a non-default RemoteAPICore
+     *                               instance. (for mocking)
+     * @return array all core methods.
+     */
+    public function getCoreMethods($apiCore = null) {
+        if ($this->coreMethods === null) {
+            if ($apiCore === null) {
+                $this->coreMethods = new RemoteAPICore($this);
+            } else {
+                $this->coreMethods = $apiCore;
+            }
+        }
+        return $this->coreMethods->__getRemoteInfo();
+    }
+
+    /**
+     * Transform file to xml
+     *
+     * @param mixed $data
+     * @return mixed
+     */
+    public function toFile($data) {
+        return call_user_func($this->fileTransformation, $data);
+    }
+
+    /**
+     * Transform date to xml
+     *
+     * @param mixed $data
+     * @return mixed
+     */
+    public function toDate($data) {
+        return call_user_func($this->dateTransformation, $data);
+    }
+
+    /**
+     * A simple transformation
+     *
+     * @param mixed $data
+     * @return mixed
+     */
+    public function dummyTransformation($data) {
+        return $data;
+    }
+
+    /**
+     * Set the transformer function
+     *
+     * @param callback $dateTransformation
+     */
+    public function setDateTransformation($dateTransformation) {
+        $this->dateTransformation = $dateTransformation;
+    }
+
+    /**
+     * Set the transformer function
+     *
+     * @param callback $fileTransformation
+     */
+    public function setFileTransformation($fileTransformation) {
+        $this->fileTransformation = $fileTransformation;
+    }
+}
diff --git a/wiki/inc/search.php b/wiki/inc/search.php
new file mode 100644
index 0000000..14cd0f8
--- /dev/null
+++ b/wiki/inc/search.php
@@ -0,0 +1,518 @@
+<?php
+/**
+ * DokuWiki search functions
+ *
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author     Andreas Gohr <andi@splitbrain.org>
+ */
+
+if(!defined('DOKU_INC')) die('meh.');
+
+/**
+ * Recurse directory
+ *
+ * This function recurses into a given base directory
+ * and calls the supplied function for each file and directory
+ *
+ * @param   array    &$data The results of the search are stored here
+ * @param   string    $base Where to start the search
+ * @param   callback  $func Callback (function name or array with object,method)
+ * @param   array     $opts option array will be given to the Callback
+ * @param   string    $dir  Current directory beyond $base
+ * @param   int       $lvl  Recursion Level
+ * @param   mixed     $sort 'natural' to use natural order sorting (default); 'date' to sort by filemtime; leave empty to skip sorting.
+ * @author  Andreas Gohr <andi@splitbrain.org>
+ */
+function search(&$data,$base,$func,$opts,$dir='',$lvl=1,$sort='natural'){
+    $dirs   = array();
+    $files  = array();
+    $filepaths = array();
+
+    // safeguard against runaways #1452
+    if($base == '' || $base == '/') {
+        throw new RuntimeException('No valid $base passed to search() - possible misconfiguration or bug');
+    }
+
+    //read in directories and files
+    $dh = @opendir($base.'/'.$dir);
+    if(!$dh) return;
+    while(($file = readdir($dh)) !== false){
+        if(preg_match('/^[\._]/',$file)) continue; //skip hidden files and upper dirs
+        if(is_dir($base.'/'.$dir.'/'.$file)){
+            $dirs[] = $dir.'/'.$file;
+            continue;
+        }
+        $files[] = $dir.'/'.$file;
+        $filepaths[] = $base.'/'.$dir.'/'.$file;
+    }
+    closedir($dh);
+    if (!empty($sort)) {
+        if ($sort == 'date') {
+            @array_multisort(array_map('filemtime', $filepaths), SORT_NUMERIC, SORT_DESC, $files);
+        } else /* natural */ {
+            natsort($files);
+        }
+        natsort($dirs);
+    }
+
+    //give directories to userfunction then recurse
+    foreach($dirs as $dir){
+        if (call_user_func_array($func, array(&$data,$base,$dir,'d',$lvl,$opts))){
+            search($data,$base,$func,$opts,$dir,$lvl+1,$sort);
+        }
+    }
+    //now handle the files
+    foreach($files as $file){
+        call_user_func_array($func, array(&$data,$base,$file,'f',$lvl,$opts));
+    }
+}
+
+/**
+ * The following functions are userfunctions to use with the search
+ * function above. This function is called for every found file or
+ * directory. When a directory is given to the function it has to
+ * decide if this directory should be traversed (true) or not (false)
+ * The function has to accept the following parameters:
+ *
+ * array &$data  - Reference to the result data structure
+ * string $base  - Base usually $conf['datadir']
+ * string $file  - current file or directory relative to $base
+ * string $type  - Type either 'd' for directory or 'f' for file
+ * int    $lvl   - Current recursion depht
+ * array  $opts  - option array as given to search()
+ *
+ * return values for files are ignored
+ *
+ * All functions should check the ACL for document READ rights
+ * namespaces (directories) are NOT checked (when sneaky_index is 0) as this
+ * would break the recursion (You can have an nonreadable dir over a readable
+ * one deeper nested) also make sure to check the file type (for example
+ * in case of lockfiles).
+ */
+
+/**
+ * Searches for pages beginning with the given query
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param array $data
+ * @param string $base
+ * @param string $file
+ * @param string $type
+ * @param integer $lvl
+ * @param array $opts
+ *
+ * @return bool
+ */
+function search_qsearch(&$data,$base,$file,$type,$lvl,$opts){
+    $opts = array(
+            'idmatch'   => '(^|:)'.preg_quote($opts['query'],'/').'/',
+            'listfiles' => true,
+            'pagesonly' => true,
+            );
+    return search_universal($data,$base,$file,$type,$lvl,$opts);
+}
+
+/**
+ * Build the browsable index of pages
+ *
+ * $opts['ns'] is the currently viewed namespace
+ *
+ * @author  Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param array $data
+ * @param string $base
+ * @param string $file
+ * @param string $type
+ * @param integer $lvl
+ * @param array $opts
+ *
+ * @return bool
+ */
+function search_index(&$data,$base,$file,$type,$lvl,$opts){
+    global $conf;
+    $opts = array(
+        'pagesonly' => true,
+        'listdirs' => true,
+        'listfiles' => empty($opts['nofiles']),
+        'sneakyacl' => $conf['sneaky_index'],
+        // Hacky, should rather use recmatch
+        'depth' => preg_match('#^'.preg_quote($file, '#').'(/|$)#','/'.$opts['ns']) ? 0 : -1
+    );
+
+    return search_universal($data, $base, $file, $type, $lvl, $opts);
+}
+
+/**
+ * List all namespaces
+ *
+ * @author  Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param array $data
+ * @param string $base
+ * @param string $file
+ * @param string $type
+ * @param integer $lvl
+ * @param array $opts
+ *
+ * @return bool
+ */
+function search_namespaces(&$data,$base,$file,$type,$lvl,$opts){
+    $opts = array(
+            'listdirs' => true,
+            );
+    return search_universal($data,$base,$file,$type,$lvl,$opts);
+}
+
+/**
+ * List all mediafiles in a namespace
+ *   $opts['depth']     recursion level, 0 for all
+ *   $opts['showmsg']   shows message if invalid media id is used
+ *   $opts['skipacl']   skip acl checking
+ *   $opts['pattern']   check given pattern
+ *   $opts['hash']      add hashes to result list
+ *
+ * @author  Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param array $data
+ * @param string $base
+ * @param string $file
+ * @param string $type
+ * @param integer $lvl
+ * @param array $opts
+ *
+ * @return bool
+ */
+function search_media(&$data,$base,$file,$type,$lvl,$opts){
+
+    //we do nothing with directories
+    if($type == 'd') {
+        if(empty($opts['depth'])) return true; // recurse forever
+        $depth = substr_count($file,'/');
+        if($depth >= $opts['depth']) return false; // depth reached
+        return true;
+    }
+
+    $info         = array();
+    $info['id']   = pathID($file,true);
+    if($info['id'] != cleanID($info['id'])){
+        if($opts['showmsg'])
+            msg(hsc($info['id']).' is not a valid file name for DokuWiki - skipped',-1);
+        return false; // skip non-valid files
+    }
+
+    //check ACL for namespace (we have no ACL for mediafiles)
+    $info['perm'] = auth_quickaclcheck(getNS($info['id']).':*');
+    if(empty($opts['skipacl']) && $info['perm'] < AUTH_READ){
+        return false;
+    }
+
+    //check pattern filter
+    if(!empty($opts['pattern']) && !@preg_match($opts['pattern'], $info['id'])){
+        return false;
+    }
+
+    $info['file']     = utf8_basename($file);
+    $info['size']     = filesize($base.'/'.$file);
+    $info['mtime']    = filemtime($base.'/'.$file);
+    $info['writable'] = is_writable($base.'/'.$file);
+    if(preg_match("/\.(jpe?g|gif|png)$/",$file)){
+        $info['isimg'] = true;
+        $info['meta']  = new JpegMeta($base.'/'.$file);
+    }else{
+        $info['isimg'] = false;
+    }
+    if(!empty($opts['hash'])){
+        $info['hash'] = md5(io_readFile(mediaFN($info['id']),false));
+    }
+
+    $data[] = $info;
+
+    return false;
+}
+
+/**
+ * This function just lists documents (for RSS namespace export)
+ *
+ * @author  Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param array $data
+ * @param string $base
+ * @param string $file
+ * @param string $type
+ * @param integer $lvl
+ * @param array $opts
+ *
+ * @return bool
+ */
+function search_list(&$data,$base,$file,$type,$lvl,$opts){
+    //we do nothing with directories
+    if($type == 'd') return false;
+    //only search txt files
+    if(substr($file,-4) == '.txt'){
+        //check ACL
+        $id = pathID($file);
+        if(auth_quickaclcheck($id) < AUTH_READ){
+            return false;
+        }
+        $data[]['id'] = $id;
+    }
+    return false;
+}
+
+/**
+ * Quicksearch for searching matching pagenames
+ *
+ * $opts['query'] is the search query
+ *
+ * @author  Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param array $data
+ * @param string $base
+ * @param string $file
+ * @param string $type
+ * @param integer $lvl
+ * @param array $opts
+ *
+ * @return bool
+ */
+function search_pagename(&$data,$base,$file,$type,$lvl,$opts){
+    //we do nothing with directories
+    if($type == 'd') return true;
+    //only search txt files
+    if(substr($file,-4) != '.txt') return true;
+
+    //simple stringmatching
+    if (!empty($opts['query'])){
+        if(strpos($file,$opts['query']) !== false){
+            //check ACL
+            $id = pathID($file);
+            if(auth_quickaclcheck($id) < AUTH_READ){
+                return false;
+            }
+            $data[]['id'] = $id;
+        }
+    }
+    return true;
+}
+
+/**
+ * Just lists all documents
+ *
+ * $opts['depth']   recursion level, 0 for all
+ * $opts['hash']    do md5 sum of content?
+ * $opts['skipacl'] list everything regardless of ACL
+ *
+ * @author  Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param array $data
+ * @param string $base
+ * @param string $file
+ * @param string $type
+ * @param integer $lvl
+ * @param array $opts
+ *
+ * @return bool
+ */
+function search_allpages(&$data,$base,$file,$type,$lvl,$opts){
+    if(isset($opts['depth']) && $opts['depth']){
+        $parts = explode('/',ltrim($file,'/'));
+        if(($type == 'd' && count($parts) >= $opts['depth'])
+          || ($type != 'd' && count($parts) > $opts['depth'])){
+            return false; // depth reached
+        }
+    }
+
+    //we do nothing with directories
+    if($type == 'd'){
+        return true;
+    }
+
+    //only search txt files
+    if(substr($file,-4) != '.txt') return true;
+
+    $item = array();
+    $item['id']   = pathID($file);
+    if(isset($opts['skipacl']) && !$opts['skipacl'] && auth_quickaclcheck($item['id']) < AUTH_READ){
+        return false;
+    }
+
+    $item['rev']   = filemtime($base.'/'.$file);
+    $item['mtime'] = $item['rev'];
+    $item['size']  = filesize($base.'/'.$file);
+    if(!empty($opts['hash'])){
+        $item['hash'] = md5(trim(rawWiki($item['id'])));
+    }
+
+    $data[] = $item;
+    return true;
+}
+
+/* ------------- helper functions below -------------- */
+
+/**
+ * fulltext sort
+ *
+ * Callback sort function for use with usort to sort the data
+ * structure created by search_fulltext. Sorts descending by count
+ *
+ * @author  Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param array $a
+ * @param array $b
+ *
+ * @return int
+ */
+function sort_search_fulltext($a,$b){
+    if($a['count'] > $b['count']){
+        return -1;
+    }elseif($a['count'] < $b['count']){
+        return 1;
+    }else{
+        return strcmp($a['id'],$b['id']);
+    }
+}
+
+/**
+ * translates a document path to an ID
+ *
+ * @author  Andreas Gohr <andi@splitbrain.org>
+ * @todo    move to pageutils
+ *
+ * @param string $path
+ * @param bool $keeptxt
+ *
+ * @return mixed|string
+ */
+function pathID($path,$keeptxt=false){
+    $id = utf8_decodeFN($path);
+    $id = str_replace('/',':',$id);
+    if(!$keeptxt) $id = preg_replace('#\.txt$#','',$id);
+    $id = trim($id, ':');
+    return $id;
+}
+
+
+/**
+ * This is a very universal callback for the search() function, replacing
+ * many of the former individual functions at the cost of a more complex
+ * setup.
+ *
+ * How the function behaves, depends on the options passed in the $opts
+ * array, where the following settings can be used.
+ *
+ * depth      int     recursion depth. 0 for unlimited                       (default: 0)
+ * keeptxt    bool    keep .txt extension for IDs                            (default: false)
+ * listfiles  bool    include files in listing                               (default: false)
+ * listdirs   bool    include namespaces in listing                          (default: false)
+ * pagesonly  bool    restrict files to pages                                (default: false)
+ * skipacl    bool    do not check for READ permission                       (default: false)
+ * sneakyacl  bool    don't recurse into nonreadable dirs                    (default: false)
+ * hash       bool    create MD5 hash for files                              (default: false)
+ * meta       bool    return file metadata                                   (default: false)
+ * filematch  string  match files against this regexp                        (default: '', so accept everything)
+ * idmatch    string  match full ID against this regexp                      (default: '', so accept everything)
+ * dirmatch   string  match directory against this regexp when adding        (default: '', so accept everything)
+ * nsmatch    string  match namespace against this regexp when adding        (default: '', so accept everything)
+ * recmatch   string  match directory against this regexp when recursing     (default: '', so accept everything)
+ * showmsg    bool    warn about non-ID files                                (default: false)
+ * showhidden bool    show hidden files(e.g. by hidepages config) too        (default: false)
+ * firsthead  bool    return first heading for pages                         (default: false)
+ *
+ * @param array &$data  - Reference to the result data structure
+ * @param string $base  - Base usually $conf['datadir']
+ * @param string $file  - current file or directory relative to $base
+ * @param string $type  - Type either 'd' for directory or 'f' for file
+ * @param int    $lvl   - Current recursion depht
+ * @param array  $opts  - option array as given to search()
+ * @return bool if this directory should be traversed (true) or not (false)
+ *              return value is ignored for files
+ *
+ * @author Andreas Gohr <gohr@cosmocode.de>
+ */
+function search_universal(&$data,$base,$file,$type,$lvl,$opts){
+    $item   = array();
+    $return = true;
+
+    // get ID and check if it is a valid one
+    $item['id'] = pathID($file,($type == 'd' || !empty($opts['keeptxt'])));
+    if($item['id'] != cleanID($item['id'])){
+        if(!empty($opts['showmsg'])){
+            msg(hsc($item['id']).' is not a valid file name for DokuWiki - skipped',-1);
+        }
+        return false; // skip non-valid files
+    }
+    $item['ns']  = getNS($item['id']);
+
+    if($type == 'd') {
+        // decide if to recursion into this directory is wanted
+        if(empty($opts['depth'])){
+            $return = true; // recurse forever
+        }else{
+            $depth = substr_count($file,'/');
+            if($depth >= $opts['depth']){
+                $return = false; // depth reached
+            }else{
+                $return = true;
+            }
+        }
+
+        if ($return) {
+            $match = empty($opts['recmatch']) || preg_match('/'.$opts['recmatch'].'/',$file);
+            if (!$match) {
+                return false; // doesn't match
+            }
+        }
+    }
+
+    // check ACL
+    if(empty($opts['skipacl'])){
+        if($type == 'd'){
+            $item['perm'] = auth_quickaclcheck($item['id'].':*');
+        }else{
+            $item['perm'] = auth_quickaclcheck($item['id']); //FIXME check namespace for media files
+        }
+    }else{
+        $item['perm'] = AUTH_DELETE;
+    }
+
+    // are we done here maybe?
+    if($type == 'd'){
+        if(empty($opts['listdirs'])) return $return;
+        if(empty($opts['skipacl']) && !empty($opts['sneakyacl']) && $item['perm'] < AUTH_READ) return false; //neither list nor recurse
+        if(!empty($opts['dirmatch']) && !preg_match('/'.$opts['dirmatch'].'/',$file)) return $return;
+        if(!empty($opts['nsmatch']) && !preg_match('/'.$opts['nsmatch'].'/',$item['ns'])) return $return;
+    }else{
+        if(empty($opts['listfiles'])) return $return;
+        if(empty($opts['skipacl']) && $item['perm'] < AUTH_READ) return $return;
+        if(!empty($opts['pagesonly']) && (substr($file,-4) != '.txt')) return $return;
+        if(empty($opts['showhidden']) && isHiddenPage($item['id'])) return $return;
+        if(!empty($opts['filematch']) && !preg_match('/'.$opts['filematch'].'/',$file)) return $return;
+        if(!empty($opts['idmatch']) && !preg_match('/'.$opts['idmatch'].'/',$item['id'])) return $return;
+    }
+
+    // still here? prepare the item
+    $item['type']  = $type;
+    $item['level'] = $lvl;
+    $item['open']  = $return;
+
+    if(!empty($opts['meta'])){
+        $item['file']       = utf8_basename($file);
+        $item['size']       = filesize($base.'/'.$file);
+        $item['mtime']      = filemtime($base.'/'.$file);
+        $item['rev']        = $item['mtime'];
+        $item['writable']   = is_writable($base.'/'.$file);
+        $item['executable'] = is_executable($base.'/'.$file);
+    }
+
+    if($type == 'f'){
+        if(!empty($opts['hash'])) $item['hash'] = md5(io_readFile($base.'/'.$file,false));
+        if(!empty($opts['firsthead'])) $item['title'] = p_get_first_heading($item['id'],METADATA_DONT_RENDER);
+    }
+
+    // finally add the item
+    $data[] = $item;
+    return $return;
+}
+
+//Setup VIM: ex: et ts=4 :
diff --git a/wiki/inc/subscription.php b/wiki/inc/subscription.php
new file mode 100644
index 0000000..74bec65
--- /dev/null
+++ b/wiki/inc/subscription.php
@@ -0,0 +1,693 @@
+<?php
+/**
+ * Class for handling (email) subscriptions
+ *
+ * @author  Adrian Lang <lang@cosmocode.de>
+ * @author  Andreas Gohr <andi@splitbrain.org>
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ */
+class Subscription {
+
+    /**
+     * Check if subscription system is enabled
+     *
+     * @return bool
+     */
+    public function isenabled() {
+        return actionOK('subscribe');
+    }
+
+    /**
+     * Return the subscription meta file for the given ID
+     *
+     * @author Adrian Lang <lang@cosmocode.de>
+     *
+     * @param string $id The target page or namespace, specified by id; Namespaces
+     *                   are identified by appending a colon.
+     * @return string
+     */
+    protected function file($id) {
+        $meta_fname = '.mlist';
+        if((substr($id, -1, 1) === ':')) {
+            $meta_froot = getNS($id);
+            $meta_fname = '/'.$meta_fname;
+        } else {
+            $meta_froot = $id;
+        }
+        return metaFN((string) $meta_froot, $meta_fname);
+    }
+
+    /**
+     * Lock subscription info
+     *
+     * We don't use io_lock() her because we do not wait for the lock and use a larger stale time
+     *
+     * @author Adrian Lang <lang@cosmocode.de>
+     * @param string $id The target page or namespace, specified by id; Namespaces
+     *                   are identified by appending a colon.
+     * @return bool true, if you got a succesful lock
+     */
+    protected function lock($id) {
+        global $conf;
+
+        $lock = $conf['lockdir'].'/_subscr_'.md5($id).'.lock';
+
+        if(is_dir($lock) && time() - @filemtime($lock) > 60 * 5) {
+            // looks like a stale lock - remove it
+            @rmdir($lock);
+        }
+
+        // try creating the lock directory
+        if(!@mkdir($lock, $conf['dmode'])) {
+            return false;
+        }
+
+        if(!empty($conf['dperm'])) chmod($lock, $conf['dperm']);
+        return true;
+    }
+
+    /**
+     * Unlock subscription info
+     *
+     * @author Adrian Lang <lang@cosmocode.de>
+     * @param string $id The target page or namespace, specified by id; Namespaces
+     *                   are identified by appending a colon.
+     * @return bool
+     */
+    protected function unlock($id) {
+        global $conf;
+        $lock = $conf['lockdir'].'/_subscr_'.md5($id).'.lock';
+        return @rmdir($lock);
+    }
+
+    /**
+     * Construct a regular expression for parsing a subscription definition line
+     *
+     * @author Andreas Gohr <andi@splitbrain.org>
+     *
+     * @param string|array $user
+     * @param string|array $style
+     * @param string|array $data
+     * @return string complete regexp including delimiters
+     * @throws Exception when no data is passed
+     */
+    protected function buildregex($user = null, $style = null, $data = null) {
+        // always work with arrays
+        $user = (array) $user;
+        $style = (array) $style;
+        $data = (array) $data;
+
+        // clean
+        $user = array_filter(array_map('trim', $user));
+        $style = array_filter(array_map('trim', $style));
+        $data = array_filter(array_map('trim', $data));
+
+        // user names are encoded
+        $user = array_map('auth_nameencode', $user);
+
+        // quote
+        $user = array_map('preg_quote_cb', $user);
+        $style = array_map('preg_quote_cb', $style);
+        $data = array_map('preg_quote_cb', $data);
+
+        // join
+        $user = join('|', $user);
+        $style = join('|', $style);
+        $data = join('|', $data);
+
+        // any data at all?
+        if($user.$style.$data === '') throw new Exception('no data passed');
+
+        // replace empty values, set which ones are optional
+        $sopt = '';
+        $dopt = '';
+        if($user === '') {
+            $user = '\S+';
+        }
+        if($style === '') {
+            $style = '\S+';
+            $sopt = '?';
+        }
+        if($data === '') {
+            $data = '\S+';
+            $dopt = '?';
+        }
+
+        // assemble
+        return "/^($user)(?:\\s+($style))$sopt(?:\\s+($data))$dopt$/";
+    }
+
+    /**
+     * Recursively search for matching subscriptions
+     *
+     * This function searches all relevant subscription files for a page or
+     * namespace.
+     *
+     * @author Adrian Lang <lang@cosmocode.de>
+     *
+     * @param string         $page The target object’s (namespace or page) id
+     * @param string|array   $user
+     * @param string|array   $style
+     * @param string|array   $data
+     * @return array
+     */
+    public function subscribers($page, $user = null, $style = null, $data = null) {
+        if(!$this->isenabled()) return array();
+
+        // Construct list of files which may contain relevant subscriptions.
+        $files = array(':' => $this->file(':'));
+        do {
+            $files[$page] = $this->file($page);
+            $page = getNS(rtrim($page, ':')).':';
+        } while($page !== ':');
+
+        $re = $this->buildregex($user, $style, $data);
+
+        // Handle files.
+        $result = array();
+        foreach($files as $target => $file) {
+            if(!file_exists($file)) continue;
+
+            $lines = file($file);
+            foreach($lines as $line) {
+                // fix old style subscription files
+                if(strpos($line, ' ') === false) $line = trim($line)." every\n";
+
+                // check for matching entries
+                if(!preg_match($re, $line, $m)) continue;
+
+                $u = rawurldecode($m[1]); // decode the user name
+                if(!isset($result[$target])) $result[$target] = array();
+                $result[$target][$u] = array($m[2], $m[3]); // add to result
+            }
+        }
+        return array_reverse($result);
+    }
+
+    /**
+     * Adds a new subscription for the given page or namespace
+     *
+     * This will automatically overwrite any existent subscription for the given user on this
+     * *exact* page or namespace. It will *not* modify any subscription that may exist in higher namespaces.
+     *
+     * @param string $id The target page or namespace, specified by id; Namespaces
+     *                   are identified by appending a colon.
+     * @param string $user
+     * @param string $style
+     * @param string $data
+     * @throws Exception when user or style is empty
+     * @return bool
+     */
+    public function add($id, $user, $style, $data = '') {
+        if(!$this->isenabled()) return false;
+
+        // delete any existing subscription
+        $this->remove($id, $user);
+
+        $user  = auth_nameencode(trim($user));
+        $style = trim($style);
+        $data  = trim($data);
+
+        if(!$user) throw new Exception('no subscription user given');
+        if(!$style) throw new Exception('no subscription style given');
+        if(!$data) $data = time(); //always add current time for new subscriptions
+
+        $line = "$user $style $data\n";
+        $file = $this->file($id);
+        return io_saveFile($file, $line, true);
+    }
+
+    /**
+     * Removes a subscription for the given page or namespace
+     *
+     * This removes all subscriptions matching the given criteria on the given page or
+     * namespace. It will *not* modify any subscriptions that may exist in higher
+     * namespaces.
+     *
+     * @param string         $id   The target object’s (namespace or page) id
+     * @param string|array   $user
+     * @param string|array   $style
+     * @param string|array   $data
+     * @return bool
+     */
+    public function remove($id, $user = null, $style = null, $data = null) {
+        if(!$this->isenabled()) return false;
+
+        $file = $this->file($id);
+        if(!file_exists($file)) return true;
+
+        $re = $this->buildregex($user, $style, $data);
+        return io_deleteFromFile($file, $re, true);
+    }
+
+    /**
+     * Get data for $INFO['subscribed']
+     *
+     * $INFO['subscribed'] is either false if no subscription for the current page
+     * and user is in effect. Else it contains an array of arrays with the fields
+     * “target”, “style”, and optionally “data”.
+     *
+     * @param string $id  Page ID, defaults to global $ID
+     * @param string $user User, defaults to $_SERVER['REMOTE_USER']
+     * @return array
+     * @author Adrian Lang <lang@cosmocode.de>
+     */
+    function user_subscription($id = '', $user = '') {
+        if(!$this->isenabled()) return false;
+
+        global $ID;
+        /** @var Input $INPUT */
+        global $INPUT;
+        if(!$id) $id = $ID;
+        if(!$user) $user = $INPUT->server->str('REMOTE_USER');
+
+        $subs = $this->subscribers($id, $user);
+        if(!count($subs)) return false;
+
+        $result = array();
+        foreach($subs as $target => $info) {
+            $result[] = array(
+                'target' => $target,
+                'style' => $info[$user][0],
+                'data' => $info[$user][1]
+            );
+        }
+
+        return $result;
+    }
+
+    /**
+     * Send digest and list subscriptions
+     *
+     * This sends mails to all subscribers that have a subscription for namespaces above
+     * the given page if the needed $conf['subscribe_time'] has passed already.
+     *
+     * This function is called form lib/exe/indexer.php
+     *
+     * @param string $page
+     * @return int number of sent mails
+     */
+    public function send_bulk($page) {
+        if(!$this->isenabled()) return 0;
+
+        /** @var DokuWiki_Auth_Plugin $auth */
+        global $auth;
+        global $conf;
+        global $USERINFO;
+        /** @var Input $INPUT */
+        global $INPUT;
+        $count = 0;
+
+        $subscriptions = $this->subscribers($page, null, array('digest', 'list'));
+
+        // remember current user info
+        $olduinfo = $USERINFO;
+        $olduser = $INPUT->server->str('REMOTE_USER');
+
+        foreach($subscriptions as $target => $users) {
+            if(!$this->lock($target)) continue;
+
+            foreach($users as $user => $info) {
+                list($style, $lastupdate) = $info;
+
+                $lastupdate = (int) $lastupdate;
+                if($lastupdate + $conf['subscribe_time'] > time()) {
+                    // Less than the configured time period passed since last
+                    // update.
+                    continue;
+                }
+
+                // Work as the user to make sure ACLs apply correctly
+                $USERINFO = $auth->getUserData($user);
+                $INPUT->server->set('REMOTE_USER',$user);
+                if($USERINFO === false) continue;
+                if(!$USERINFO['mail']) continue;
+
+                if(substr($target, -1, 1) === ':') {
+                    // subscription target is a namespace, get all changes within
+                    $changes = getRecentsSince($lastupdate, null, getNS($target));
+                } else {
+                    // single page subscription, check ACL ourselves
+                    if(auth_quickaclcheck($target) < AUTH_READ) continue;
+                    $meta = p_get_metadata($target);
+                    $changes = array($meta['last_change']);
+                }
+
+                // Filter out pages only changed in small and own edits
+                $change_ids = array();
+                foreach($changes as $rev) {
+                    $n = 0;
+                    while(!is_null($rev) && $rev['date'] >= $lastupdate &&
+                        ($INPUT->server->str('REMOTE_USER') === $rev['user'] ||
+                            $rev['type'] === DOKU_CHANGE_TYPE_MINOR_EDIT)) {
+                        $pagelog = new PageChangeLog($rev['id']);
+                        $rev = $pagelog->getRevisions($n++, 1);
+                        $rev = (count($rev) > 0) ? $rev[0] : null;
+                    }
+
+                    if(!is_null($rev) && $rev['date'] >= $lastupdate) {
+                        // Some change was not a minor one and not by myself
+                        $change_ids[] = $rev['id'];
+                    }
+                }
+
+                // send it
+                if($style === 'digest') {
+                    foreach($change_ids as $change_id) {
+                        $this->send_digest(
+                            $USERINFO['mail'], $change_id,
+                            $lastupdate
+                        );
+                        $count++;
+                    }
+                } elseif($style === 'list') {
+                    $this->send_list($USERINFO['mail'], $change_ids, $target);
+                    $count++;
+                }
+                // TODO: Handle duplicate subscriptions.
+
+                // Update notification time.
+                $this->add($target, $user, $style, time());
+            }
+            $this->unlock($target);
+        }
+
+        // restore current user info
+        $USERINFO = $olduinfo;
+        $INPUT->server->set('REMOTE_USER',$olduser);
+        return $count;
+    }
+
+    /**
+     * Send the diff for some page change
+     *
+     * @param string   $subscriber_mail The target mail address
+     * @param string   $template        Mail template ('subscr_digest', 'subscr_single', 'mailtext', ...)
+     * @param string   $id              Page for which the notification is
+     * @param int|null $rev             Old revision if any
+     * @param string   $summary         Change summary if any
+     * @return bool                     true if successfully sent
+     */
+    public function send_diff($subscriber_mail, $template, $id, $rev = null, $summary = '') {
+        global $DIFF_INLINESTYLES;
+
+        // prepare replacements (keys not set in hrep will be taken from trep)
+        $trep = array(
+            'PAGE' => $id,
+            'NEWPAGE' => wl($id, '', true, '&'),
+            'SUMMARY' => $summary,
+            'SUBSCRIBE' => wl($id, array('do' => 'subscribe'), true, '&')
+        );
+        $hrep = array();
+
+        if($rev) {
+            $subject = 'changed';
+            $trep['OLDPAGE'] = wl($id, "rev=$rev", true, '&');
+
+            $old_content = rawWiki($id, $rev);
+            $new_content = rawWiki($id);
+
+            $df = new Diff(explode("\n", $old_content),
+                           explode("\n", $new_content));
+            $dformat = new UnifiedDiffFormatter();
+            $tdiff = $dformat->format($df);
+
+            $DIFF_INLINESTYLES = true;
+            $df = new Diff(explode("\n", $old_content),
+                           explode("\n", $new_content));
+            $dformat = new InlineDiffFormatter();
+            $hdiff = $dformat->format($df);
+            $hdiff = '<table>'.$hdiff.'</table>';
+            $DIFF_INLINESTYLES = false;
+        } else {
+            $subject = 'newpage';
+            $trep['OLDPAGE'] = '---';
+            $tdiff = rawWiki($id);
+            $hdiff = nl2br(hsc($tdiff));
+        }
+
+        $trep['DIFF'] = $tdiff;
+        $hrep['DIFF'] = $hdiff;
+
+        $headers = array('Message-Id' => $this->getMessageID($id));
+        if ($rev) {
+            $headers['In-Reply-To'] =  $this->getMessageID($id, $rev);
+        }
+
+        return $this->send(
+            $subscriber_mail, $subject, $id,
+            $template, $trep, $hrep, $headers
+        );
+    }
+
+    /**
+     * Send the diff for some media change
+     *
+     * @fixme this should embed thumbnails of images in HTML version
+     *
+     * @param string   $subscriber_mail The target mail address
+     * @param string   $template        Mail template ('uploadmail', ...)
+     * @param string   $id              Media file for which the notification is
+     * @param int|bool $rev             Old revision if any
+     */
+    public function send_media_diff($subscriber_mail, $template, $id, $rev = false) {
+        global $conf;
+
+        $file = mediaFN($id);
+        list($mime, /* $ext */) = mimetype($id);
+
+        $trep = array(
+            'MIME'  => $mime,
+            'MEDIA' => ml($id,'',true,'&',true),
+            'SIZE'  => filesize_h(filesize($file)),
+        );
+
+        if ($rev && $conf['mediarevisions']) {
+            $trep['OLD'] = ml($id, "rev=$rev", true, '&', true);
+        } else {
+            $trep['OLD'] = '---';
+        }
+
+        $headers = array('Message-Id' => $this->getMessageID($id, @filemtime($file)));
+        if ($rev) {
+            $headers['In-Reply-To'] =  $this->getMessageID($id, $rev);
+        }
+
+        $this->send($subscriber_mail, 'upload', $id, $template, $trep, null, $headers);
+
+    }
+
+    /**
+     * Send a notify mail on new registration
+     *
+     * @author Andreas Gohr <andi@splitbrain.org>
+     *
+     * @param string $login    login name of the new user
+     * @param string $fullname full name of the new user
+     * @param string $email    email address of the new user
+     * @return bool true if a mail was sent
+     */
+    public function send_register($login, $fullname, $email) {
+        global $conf;
+        if(empty($conf['registernotify'])) return false;
+
+        $trep = array(
+            'NEWUSER' => $login,
+            'NEWNAME' => $fullname,
+            'NEWEMAIL' => $email,
+        );
+
+        return $this->send(
+            $conf['registernotify'],
+            'new_user',
+            $login,
+            'registermail',
+            $trep
+        );
+    }
+
+    /**
+     * Send a digest mail
+     *
+     * Sends a digest mail showing a bunch of changes of a single page. Basically the same as send_diff()
+     * but determines the last known revision first
+     *
+     * @author Adrian Lang <lang@cosmocode.de>
+     *
+     * @param string $subscriber_mail The target mail address
+     * @param string $id              The ID
+     * @param int    $lastupdate      Time of the last notification
+     * @return bool
+     */
+    protected function send_digest($subscriber_mail, $id, $lastupdate) {
+        $pagelog = new PageChangeLog($id);
+        $n = 0;
+        do {
+            $rev = $pagelog->getRevisions($n++, 1);
+            $rev = (count($rev) > 0) ? $rev[0] : null;
+        } while(!is_null($rev) && $rev > $lastupdate);
+
+        return $this->send_diff(
+            $subscriber_mail,
+            'subscr_digest',
+            $id, $rev
+        );
+    }
+
+    /**
+     * Send a list mail
+     *
+     * Sends a list mail showing a list of changed pages.
+     *
+     * @author Adrian Lang <lang@cosmocode.de>
+     *
+     * @param string $subscriber_mail The target mail address
+     * @param array  $ids             Array of ids
+     * @param string $ns_id           The id of the namespace
+     * @return bool true if a mail was sent
+     */
+    protected function send_list($subscriber_mail, $ids, $ns_id) {
+        if(count($ids) === 0) return false;
+
+        $tlist = '';
+        $hlist = '<ul>';
+        foreach($ids as $id) {
+            $link = wl($id, array(), true);
+            $tlist .= '* '.$link.NL;
+            $hlist .= '<li><a href="'.$link.'">'.hsc($id).'</a></li>'.NL;
+        }
+        $hlist .= '</ul>';
+
+        $id = prettyprint_id($ns_id);
+        $trep = array(
+            'DIFF' => rtrim($tlist),
+            'PAGE' => $id,
+            'SUBSCRIBE' => wl($id, array('do' => 'subscribe'), true, '&')
+        );
+        $hrep = array(
+            'DIFF' => $hlist
+        );
+
+        return $this->send(
+            $subscriber_mail,
+            'subscribe_list',
+            $ns_id,
+            'subscr_list', $trep, $hrep
+        );
+    }
+
+    /**
+     * Helper function for sending a mail
+     *
+     * @author Adrian Lang <lang@cosmocode.de>
+     *
+     * @param string $subscriber_mail The target mail address
+     * @param string $subject         The lang id of the mail subject (without the
+     *                                prefix “mail_”)
+     * @param string $context         The context of this mail, eg. page or namespace id
+     * @param string $template        The name of the mail template
+     * @param array  $trep            Predefined parameters used to parse the
+     *                                template (in text format)
+     * @param array  $hrep            Predefined parameters used to parse the
+     *                                template (in HTML format), null to default to $trep
+     * @param array  $headers         Additional mail headers in the form 'name' => 'value'
+     * @return bool
+     */
+    protected function send($subscriber_mail, $subject, $context, $template, $trep, $hrep = null, $headers = array()) {
+        global $lang;
+        global $conf;
+
+        $text = rawLocale($template);
+        $subject = $lang['mail_'.$subject].' '.$context;
+        $mail = new Mailer();
+        $mail->bcc($subscriber_mail);
+        $mail->subject($subject);
+        $mail->setBody($text, $trep, $hrep);
+        if(in_array($template, array('subscr_list', 'subscr_digest'))){
+            $mail->from($conf['mailfromnobody']);
+        }
+        if(isset($trep['SUBSCRIBE'])) {
+            $mail->setHeader('List-Unsubscribe', '<'.$trep['SUBSCRIBE'].'>', false);
+        }
+
+        foreach ($headers as $header => $value) {
+            $mail->setHeader($header, $value);
+        }
+
+        return $mail->send();
+    }
+
+    /**
+     * Get a valid message id for a certain $id and revision (or the current revision)
+     *
+     * @param string $id  The id of the page (or media file) the message id should be for
+     * @param string $rev The revision of the page, set to the current revision of the page $id if not set
+     * @return string
+     */
+    protected function getMessageID($id, $rev = null) {
+        static $listid = null;
+        if (is_null($listid)) {
+            $server = parse_url(DOKU_URL, PHP_URL_HOST);
+            $listid = join('.', array_reverse(explode('/', DOKU_BASE))).$server;
+            $listid = urlencode($listid);
+            $listid = strtolower(trim($listid, '.'));
+        }
+
+        if (is_null($rev)) {
+            $rev = @filemtime(wikiFN($id));
+        }
+
+        return "<$id?rev=$rev@$listid>";
+    }
+
+    /**
+     * Default callback for COMMON_NOTIFY_ADDRESSLIST
+     *
+     * Aggregates all email addresses of user who have subscribed the given page with 'every' style
+     *
+     * @author Steven Danz <steven-danz@kc.rr.com>
+     * @author Adrian Lang <lang@cosmocode.de>
+     *
+     * @todo move the whole functionality into this class, trigger SUBSCRIPTION_NOTIFY_ADDRESSLIST instead,
+     *       use an array for the addresses within it
+     *
+     * @param array &$data Containing the entries:
+     *    - $id (the page id),
+     *    - $self (whether the author should be notified,
+     *    - $addresslist (current email address list)
+     *    - $replacements (array of additional string substitutions, @KEY@ to be replaced by value)
+     */
+    public function notifyaddresses(&$data) {
+        if(!$this->isenabled()) return;
+
+        /** @var DokuWiki_Auth_Plugin $auth */
+        global $auth;
+        global $conf;
+        /** @var Input $INPUT */
+        global $INPUT;
+
+        $id = $data['id'];
+        $self = $data['self'];
+        $addresslist = $data['addresslist'];
+
+        $subscriptions = $this->subscribers($id, null, 'every');
+
+        $result = array();
+        foreach($subscriptions as $target => $users) {
+            foreach($users as $user => $info) {
+                $userinfo = $auth->getUserData($user);
+                if($userinfo === false) continue;
+                if(!$userinfo['mail']) continue;
+                if(!$self && $user == $INPUT->server->str('REMOTE_USER')) continue; //skip our own changes
+
+                $level = auth_aclcheck($id, $user, $userinfo['grps']);
+                if($level >= AUTH_READ) {
+                    if(strcasecmp($userinfo['mail'], $conf['notify']) != 0) { //skip user who get notified elsewhere
+                        $result[$user] = $userinfo['mail'];
+                    }
+                }
+            }
+        }
+        $data['addresslist'] = trim($addresslist.','.implode(',', $result), ',');
+    }
+}
diff --git a/wiki/inc/template.php b/wiki/inc/template.php
new file mode 100644
index 0000000..b4acae1
--- /dev/null
+++ b/wiki/inc/template.php
@@ -0,0 +1,1873 @@
+<?php
+/**
+ * DokuWiki template functions
+ *
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author     Andreas Gohr <andi@splitbrain.org>
+ */
+
+if(!defined('DOKU_INC')) die('meh.');
+
+/**
+ * Access a template file
+ *
+ * Returns the path to the given file inside the current template, uses
+ * default template if the custom version doesn't exist.
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @param string $file
+ * @return string
+ */
+function template($file) {
+    global $conf;
+
+    if(@is_readable(DOKU_INC.'lib/tpl/'.$conf['template'].'/'.$file))
+        return DOKU_INC.'lib/tpl/'.$conf['template'].'/'.$file;
+
+    return DOKU_INC.'lib/tpl/dokuwiki/'.$file;
+}
+
+/**
+ * Convenience function to access template dir from local FS
+ *
+ * This replaces the deprecated DOKU_TPLINC constant
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @param string $tpl The template to use, default to current one
+ * @return string
+ */
+function tpl_incdir($tpl='') {
+    global $conf;
+    if(!$tpl) $tpl = $conf['template'];
+    return DOKU_INC.'lib/tpl/'.$tpl.'/';
+}
+
+/**
+ * Convenience function to access template dir from web
+ *
+ * This replaces the deprecated DOKU_TPL constant
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @param string $tpl The template to use, default to current one
+ * @return string
+ */
+function tpl_basedir($tpl='') {
+    global $conf;
+    if(!$tpl) $tpl = $conf['template'];
+    return DOKU_BASE.'lib/tpl/'.$tpl.'/';
+}
+
+/**
+ * Print the content
+ *
+ * This function is used for printing all the usual content
+ * (defined by the global $ACT var) by calling the appropriate
+ * outputfunction(s) from html.php
+ *
+ * Everything that doesn't use the main template file isn't
+ * handled by this function. ACL stuff is not done here either.
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @triggers TPL_ACT_RENDER
+ * @triggers TPL_CONTENT_DISPLAY
+ * @param bool $prependTOC should the TOC be displayed here?
+ * @return bool true if any output
+ */
+function tpl_content($prependTOC = true) {
+    global $ACT;
+    global $INFO;
+    $INFO['prependTOC'] = $prependTOC;
+
+    ob_start();
+    trigger_event('TPL_ACT_RENDER', $ACT, 'tpl_content_core');
+    $html_output = ob_get_clean();
+    trigger_event('TPL_CONTENT_DISPLAY', $html_output, 'ptln');
+
+    return !empty($html_output);
+}
+
+/**
+ * Default Action of TPL_ACT_RENDER
+ *
+ * @return bool
+ */
+function tpl_content_core() {
+    $router = \dokuwiki\ActionRouter::getInstance();
+    try {
+        $router->getAction()->tplContent();
+    } catch(\dokuwiki\Action\Exception\FatalException $e) {
+        // there was no content for the action
+        msg(hsc($e->getMessage()), -1);
+        return false;
+    }
+    return true;
+}
+
+/**
+ * Places the TOC where the function is called
+ *
+ * If you use this you most probably want to call tpl_content with
+ * a false argument
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param bool $return Should the TOC be returned instead to be printed?
+ * @return string
+ */
+function tpl_toc($return = false) {
+    global $TOC;
+    global $ACT;
+    global $ID;
+    global $REV;
+    global $INFO;
+    global $conf;
+    global $INPUT;
+    $toc = array();
+
+    if(is_array($TOC)) {
+        // if a TOC was prepared in global scope, always use it
+        $toc = $TOC;
+    } elseif(($ACT == 'show' || substr($ACT, 0, 6) == 'export') && !$REV && $INFO['exists']) {
+        // get TOC from metadata, render if neccessary
+        $meta = p_get_metadata($ID, '', METADATA_RENDER_USING_CACHE);
+        if(isset($meta['internal']['toc'])) {
+            $tocok = $meta['internal']['toc'];
+        } else {
+            $tocok = true;
+        }
+        $toc = isset($meta['description']['tableofcontents']) ? $meta['description']['tableofcontents'] : null;
+        if(!$tocok || !is_array($toc) || !$conf['tocminheads'] || count($toc) < $conf['tocminheads']) {
+            $toc = array();
+        }
+    } elseif($ACT == 'admin') {
+        // try to load admin plugin TOC
+        /** @var $plugin DokuWiki_Admin_Plugin */
+        if ($plugin = plugin_getRequestAdminPlugin()) {
+            $toc = $plugin->getTOC();
+            $TOC = $toc; // avoid later rebuild
+        }
+    }
+
+    trigger_event('TPL_TOC_RENDER', $toc, null, false);
+    $html = html_TOC($toc);
+    if($return) return $html;
+    echo $html;
+    return '';
+}
+
+/**
+ * Handle the admin page contents
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @return bool
+ */
+function tpl_admin() {
+    global $INFO;
+    global $TOC;
+    global $INPUT;
+
+    $plugin = null;
+    $class  = $INPUT->str('page');
+    if(!empty($class)) {
+        $pluginlist = plugin_list('admin');
+
+        if(in_array($class, $pluginlist)) {
+            // attempt to load the plugin
+            /** @var $plugin DokuWiki_Admin_Plugin */
+            $plugin = plugin_load('admin', $class);
+        }
+    }
+
+    if($plugin !== null) {
+        if(!is_array($TOC)) $TOC = $plugin->getTOC(); //if TOC wasn't requested yet
+        if($INFO['prependTOC']) tpl_toc();
+        $plugin->html();
+    } else {
+        $admin = new dokuwiki\Ui\Admin();
+        $admin->show();
+    }
+    return true;
+}
+
+/**
+ * Print the correct HTML meta headers
+ *
+ * This has to go into the head section of your template.
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @triggers TPL_METAHEADER_OUTPUT
+ * @param  bool $alt Should feeds and alternative format links be added?
+ * @return bool
+ */
+function tpl_metaheaders($alt = true) {
+    global $ID;
+    global $REV;
+    global $INFO;
+    global $JSINFO;
+    global $ACT;
+    global $QUERY;
+    global $lang;
+    global $conf;
+    global $updateVersion;
+    /** @var Input $INPUT */
+    global $INPUT;
+
+    // prepare the head array
+    $head = array();
+
+    // prepare seed for js and css
+    $tseed   = $updateVersion;
+    $depends = getConfigFiles('main');
+    $depends[] = DOKU_CONF."tpl/".$conf['template']."/style.ini";
+    foreach($depends as $f) $tseed .= @filemtime($f);
+    $tseed   = md5($tseed);
+
+    // the usual stuff
+    $head['meta'][] = array('name'=> 'generator', 'content'=> 'DokuWiki');
+    if(actionOK('search')) {
+        $head['link'][] = array(
+            'rel' => 'search', 'type'=> 'application/opensearchdescription+xml',
+            'href'=> DOKU_BASE.'lib/exe/opensearch.php', 'title'=> $conf['title']
+        );
+    }
+
+    $head['link'][] = array('rel'=> 'start', 'href'=> DOKU_BASE);
+    if(actionOK('index')) {
+        $head['link'][] = array(
+            'rel'  => 'contents', 'href'=> wl($ID, 'do=index', false, '&'),
+            'title'=> $lang['btn_index']
+        );
+    }
+
+    if (actionOK('manifest')) {
+        $head['link'][] = array('rel'=> 'manifest', 'href'=> DOKU_BASE.'lib/exe/manifest.php');
+    }
+
+    $styleUtil = new \dokuwiki\StyleUtils();
+    $styleIni = $styleUtil->cssStyleini($conf['template']);
+    $replacements = $styleIni['replacements'];
+    if (!empty($replacements['__theme_color__'])) {
+        $head['meta'][] = array('name' => 'theme-color', 'content' => $replacements['__theme_color__']);
+    }
+
+    if($alt) {
+        if(actionOK('rss')) {
+            $head['link'][] = array(
+                'rel'  => 'alternate', 'type'=> 'application/rss+xml',
+                'title'=> $lang['btn_recent'], 'href'=> DOKU_BASE.'feed.php'
+            );
+            $head['link'][] = array(
+                'rel'  => 'alternate', 'type'=> 'application/rss+xml',
+                'title'=> $lang['currentns'],
+                'href' => DOKU_BASE.'feed.php?mode=list&ns='.$INFO['namespace']
+            );
+        }
+        if(($ACT == 'show' || $ACT == 'search') && $INFO['writable']) {
+            $head['link'][] = array(
+                'rel'  => 'edit',
+                'title'=> $lang['btn_edit'],
+                'href' => wl($ID, 'do=edit', false, '&')
+            );
+        }
+
+        if(actionOK('rss') && $ACT == 'search') {
+            $head['link'][] = array(
+                'rel'  => 'alternate', 'type'=> 'application/rss+xml',
+                'title'=> $lang['searchresult'],
+                'href' => DOKU_BASE.'feed.php?mode=search&q='.$QUERY
+            );
+        }
+
+        if(actionOK('export_xhtml')) {
+            $head['link'][] = array(
+                'rel' => 'alternate', 'type'=> 'text/html', 'title'=> $lang['plainhtml'],
+                'href'=> exportlink($ID, 'xhtml', '', false, '&')
+            );
+        }
+
+        if(actionOK('export_raw')) {
+            $head['link'][] = array(
+                'rel' => 'alternate', 'type'=> 'text/plain', 'title'=> $lang['wikimarkup'],
+                'href'=> exportlink($ID, 'raw', '', false, '&')
+            );
+        }
+    }
+
+    // setup robot tags apropriate for different modes
+    if(($ACT == 'show' || $ACT == 'export_xhtml') && !$REV) {
+        if($INFO['exists']) {
+            //delay indexing:
+            if((time() - $INFO['lastmod']) >= $conf['indexdelay'] && !isHiddenPage($ID) ) {
+                $head['meta'][] = array('name'=> 'robots', 'content'=> 'index,follow');
+            } else {
+                $head['meta'][] = array('name'=> 'robots', 'content'=> 'noindex,nofollow');
+            }
+            $canonicalUrl = wl($ID, '', true, '&');
+            if ($ID == $conf['start']) {
+                $canonicalUrl = DOKU_URL;
+            }
+            $head['link'][] = array('rel'=> 'canonical', 'href'=> $canonicalUrl);
+        } else {
+            $head['meta'][] = array('name'=> 'robots', 'content'=> 'noindex,follow');
+        }
+    } elseif(defined('DOKU_MEDIADETAIL')) {
+        $head['meta'][] = array('name'=> 'robots', 'content'=> 'index,follow');
+    } else {
+        $head['meta'][] = array('name'=> 'robots', 'content'=> 'noindex,nofollow');
+    }
+
+    // set metadata
+    if($ACT == 'show' || $ACT == 'export_xhtml') {
+        // keywords (explicit or implicit)
+        if(!empty($INFO['meta']['subject'])) {
+            $head['meta'][] = array('name'=> 'keywords', 'content'=> join(',', $INFO['meta']['subject']));
+        } else {
+            $head['meta'][] = array('name'=> 'keywords', 'content'=> str_replace(':', ',', $ID));
+        }
+    }
+
+    // load stylesheets
+    $head['link'][] = array(
+        'rel' => 'stylesheet', 'type'=> 'text/css',
+        'href'=> DOKU_BASE.'lib/exe/css.php?t='.rawurlencode($conf['template']).'&tseed='.$tseed
+    );
+
+    $script = "var NS='".$INFO['namespace']."';";
+    if($conf['useacl'] && $INPUT->server->str('REMOTE_USER')) {
+        $script .= "var SIG='".toolbar_signature()."';";
+    }
+    jsinfo();
+    $script .= 'var JSINFO = ' . json_encode($JSINFO).';';
+    $head['script'][] = array('type'=> 'text/javascript', '_data'=> $script);
+
+    // load jquery
+    $jquery = getCdnUrls();
+    foreach($jquery as $src) {
+        $head['script'][] = array(
+            'type' => 'text/javascript', 'charset' => 'utf-8', '_data' => '', 'src' => $src
+        );
+    }
+
+    // load our javascript dispatcher
+    $head['script'][] = array(
+        'type'=> 'text/javascript', 'charset'=> 'utf-8', '_data'=> '',
+        'src' => DOKU_BASE.'lib/exe/js.php'.'?t='.rawurlencode($conf['template']).'&tseed='.$tseed
+    );
+
+    // trigger event here
+    trigger_event('TPL_METAHEADER_OUTPUT', $head, '_tpl_metaheaders_action', true);
+    return true;
+}
+
+/**
+ * prints the array build by tpl_metaheaders
+ *
+ * $data is an array of different header tags. Each tag can have multiple
+ * instances. Attributes are given as key value pairs. Values will be HTML
+ * encoded automatically so they should be provided as is in the $data array.
+ *
+ * For tags having a body attribute specify the body data in the special
+ * attribute '_data'. This field will NOT BE ESCAPED automatically.
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param array $data
+ */
+function _tpl_metaheaders_action($data) {
+    foreach($data as $tag => $inst) {
+        if($tag == 'script') {
+            echo "<!--[if gte IE 9]><!-->\n"; // no scripts for old IE
+        }
+        foreach($inst as $attr) {
+            if ( empty($attr) ) { continue; }
+            echo '<', $tag, ' ', buildAttributes($attr);
+            if(isset($attr['_data']) || $tag == 'script') {
+                if($tag == 'script' && $attr['_data'])
+                    $attr['_data'] = "/*<![CDATA[*/".
+                        $attr['_data'].
+                        "\n/*!]]>*/";
+
+                echo '>', $attr['_data'], '</', $tag, '>';
+            } else {
+                echo '/>';
+            }
+            echo "\n";
+        }
+        if($tag == 'script') {
+            echo "<!--<![endif]-->\n";
+        }
+    }
+}
+
+/**
+ * Print a link
+ *
+ * Just builds a link.
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param string $url
+ * @param string $name
+ * @param string $more
+ * @param bool $return if true return the link html, otherwise print
+ * @return bool|string html of the link, or true if printed
+ */
+function tpl_link($url, $name, $more = '', $return = false) {
+    $out = '<a href="'.$url.'" ';
+    if($more) $out .= ' '.$more;
+    $out .= ">$name</a>";
+    if($return) return $out;
+    print $out;
+    return true;
+}
+
+/**
+ * Prints a link to a WikiPage
+ *
+ * Wrapper around html_wikilink
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param string      $id   page id
+ * @param string|null $name the name of the link
+ * @param bool        $return
+ * @return true|string
+ */
+function tpl_pagelink($id, $name = null, $return = false) {
+    $out = '<bdi>'.html_wikilink($id, $name).'</bdi>';
+    if($return) return $out;
+    print $out;
+    return true;
+}
+
+/**
+ * get the parent page
+ *
+ * Tries to find out which page is parent.
+ * returns false if none is available
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param string $id page id
+ * @return false|string
+ */
+function tpl_getparent($id) {
+    $parent = getNS($id).':';
+    resolve_pageid('', $parent, $exists);
+    if($parent == $id) {
+        $pos    = strrpos(getNS($id), ':');
+        $parent = substr($parent, 0, $pos).':';
+        resolve_pageid('', $parent, $exists);
+        if($parent == $id) return false;
+    }
+    return $parent;
+}
+
+/**
+ * Print one of the buttons
+ *
+ * @author Adrian Lang <mail@adrianlang.de>
+ * @see    tpl_get_action
+ *
+ * @param string $type
+ * @param bool $return
+ * @return bool|string html, or false if no data, true if printed
+ * @deprecated 2017-09-01 see devel:menus
+ */
+function tpl_button($type, $return = false) {
+    dbg_deprecated('see devel:menus');
+    $data = tpl_get_action($type);
+    if($data === false) {
+        return false;
+    } elseif(!is_array($data)) {
+        $out = sprintf($data, 'button');
+    } else {
+        /**
+         * @var string $accesskey
+         * @var string $id
+         * @var string $method
+         * @var array  $params
+         */
+        extract($data);
+        if($id === '#dokuwiki__top') {
+            $out = html_topbtn();
+        } else {
+            $out = html_btn($type, $id, $accesskey, $params, $method);
+        }
+    }
+    if($return) return $out;
+    echo $out;
+    return true;
+}
+
+/**
+ * Like the action buttons but links
+ *
+ * @author Adrian Lang <mail@adrianlang.de>
+ * @see    tpl_get_action
+ *
+ * @param string $type    action command
+ * @param string $pre     prefix of link
+ * @param string $suf     suffix of link
+ * @param string $inner   innerHML of link
+ * @param bool   $return  if true it returns html, otherwise prints
+ * @return bool|string html or false if no data, true if printed
+ * @deprecated 2017-09-01 see devel:menus
+ */
+function tpl_actionlink($type, $pre = '', $suf = '', $inner = '', $return = false) {
+    dbg_deprecated('see devel:menus');
+    global $lang;
+    $data = tpl_get_action($type);
+    if($data === false) {
+        return false;
+    } elseif(!is_array($data)) {
+        $out = sprintf($data, 'link');
+    } else {
+        /**
+         * @var string $accesskey
+         * @var string $id
+         * @var string $method
+         * @var bool   $nofollow
+         * @var array  $params
+         * @var string $replacement
+         */
+        extract($data);
+        if(strpos($id, '#') === 0) {
+            $linktarget = $id;
+        } else {
+            $linktarget = wl($id, $params);
+        }
+        $caption = $lang['btn_'.$type];
+        if(strpos($caption, '%s')){
+            $caption = sprintf($caption, $replacement);
+        }
+        $akey    = $addTitle = '';
+        if($accesskey) {
+            $akey     = 'accesskey="'.$accesskey.'" ';
+            $addTitle = ' ['.strtoupper($accesskey).']';
+        }
+        $rel = $nofollow ? 'rel="nofollow" ' : '';
+        $out = tpl_link(
+            $linktarget, $pre.(($inner) ? $inner : $caption).$suf,
+            'class="action '.$type.'" '.
+                $akey.$rel.
+                'title="'.hsc($caption).$addTitle.'"', true
+        );
+    }
+    if($return) return $out;
+    echo $out;
+    return true;
+}
+
+/**
+ * Check the actions and get data for buttons and links
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
+ * @author Adrian Lang <mail@adrianlang.de>
+ *
+ * @param string $type
+ * @return array|bool|string
+ * @deprecated 2017-09-01 see devel:menus
+ */
+function tpl_get_action($type) {
+    dbg_deprecated('see devel:menus');
+    if($type == 'history') $type = 'revisions';
+    if($type == 'subscription') $type = 'subscribe';
+    if($type == 'img_backto') $type = 'imgBackto';
+
+    $class = '\\dokuwiki\\Menu\\Item\\' . ucfirst($type);
+    if(class_exists($class)) {
+        try {
+            /** @var \dokuwiki\Menu\Item\AbstractItem $item */
+            $item = new $class;
+            $data = $item->getLegacyData();
+            $unknown = false;
+        } catch(\RuntimeException $ignored) {
+            return false;
+        }
+    } else {
+        global $ID;
+        $data = array(
+            'accesskey' => null,
+            'type' => $type,
+            'id' => $ID,
+            'method' => 'get',
+            'params' => array('do' => $type),
+            'nofollow' => true,
+            'replacement' => '',
+        );
+        $unknown = true;
+    }
+
+    $evt = new Doku_Event('TPL_ACTION_GET', $data);
+    if($evt->advise_before()) {
+        //handle unknown types
+        if($unknown) {
+            $data = '[unknown %s type]';
+        }
+    }
+    $evt->advise_after();
+    unset($evt);
+
+    return $data;
+}
+
+/**
+ * Wrapper around tpl_button() and tpl_actionlink()
+ *
+ * @author Anika Henke <anika@selfthinker.org>
+ *
+ * @param string        $type action command
+ * @param bool          $link link or form button?
+ * @param string|bool   $wrapper HTML element wrapper
+ * @param bool          $return return or print
+ * @param string        $pre prefix for links
+ * @param string        $suf suffix for links
+ * @param string        $inner inner HTML for links
+ * @return bool|string
+ * @deprecated 2017-09-01 see devel:menus
+ */
+function tpl_action($type, $link = false, $wrapper = false, $return = false, $pre = '', $suf = '', $inner = '') {
+    dbg_deprecated('see devel:menus');
+    $out = '';
+    if($link) {
+        $out .= tpl_actionlink($type, $pre, $suf, $inner, true);
+    } else {
+        $out .= tpl_button($type, true);
+    }
+    if($out && $wrapper) $out = "<$wrapper>$out</$wrapper>";
+
+    if($return) return $out;
+    print $out;
+    return $out ? true : false;
+}
+
+/**
+ * Print the search form
+ *
+ * If the first parameter is given a div with the ID 'qsearch_out' will
+ * be added which instructs the ajax pagequicksearch to kick in and place
+ * its output into this div. The second parameter controls the propritary
+ * attribute autocomplete. If set to false this attribute will be set with an
+ * value of "off" to instruct the browser to disable it's own built in
+ * autocompletion feature (MSIE and Firefox)
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param bool $ajax
+ * @param bool $autocomplete
+ * @return bool
+ */
+function tpl_searchform($ajax = true, $autocomplete = true) {
+    global $lang;
+    global $ACT;
+    global $QUERY;
+    global $ID;
+
+    // don't print the search form if search action has been disabled
+    if(!actionOK('search')) return false;
+
+    $searchForm = new dokuwiki\Form\Form([
+        'action' => wl(),
+        'method' => 'get',
+        'role' => 'search',
+        'class' => 'search',
+        'id' => 'dw__search',
+    ], true);
+    $searchForm->addTagOpen('div')->addClass('no');
+    $searchForm->setHiddenField('do', 'search');
+    $searchForm->setHiddenField('id', $ID);
+    $searchForm->addTextInput('q')
+        ->addClass('edit')
+        ->attrs([
+            'title' => '[F]',
+            'accesskey' => 'f',
+            'placeholder' => $lang['btn_search'],
+            'autocomplete' => $autocomplete ? 'on' : 'off',
+        ])
+        ->id('qsearch__in')
+        ->val($ACT === 'search' ? $QUERY : '')
+        ->useInput(false)
+    ;
+    $searchForm->addButton('', $lang['btn_search'])->attrs([
+        'type' => 'submit',
+        'title' => $lang['btn_search'],
+    ]);
+    if ($ajax) {
+        $searchForm->addTagOpen('div')->id('qsearch__out')->addClass('ajax_qsearch JSpopup');
+        $searchForm->addTagClose('div');
+    }
+    $searchForm->addTagClose('div');
+    trigger_event('FORM_QUICKSEARCH_OUTPUT', $searchForm);
+
+    echo $searchForm->toHTML();
+
+    return true;
+}
+
+/**
+ * Print the breadcrumbs trace
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param string $sep Separator between entries
+ * @param bool   $return return or print
+ * @return bool|string
+ */
+function tpl_breadcrumbs($sep = null, $return = false) {
+    global $lang;
+    global $conf;
+
+    //check if enabled
+    if(!$conf['breadcrumbs']) return false;
+
+    //set default
+    if(is_null($sep)) $sep = '•';
+
+    $out='';
+
+    $crumbs = breadcrumbs(); //setup crumb trace
+
+    $crumbs_sep = ' <span class="bcsep">'.$sep.'</span> ';
+
+    //render crumbs, highlight the last one
+    $out .= '<span class="bchead">'.$lang['breadcrumb'].'</span>';
+    $last = count($crumbs);
+    $i    = 0;
+    foreach($crumbs as $id => $name) {
+        $i++;
+        $out .= $crumbs_sep;
+        if($i == $last) $out .= '<span class="curid">';
+        $out .= '<bdi>' . tpl_link(wl($id), hsc($name), 'class="breadcrumbs" title="'.$id.'"', true) .  '</bdi>';
+        if($i == $last) $out .= '</span>';
+    }
+    if($return) return $out;
+    print $out;
+    return $out ? true : false;
+}
+
+/**
+ * Hierarchical breadcrumbs
+ *
+ * This code was suggested as replacement for the usual breadcrumbs.
+ * It only makes sense with a deep site structure.
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @author Nigel McNie <oracle.shinoda@gmail.com>
+ * @author Sean Coates <sean@caedmon.net>
+ * @author <fredrik@averpil.com>
+ * @todo   May behave strangely in RTL languages
+ *
+ * @param string $sep Separator between entries
+ * @param bool   $return return or print
+ * @return bool|string
+ */
+function tpl_youarehere($sep = null, $return = false) {
+    global $conf;
+    global $ID;
+    global $lang;
+
+    // check if enabled
+    if(!$conf['youarehere']) return false;
+
+    //set default
+    if(is_null($sep)) $sep = ' » ';
+
+    $out = '';
+
+    $parts = explode(':', $ID);
+    $count = count($parts);
+
+    $out .= '<span class="bchead">'.$lang['youarehere'].' </span>';
+
+    // always print the startpage
+    $out .= '<span class="home">' . tpl_pagelink(':'.$conf['start'], null, true) . '</span>';
+
+    // print intermediate namespace links
+    $part = '';
+    for($i = 0; $i < $count - 1; $i++) {
+        $part .= $parts[$i].':';
+        $page = $part;
+        if($page == $conf['start']) continue; // Skip startpage
+
+        // output
+        $out .= $sep . tpl_pagelink($page, null, true);
+    }
+
+    // print current page, skipping start page, skipping for namespace index
+    resolve_pageid('', $page, $exists);
+    if (isset($page) && $page == $part.$parts[$i]) {
+        if($return) return $out;
+        print $out;
+        return true;
+    }
+    $page = $part.$parts[$i];
+    if($page == $conf['start']) {
+        if($return) return $out;
+        print $out;
+        return true;
+    }
+    $out .= $sep;
+    $out .= tpl_pagelink($page, null, true);
+    if($return) return $out;
+    print $out;
+    return $out ? true : false;
+}
+
+/**
+ * Print info if the user is logged in
+ * and show full name in that case
+ *
+ * Could be enhanced with a profile link in future?
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @return bool
+ */
+function tpl_userinfo() {
+    global $lang;
+    /** @var Input $INPUT */
+    global $INPUT;
+
+    if($INPUT->server->str('REMOTE_USER')) {
+        print $lang['loggedinas'].' '.userlink();
+        return true;
+    }
+    return false;
+}
+
+/**
+ * Print some info about the current page
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param bool $ret return content instead of printing it
+ * @return bool|string
+ */
+function tpl_pageinfo($ret = false) {
+    global $conf;
+    global $lang;
+    global $INFO;
+    global $ID;
+
+    // return if we are not allowed to view the page
+    if(!auth_quickaclcheck($ID)) {
+        return false;
+    }
+
+    // prepare date and path
+    $fn = $INFO['filepath'];
+    if(!$conf['fullpath']) {
+        if($INFO['rev']) {
+            $fn = str_replace($conf['olddir'].'/', '', $fn);
+        } else {
+            $fn = str_replace($conf['datadir'].'/', '', $fn);
+        }
+    }
+    $fn   = utf8_decodeFN($fn);
+    $date = dformat($INFO['lastmod']);
+
+    // print it
+    if($INFO['exists']) {
+        $out = '';
+        $out .= '<bdi>'.$fn.'</bdi>';
+        $out .= ' · ';
+        $out .= $lang['lastmod'];
+        $out .= ' ';
+        $out .= $date;
+        if($INFO['editor']) {
+            $out .= ' '.$lang['by'].' ';
+            $out .= '<bdi>'.editorinfo($INFO['editor']).'</bdi>';
+        } else {
+            $out .= ' ('.$lang['external_edit'].')';
+        }
+        if($INFO['locked']) {
+            $out .= ' · ';
+            $out .= $lang['lockedby'];
+            $out .= ' ';
+            $out .= '<bdi>'.editorinfo($INFO['locked']).'</bdi>';
+        }
+        if($ret) {
+            return $out;
+        } else {
+            echo $out;
+            return true;
+        }
+    }
+    return false;
+}
+
+/**
+ * Prints or returns the name of the given page (current one if none given).
+ *
+ * If useheading is enabled this will use the first headline else
+ * the given ID is used.
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param string $id page id
+ * @param bool   $ret return content instead of printing
+ * @return bool|string
+ */
+function tpl_pagetitle($id = null, $ret = false) {
+    global $ACT, $INPUT, $conf, $lang;
+
+    if(is_null($id)) {
+        global $ID;
+        $id = $ID;
+    }
+
+    $name = $id;
+    if(useHeading('navigation')) {
+        $first_heading = p_get_first_heading($id);
+        if($first_heading) $name = $first_heading;
+    }
+
+    // default page title is the page name, modify with the current action
+    switch ($ACT) {
+        // admin functions
+        case 'admin' :
+            $page_title = $lang['btn_admin'];
+            // try to get the plugin name
+            /** @var $plugin DokuWiki_Admin_Plugin */
+            if ($plugin = plugin_getRequestAdminPlugin()){
+                $plugin_title = $plugin->getMenuText($conf['lang']);
+                $page_title = $plugin_title ? $plugin_title : $plugin->getPluginName();
+            }
+            break;
+
+        // user functions
+        case 'login' :
+        case 'profile' :
+        case 'register' :
+        case 'resendpwd' :
+            $page_title = $lang['btn_'.$ACT];
+            break;
+
+         // wiki functions
+        case 'search' :
+        case 'index' :
+            $page_title = $lang['btn_'.$ACT];
+            break;
+
+        // page functions
+        case 'edit' :
+            $page_title = "✎ ".$name;
+            break;
+
+        case 'revisions' :
+            $page_title = $name . ' - ' . $lang['btn_revs'];
+            break;
+
+        case 'backlink' :
+        case 'recent' :
+        case 'subscribe' :
+            $page_title = $name . ' - ' . $lang['btn_'.$ACT];
+            break;
+
+        default : // SHOW and anything else not included
+            $page_title = $name;
+    }
+
+    if($ret) {
+        return hsc($page_title);
+    } else {
+        print hsc($page_title);
+        return true;
+    }
+}
+
+/**
+ * Returns the requested EXIF/IPTC tag from the current image
+ *
+ * If $tags is an array all given tags are tried until a
+ * value is found. If no value is found $alt is returned.
+ *
+ * Which texts are known is defined in the functions _exifTagNames
+ * and _iptcTagNames() in inc/jpeg.php (You need to prepend IPTC
+ * to the names of the latter one)
+ *
+ * Only allowed in: detail.php
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param array|string $tags tag or array of tags to try
+ * @param string       $alt  alternative output if no data was found
+ * @param null|string  $src  the image src, uses global $SRC if not given
+ * @return string
+ */
+function tpl_img_getTag($tags, $alt = '', $src = null) {
+    // Init Exif Reader
+    global $SRC;
+
+    if(is_null($src)) $src = $SRC;
+
+    static $meta = null;
+    if(is_null($meta)) $meta = new JpegMeta($src);
+    if($meta === false) return $alt;
+    $info = cleanText($meta->getField($tags));
+    if($info == false) return $alt;
+    return $info;
+}
+
+/**
+ * Returns a description list of the metatags of the current image
+ *
+ * @return string html of description list
+ */
+function tpl_img_meta() {
+    global $lang;
+
+    $tags = tpl_get_img_meta();
+
+    echo '<dl>';
+    foreach($tags as $tag) {
+        $label = $lang[$tag['langkey']];
+        if(!$label) $label = $tag['langkey'] . ':';
+
+        echo '<dt>'.$label.'</dt><dd>';
+        if ($tag['type'] == 'date') {
+            echo dformat($tag['value']);
+        } else {
+            echo hsc($tag['value']);
+        }
+        echo '</dd>';
+    }
+    echo '</dl>';
+}
+
+/**
+ * Returns metadata as configured in mediameta config file, ready for creating html
+ *
+ * @return array with arrays containing the entries:
+ *   - string langkey  key to lookup in the $lang var, if not found printed as is
+ *   - string type     type of value
+ *   - string value    tag value (unescaped)
+ */
+function tpl_get_img_meta() {
+
+    $config_files = getConfigFiles('mediameta');
+    foreach ($config_files as $config_file) {
+        if(file_exists($config_file)) {
+            include($config_file);
+        }
+    }
+    /** @var array $fields the included array with metadata */
+
+    $tags = array();
+    foreach($fields as $tag){
+        $t = array();
+        if (!empty($tag[0])) {
+            $t = array($tag[0]);
+        }
+        if(is_array($tag[3])) {
+            $t = array_merge($t,$tag[3]);
+        }
+        $value = tpl_img_getTag($t);
+        if ($value) {
+            $tags[] = array('langkey' => $tag[1], 'type' => $tag[2], 'value' => $value);
+        }
+    }
+    return $tags;
+}
+
+/**
+ * Prints the image with a link to the full sized version
+ *
+ * Only allowed in: detail.php
+ *
+ * @triggers TPL_IMG_DISPLAY
+ * @param $maxwidth  int - maximal width of the image
+ * @param $maxheight int - maximal height of the image
+ * @param $link bool     - link to the orginal size?
+ * @param $params array  - additional image attributes
+ * @return bool Result of TPL_IMG_DISPLAY
+ */
+function tpl_img($maxwidth = 0, $maxheight = 0, $link = true, $params = null) {
+    global $IMG;
+    /** @var Input $INPUT */
+    global $INPUT;
+    global $REV;
+    $w = (int) tpl_img_getTag('File.Width');
+    $h = (int) tpl_img_getTag('File.Height');
+
+    //resize to given max values
+    $ratio = 1;
+    if($w >= $h) {
+        if($maxwidth && $w >= $maxwidth) {
+            $ratio = $maxwidth / $w;
+        } elseif($maxheight && $h > $maxheight) {
+            $ratio = $maxheight / $h;
+        }
+    } else {
+        if($maxheight && $h >= $maxheight) {
+            $ratio = $maxheight / $h;
+        } elseif($maxwidth && $w > $maxwidth) {
+            $ratio = $maxwidth / $w;
+        }
+    }
+    if($ratio) {
+        $w = floor($ratio * $w);
+        $h = floor($ratio * $h);
+    }
+
+    //prepare URLs
+    $url = ml($IMG, array('cache'=> $INPUT->str('cache'),'rev'=>$REV), true, '&');
+    $src = ml($IMG, array('cache'=> $INPUT->str('cache'),'rev'=>$REV, 'w'=> $w, 'h'=> $h), true, '&');
+
+    //prepare attributes
+    $alt = tpl_img_getTag('Simple.Title');
+    if(is_null($params)) {
+        $p = array();
+    } else {
+        $p = $params;
+    }
+    if($w) $p['width'] = $w;
+    if($h) $p['height'] = $h;
+    $p['class'] = 'img_detail';
+    if($alt) {
+        $p['alt']   = $alt;
+        $p['title'] = $alt;
+    } else {
+        $p['alt'] = '';
+    }
+    $p['src'] = $src;
+
+    $data = array('url'=> ($link ? $url : null), 'params'=> $p);
+    return trigger_event('TPL_IMG_DISPLAY', $data, '_tpl_img_action', true);
+}
+
+/**
+ * Default action for TPL_IMG_DISPLAY
+ *
+ * @param array $data
+ * @return bool
+ */
+function _tpl_img_action($data) {
+    global $lang;
+    $p = buildAttributes($data['params']);
+
+    if($data['url']) print '<a href="'.hsc($data['url']).'" title="'.$lang['mediaview'].'">';
+    print '<img '.$p.'/>';
+    if($data['url']) print '</a>';
+    return true;
+}
+
+/**
+ * This function inserts a small gif which in reality is the indexer function.
+ *
+ * Should be called somewhere at the very end of the main.php
+ * template
+ *
+ * @return bool
+ */
+function tpl_indexerWebBug() {
+    global $ID;
+
+    $p           = array();
+    $p['src']    = DOKU_BASE.'lib/exe/indexer.php?id='.rawurlencode($ID).
+        '&'.time();
+    $p['width']  = 2; //no more 1x1 px image because we live in times of ad blockers...
+    $p['height'] = 1;
+    $p['alt']    = '';
+    $att         = buildAttributes($p);
+    print "<img $att />";
+    return true;
+}
+
+/**
+ * tpl_getConf($id)
+ *
+ * use this function to access template configuration variables
+ *
+ * @param string $id      name of the value to access
+ * @param mixed  $notset  what to return if the setting is not available
+ * @return mixed
+ */
+function tpl_getConf($id, $notset=false) {
+    global $conf;
+    static $tpl_configloaded = false;
+
+    $tpl = $conf['template'];
+
+    if(!$tpl_configloaded) {
+        $tconf = tpl_loadConfig();
+        if($tconf !== false) {
+            foreach($tconf as $key => $value) {
+                if(isset($conf['tpl'][$tpl][$key])) continue;
+                $conf['tpl'][$tpl][$key] = $value;
+            }
+            $tpl_configloaded = true;
+        }
+    }
+
+    if(isset($conf['tpl'][$tpl][$id])){
+        return $conf['tpl'][$tpl][$id];
+    }
+
+    return $notset;
+}
+
+/**
+ * tpl_loadConfig()
+ *
+ * reads all template configuration variables
+ * this function is automatically called by tpl_getConf()
+ *
+ * @return array
+ */
+function tpl_loadConfig() {
+
+    $file = tpl_incdir().'/conf/default.php';
+    $conf = array();
+
+    if(!file_exists($file)) return false;
+
+    // load default config file
+    include($file);
+
+    return $conf;
+}
+
+// language methods
+/**
+ * tpl_getLang($id)
+ *
+ * use this function to access template language variables
+ *
+ * @param string $id key of language string
+ * @return string
+ */
+function tpl_getLang($id) {
+    static $lang = array();
+
+    if(count($lang) === 0) {
+        global $conf, $config_cascade; // definitely don't invoke "global $lang"
+
+        $path = tpl_incdir() . 'lang/';
+
+        $lang = array();
+
+        // don't include once
+        @include($path . 'en/lang.php');
+        foreach($config_cascade['lang']['template'] as $config_file) {
+            if(file_exists($config_file . $conf['template'] . '/en/lang.php')) {
+                include($config_file . $conf['template'] . '/en/lang.php');
+            }
+        }
+
+        if($conf['lang'] != 'en') {
+            @include($path . $conf['lang'] . '/lang.php');
+            foreach($config_cascade['lang']['template'] as $config_file) {
+                if(file_exists($config_file . $conf['template'] . '/' . $conf['lang'] . '/lang.php')) {
+                    include($config_file . $conf['template'] . '/' . $conf['lang'] . '/lang.php');
+                }
+            }
+        }
+    }
+    return $lang[$id];
+}
+
+/**
+ * Retrieve a language dependent file and pass to xhtml renderer for display
+ * template 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 tpl_locale_xhtml($id) {
+    return p_cached_output(tpl_localeFN($id));
+}
+
+/**
+ * Prepends appropriate path for a language dependent filename
+ *
+ * @param string $id id of localized text
+ * @return string wiki text
+ */
+function tpl_localeFN($id) {
+    $path = tpl_incdir().'lang/';
+    global $conf;
+    $file = DOKU_CONF.'template_lang/'.$conf['template'].'/'.$conf['lang'].'/'.$id.'.txt';
+    if (!file_exists($file)){
+        $file = $path.$conf['lang'].'/'.$id.'.txt';
+        if(!file_exists($file)){
+            //fall back to english
+            $file = $path.'en/'.$id.'.txt';
+        }
+    }
+    return $file;
+}
+
+/**
+ * prints the "main content" in the mediamanager popup
+ *
+ * Depending on the user's actions this may be a list of
+ * files in a namespace, the meta editing dialog or
+ * a message of referencing pages
+ *
+ * Only allowed in mediamanager.php
+ *
+ * @triggers MEDIAMANAGER_CONTENT_OUTPUT
+ * @param bool $fromajax - set true when calling this function via ajax
+ * @param string $sort
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+function tpl_mediaContent($fromajax = false, $sort='natural') {
+    global $IMG;
+    global $AUTH;
+    global $INUSE;
+    global $NS;
+    global $JUMPTO;
+    /** @var Input $INPUT */
+    global $INPUT;
+
+    $do = $INPUT->extract('do')->str('do');
+    if(in_array($do, array('save', 'cancel'))) $do = '';
+
+    if(!$do) {
+        if($INPUT->bool('edit')) {
+            $do = 'metaform';
+        } elseif(is_array($INUSE)) {
+            $do = 'filesinuse';
+        } else {
+            $do = 'filelist';
+        }
+    }
+
+    // output the content pane, wrapped in an event.
+    if(!$fromajax) ptln('<div id="media__content">');
+    $data = array('do' => $do);
+    $evt  = new Doku_Event('MEDIAMANAGER_CONTENT_OUTPUT', $data);
+    if($evt->advise_before()) {
+        $do = $data['do'];
+        if($do == 'filesinuse') {
+            media_filesinuse($INUSE, $IMG);
+        } elseif($do == 'filelist') {
+            media_filelist($NS, $AUTH, $JUMPTO,false,$sort);
+        } elseif($do == 'searchlist') {
+            media_searchlist($INPUT->str('q'), $NS, $AUTH);
+        } else {
+            msg('Unknown action '.hsc($do), -1);
+        }
+    }
+    $evt->advise_after();
+    unset($evt);
+    if(!$fromajax) ptln('</div>');
+
+}
+
+/**
+ * Prints the central column in full-screen media manager
+ * Depending on the opened tab this may be a list of
+ * files in a namespace, upload form or search form
+ *
+ * @author Kate Arzamastseva <pshns@ukr.net>
+ */
+function tpl_mediaFileList() {
+    global $AUTH;
+    global $NS;
+    global $JUMPTO;
+    global $lang;
+    /** @var Input $INPUT */
+    global $INPUT;
+
+    $opened_tab = $INPUT->str('tab_files');
+    if(!$opened_tab || !in_array($opened_tab, array('files', 'upload', 'search'))) $opened_tab = 'files';
+    if($INPUT->str('mediado') == 'update') $opened_tab = 'upload';
+
+    echo '<h2 class="a11y">'.$lang['mediaselect'].'</h2>'.NL;
+
+    media_tabs_files($opened_tab);
+
+    echo '<div class="panelHeader">'.NL;
+    echo '<h3>';
+    $tabTitle = ($NS) ? $NS : '['.$lang['mediaroot'].']';
+    printf($lang['media_'.$opened_tab], '<strong>'.hsc($tabTitle).'</strong>');
+    echo '</h3>'.NL;
+    if($opened_tab === 'search' || $opened_tab === 'files') {
+        media_tab_files_options();
+    }
+    echo '</div>'.NL;
+
+    echo '<div class="panelContent">'.NL;
+    if($opened_tab == 'files') {
+        media_tab_files($NS, $AUTH, $JUMPTO);
+    } elseif($opened_tab == 'upload') {
+        media_tab_upload($NS, $AUTH, $JUMPTO);
+    } elseif($opened_tab == 'search') {
+        media_tab_search($NS, $AUTH);
+    }
+    echo '</div>'.NL;
+}
+
+/**
+ * Prints the third column in full-screen media manager
+ * Depending on the opened tab this may be details of the
+ * selected file, the meta editing dialog or
+ * list of file revisions
+ *
+ * @author Kate Arzamastseva <pshns@ukr.net>
+ *
+ * @param string $image
+ * @param boolean $rev
+ */
+function tpl_mediaFileDetails($image, $rev) {
+    global $conf, $DEL, $lang;
+    /** @var Input $INPUT */
+    global $INPUT;
+
+    $removed = (!file_exists(mediaFN($image)) && file_exists(mediaMetaFN($image, '.changes')) && $conf['mediarevisions']);
+    if(!$image || (!file_exists(mediaFN($image)) && !$removed) || $DEL) return;
+    if($rev && !file_exists(mediaFN($image, $rev))) $rev = false;
+    $ns = getNS($image);
+    $do = $INPUT->str('mediado');
+
+    $opened_tab = $INPUT->str('tab_details');
+
+    $tab_array = array('view');
+    list(, $mime) = mimetype($image);
+    if($mime == 'image/jpeg') {
+        $tab_array[] = 'edit';
+    }
+    if($conf['mediarevisions']) {
+        $tab_array[] = 'history';
+    }
+
+    if(!$opened_tab || !in_array($opened_tab, $tab_array)) $opened_tab = 'view';
+    if($INPUT->bool('edit')) $opened_tab = 'edit';
+    if($do == 'restore') $opened_tab = 'view';
+
+    media_tabs_details($image, $opened_tab);
+
+    echo '<div class="panelHeader"><h3>';
+    list($ext) = mimetype($image, false);
+    $class    = preg_replace('/[^_\-a-z0-9]+/i', '_', $ext);
+    $class    = 'select mediafile mf_'.$class;
+    $attributes = $rev ? ['rev' => $rev] : [];
+    $tabTitle = '<strong><a href="'.ml($image, $attributes).'" class="'.$class.'" title="'.$lang['mediaview'].'">'.$image.'</a>'.'</strong>';
+    if($opened_tab === 'view' && $rev) {
+        printf($lang['media_viewold'], $tabTitle, dformat($rev));
+    } else {
+        printf($lang['media_'.$opened_tab], $tabTitle);
+    }
+
+    echo '</h3></div>'.NL;
+
+    echo '<div class="panelContent">'.NL;
+
+    if($opened_tab == 'view') {
+        media_tab_view($image, $ns, null, $rev);
+
+    } elseif($opened_tab == 'edit' && !$removed) {
+        media_tab_edit($image, $ns);
+
+    } elseif($opened_tab == 'history' && $conf['mediarevisions']) {
+        media_tab_history($image, $ns);
+    }
+
+    echo '</div>'.NL;
+}
+
+/**
+ * prints the namespace tree in the mediamanager popup
+ *
+ * Only allowed in mediamanager.php
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+function tpl_mediaTree() {
+    global $NS;
+    ptln('<div id="media__tree">');
+    media_nstree($NS);
+    ptln('</div>');
+}
+
+/**
+ * Print a dropdown menu with all DokuWiki actions
+ *
+ * Note: this will not use any pretty URLs
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param string $empty empty option label
+ * @param string $button submit button label
+ * @deprecated 2017-09-01 see devel:menus
+ */
+function tpl_actiondropdown($empty = '', $button = '&gt;') {
+    dbg_deprecated('see devel:menus');
+    $menu = new \dokuwiki\Menu\MobileMenu();
+    echo $menu->getDropdown($empty, $button);
+}
+
+/**
+ * Print a informational line about the used license
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @param  string $img     print image? (|button|badge)
+ * @param  bool   $imgonly skip the textual description?
+ * @param  bool   $return  when true don't print, but return HTML
+ * @param  bool   $wrap    wrap in div with class="license"?
+ * @return string
+ */
+function tpl_license($img = 'badge', $imgonly = false, $return = false, $wrap = true) {
+    global $license;
+    global $conf;
+    global $lang;
+    if(!$conf['license']) return '';
+    if(!is_array($license[$conf['license']])) return '';
+    $lic    = $license[$conf['license']];
+    $target = ($conf['target']['extern']) ? ' target="'.$conf['target']['extern'].'"' : '';
+
+    $out = '';
+    if($wrap) $out .= '<div class="license">';
+    if($img) {
+        $src = license_img($img);
+        if($src) {
+            $out .= '<a href="'.$lic['url'].'" rel="license"'.$target;
+            $out .= '><img src="'.DOKU_BASE.$src.'" alt="'.$lic['name'].'" /></a>';
+            if(!$imgonly) $out .= ' ';
+        }
+    }
+    if(!$imgonly) {
+        $out .= $lang['license'].' ';
+        $out .= '<bdi><a href="'.$lic['url'].'" rel="license" class="urlextern"'.$target;
+        $out .= '>'.$lic['name'].'</a></bdi>';
+    }
+    if($wrap) $out .= '</div>';
+
+    if($return) return $out;
+    echo $out;
+    return '';
+}
+
+/**
+ * Includes the rendered HTML of a given page
+ *
+ * This function is useful to populate sidebars or similar features in a
+ * template
+ *
+ * @param string $pageid The page name you want to include
+ * @param bool $print Should the content be printed or returned only
+ * @param bool $propagate Search higher namespaces, too?
+ * @param bool $useacl Include the page only if the ACLs check out?
+ * @return bool|null|string
+ */
+function tpl_include_page($pageid, $print = true, $propagate = false, $useacl = true) {
+    if($propagate) {
+        $pageid = page_findnearest($pageid, $useacl);
+    } elseif($useacl && auth_quickaclcheck($pageid) == AUTH_NONE) {
+        return false;
+    }
+    if(!$pageid) return false;
+
+    global $TOC;
+    $oldtoc = $TOC;
+    $html   = p_wiki_xhtml($pageid, '', false);
+    $TOC    = $oldtoc;
+
+    if($print) echo $html;
+    return $html;
+}
+
+/**
+ * Display the subscribe form
+ *
+ * @author Adrian Lang <lang@cosmocode.de>
+ */
+function tpl_subscribe() {
+    global $INFO;
+    global $ID;
+    global $lang;
+    global $conf;
+    $stime_days = $conf['subscribe_time'] / 60 / 60 / 24;
+
+    echo p_locale_xhtml('subscr_form');
+    echo '<h2>'.$lang['subscr_m_current_header'].'</h2>';
+    echo '<div class="level2">';
+    if($INFO['subscribed'] === false) {
+        echo '<p>'.$lang['subscr_m_not_subscribed'].'</p>';
+    } else {
+        echo '<ul>';
+        foreach($INFO['subscribed'] as $sub) {
+            echo '<li><div class="li">';
+            if($sub['target'] !== $ID) {
+                echo '<code class="ns">'.hsc(prettyprint_id($sub['target'])).'</code>';
+            } else {
+                echo '<code class="page">'.hsc(prettyprint_id($sub['target'])).'</code>';
+            }
+            $sstl = sprintf($lang['subscr_style_'.$sub['style']], $stime_days);
+            if(!$sstl) $sstl = hsc($sub['style']);
+            echo ' ('.$sstl.') ';
+
+            echo '<a href="'.wl(
+                $ID,
+                array(
+                     'do'        => 'subscribe',
+                     'sub_target'=> $sub['target'],
+                     'sub_style' => $sub['style'],
+                     'sub_action'=> 'unsubscribe',
+                     'sectok'    => getSecurityToken()
+                )
+            ).
+                '" class="unsubscribe">'.$lang['subscr_m_unsubscribe'].
+                '</a></div></li>';
+        }
+        echo '</ul>';
+    }
+    echo '</div>';
+
+    // Add new subscription form
+    echo '<h2>'.$lang['subscr_m_new_header'].'</h2>';
+    echo '<div class="level2">';
+    $ns      = getNS($ID).':';
+    $targets = array(
+        $ID => '<code class="page">'.prettyprint_id($ID).'</code>',
+        $ns => '<code class="ns">'.prettyprint_id($ns).'</code>',
+    );
+    $styles  = array(
+        'every'  => $lang['subscr_style_every'],
+        'digest' => sprintf($lang['subscr_style_digest'], $stime_days),
+        'list'   => sprintf($lang['subscr_style_list'], $stime_days),
+    );
+
+    $form = new Doku_Form(array('id' => 'subscribe__form'));
+    $form->startFieldset($lang['subscr_m_subscribe']);
+    $form->addRadioSet('sub_target', $targets);
+    $form->startFieldset($lang['subscr_m_receive']);
+    $form->addRadioSet('sub_style', $styles);
+    $form->addHidden('sub_action', 'subscribe');
+    $form->addHidden('do', 'subscribe');
+    $form->addHidden('id', $ID);
+    $form->endFieldset();
+    $form->addElement(form_makeButton('submit', 'subscribe', $lang['subscr_m_subscribe']));
+    html_form('SUBSCRIBE', $form);
+    echo '</div>';
+}
+
+/**
+ * Tries to send already created content right to the browser
+ *
+ * Wraps around ob_flush() and flush()
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+function tpl_flush() {
+    ob_flush();
+    flush();
+}
+
+/**
+ * Tries to find a ressource file in the given locations.
+ *
+ * If a given location starts with a colon it is assumed to be a media
+ * file, otherwise it is assumed to be relative to the current template
+ *
+ * @param  string[] $search       locations to look at
+ * @param  bool     $abs           if to use absolute URL
+ * @param  array   &$imginfo   filled with getimagesize()
+ * @return string
+ *
+ * @author Andreas  Gohr <andi@splitbrain.org>
+ */
+function tpl_getMediaFile($search, $abs = false, &$imginfo = null) {
+    $img     = '';
+    $file    = '';
+    $ismedia = false;
+    // loop through candidates until a match was found:
+    foreach($search as $img) {
+        if(substr($img, 0, 1) == ':') {
+            $file    = mediaFN($img);
+            $ismedia = true;
+        } else {
+            $file    = tpl_incdir().$img;
+            $ismedia = false;
+        }
+
+        if(file_exists($file)) break;
+    }
+
+    // fetch image data if requested
+    if(!is_null($imginfo)) {
+        $imginfo = getimagesize($file);
+    }
+
+    // build URL
+    if($ismedia) {
+        $url = ml($img, '', true, '', $abs);
+    } else {
+        $url = tpl_basedir().$img;
+        if($abs) $url = DOKU_URL.substr($url, strlen(DOKU_REL));
+    }
+
+    return $url;
+}
+
+/**
+ * PHP include a file
+ *
+ * either from the conf directory if it exists, otherwise use
+ * file in the template's root directory.
+ *
+ * The function honours config cascade settings and looks for the given
+ * file next to the ´main´ config files, in the order protected, local,
+ * default.
+ *
+ * Note: no escaping or sanity checking is done here. Never pass user input
+ * to this function!
+ *
+ * @author Anika Henke <anika@selfthinker.org>
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param string $file
+ */
+function tpl_includeFile($file) {
+    global $config_cascade;
+    foreach(array('protected', 'local', 'default') as $config_group) {
+        if(empty($config_cascade['main'][$config_group])) continue;
+        foreach($config_cascade['main'][$config_group] as $conf_file) {
+            $dir = dirname($conf_file);
+            if(file_exists("$dir/$file")) {
+                include("$dir/$file");
+                return;
+            }
+        }
+    }
+
+    // still here? try the template dir
+    $file = tpl_incdir().$file;
+    if(file_exists($file)) {
+        include($file);
+    }
+}
+
+/**
+ * Returns <link> tag for various icon types (favicon|mobile|generic)
+ *
+ * @author Anika Henke <anika@selfthinker.org>
+ *
+ * @param  array $types - list of icon types to display (favicon|mobile|generic)
+ * @return string
+ */
+function tpl_favicon($types = array('favicon')) {
+
+    $return = '';
+
+    foreach($types as $type) {
+        switch($type) {
+            case 'favicon':
+                $look = array(':wiki:favicon.ico', ':favicon.ico', 'images/favicon.ico');
+                $return .= '<link rel="shortcut icon" href="'.tpl_getMediaFile($look).'" />'.NL;
+                break;
+            case 'mobile':
+                $look = array(':wiki:apple-touch-icon.png', ':apple-touch-icon.png', 'images/apple-touch-icon.png');
+                $return .= '<link rel="apple-touch-icon" href="'.tpl_getMediaFile($look).'" />'.NL;
+                break;
+            case 'generic':
+                // ideal world solution, which doesn't work in any browser yet
+                $look = array(':wiki:favicon.svg', ':favicon.svg', 'images/favicon.svg');
+                $return .= '<link rel="icon" href="'.tpl_getMediaFile($look).'" type="image/svg+xml" />'.NL;
+                break;
+        }
+    }
+
+    return $return;
+}
+
+/**
+ * Prints full-screen media manager
+ *
+ * @author Kate Arzamastseva <pshns@ukr.net>
+ */
+function tpl_media() {
+    global $NS, $IMG, $JUMPTO, $REV, $lang, $fullscreen, $INPUT;
+    $fullscreen = true;
+    require_once DOKU_INC.'lib/exe/mediamanager.php';
+
+    $rev   = '';
+    $image = cleanID($INPUT->str('image'));
+    if(isset($IMG)) $image = $IMG;
+    if(isset($JUMPTO)) $image = $JUMPTO;
+    if(isset($REV) && !$JUMPTO) $rev = $REV;
+
+    echo '<div id="mediamanager__page">'.NL;
+    echo '<h1>'.$lang['btn_media'].'</h1>'.NL;
+    html_msgarea();
+
+    echo '<div class="panel namespaces">'.NL;
+    echo '<h2>'.$lang['namespaces'].'</h2>'.NL;
+    echo '<div class="panelHeader">';
+    echo $lang['media_namespaces'];
+    echo '</div>'.NL;
+
+    echo '<div class="panelContent" id="media__tree">'.NL;
+    media_nstree($NS);
+    echo '</div>'.NL;
+    echo '</div>'.NL;
+
+    echo '<div class="panel filelist">'.NL;
+    tpl_mediaFileList();
+    echo '</div>'.NL;
+
+    echo '<div class="panel file">'.NL;
+    echo '<h2 class="a11y">'.$lang['media_file'].'</h2>'.NL;
+    tpl_mediaFileDetails($image, $rev);
+    echo '</div>'.NL;
+
+    echo '</div>'.NL;
+}
+
+/**
+ * Return useful layout classes
+ *
+ * @author Anika Henke <anika@selfthinker.org>
+ *
+ * @return string
+ */
+function tpl_classes() {
+    global $ACT, $conf, $ID, $INFO;
+    /** @var Input $INPUT */
+    global $INPUT;
+
+    $classes = array(
+        'dokuwiki',
+        'mode_'.$ACT,
+        'tpl_'.$conf['template'],
+        $INPUT->server->bool('REMOTE_USER') ? 'loggedIn' : '',
+        $INFO['exists'] ? '' : 'notFound',
+        ($ID == $conf['start']) ? 'home' : '',
+    );
+    return join(' ', $classes);
+}
+
+/**
+ * Create event for tools menues
+ *
+ * @author Anika Henke <anika@selfthinker.org>
+ * @param string $toolsname name of menu
+ * @param array $items
+ * @param string $view e.g. 'main', 'detail', ...
+ * @deprecated 2017-09-01 see devel:menus
+ */
+function tpl_toolsevent($toolsname, $items, $view = 'main') {
+    dbg_deprecated('see devel:menus');
+    $data = array(
+        'view' => $view,
+        'items' => $items
+    );
+
+    $hook = 'TEMPLATE_' . strtoupper($toolsname) . '_DISPLAY';
+    $evt = new Doku_Event($hook, $data);
+    if($evt->advise_before()) {
+        foreach($evt->data['items'] as $k => $html) echo $html;
+    }
+    $evt->advise_after();
+}
+
+//Setup VIM: ex: et ts=4 :
+
diff --git a/wiki/inc/toolbar.php b/wiki/inc/toolbar.php
new file mode 100644
index 0000000..7cc29e8
--- /dev/null
+++ b/wiki/inc/toolbar.php
@@ -0,0 +1,257 @@
+<?php
+/**
+ * Editing toolbar functions
+ *
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author     Andreas Gohr <andi@splitbrain.org>
+ */
+
+if(!defined('DOKU_INC')) die('meh.');
+
+/**
+ * Prepares and prints an JavaScript array with all toolbar buttons
+ *
+ * @emits  TOOLBAR_DEFINE
+ * @param  string $varname Name of the JS variable to fill
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+function toolbar_JSdefines($varname){
+    global $lang;
+
+    $menu = array();
+
+    $evt = new Doku_Event('TOOLBAR_DEFINE', $menu);
+    if ($evt->advise_before()){
+
+        // build button array
+        $menu = array_merge($menu, array(
+           array(
+                'type'   => 'format',
+                'title'  => $lang['qb_bold'],
+                'icon'   => 'bold.png',
+                'key'    => 'b',
+                'open'   => '**',
+                'close'  => '**',
+                'block'  => false
+                ),
+           array(
+                'type'   => 'format',
+                'title'  => $lang['qb_italic'],
+                'icon'   => 'italic.png',
+                'key'    => 'i',
+                'open'   => '//',
+                'close'  => '//',
+                'block'  => false
+                ),
+           array(
+                'type'   => 'format',
+                'title'  => $lang['qb_underl'],
+                'icon'   => 'underline.png',
+                'key'    => 'u',
+                'open'   => '__',
+                'close'  => '__',
+                'block'  => false
+                ),
+           array(
+                'type'   => 'format',
+                'title'  => $lang['qb_code'],
+                'icon'   => 'mono.png',
+                'key'    => 'm',
+                'open'   => "''",
+                'close'  => "''",
+                'block'  => false
+                ),
+           array(
+                'type'   => 'format',
+                'title'  => $lang['qb_strike'],
+                'icon'   => 'strike.png',
+                'key'    => 'd',
+                'open'  => '<del>',
+                'close'   => '</del>',
+                'block'  => false
+                ),
+
+           array(
+                'type'   => 'autohead',
+                'title'  => $lang['qb_hequal'],
+                'icon'   => 'hequal.png',
+                'key'    => '8',
+                'text'   => $lang['qb_h'],
+                'mod'    => 0,
+                'block'  => true
+               ),
+           array(
+                'type'   => 'autohead',
+                'title'  => $lang['qb_hminus'],
+                'icon'   => 'hminus.png',
+                'key'    => '9',
+                'text'   => $lang['qb_h'],
+                'mod'    => 1,
+                'block'  => true
+               ),
+           array(
+                'type'   => 'autohead',
+                'title'  => $lang['qb_hplus'],
+                'icon'   => 'hplus.png',
+                'key'    => '0',
+                'text'   => $lang['qb_h'],
+                'mod'    => -1,
+                'block'  => true
+               ),
+
+           array(
+                'type'   => 'picker',
+                'title'  => $lang['qb_hs'],
+                'icon'   => 'h.png',
+                'class'  => 'pk_hl',
+                'list'   => array(
+                               array(
+                                    'type'   => 'format',
+                                    'title'  => $lang['qb_h1'],
+                                    'icon'   => 'h1.png',
+                                    'key'    => '1',
+                                    'open'   => '====== ',
+                                    'close'  => ' ======\n',
+                                    ),
+                               array(
+                                    'type'   => 'format',
+                                    'title'  => $lang['qb_h2'],
+                                    'icon'   => 'h2.png',
+                                    'key'    => '2',
+                                    'open'   => '===== ',
+                                    'close'  => ' =====\n',
+                                    ),
+                               array(
+                                    'type'   => 'format',
+                                    'title'  => $lang['qb_h3'],
+                                    'icon'   => 'h3.png',
+                                    'key'    => '3',
+                                    'open'   => '==== ',
+                                    'close'  => ' ====\n',
+                                    ),
+                               array(
+                                    'type'   => 'format',
+                                    'title'  => $lang['qb_h4'],
+                                    'icon'   => 'h4.png',
+                                    'key'    => '4',
+                                    'open'   => '=== ',
+                                    'close'  => ' ===\n',
+                                    ),
+                               array(
+                                    'type'   => 'format',
+                                    'title'  => $lang['qb_h5'],
+                                    'icon'   => 'h5.png',
+                                    'key'    => '5',
+                                    'open'   => '== ',
+                                    'close'  => ' ==\n',
+                                    ),
+                            ),
+                'block'  => true
+                ),
+
+           array(
+                'type'   => 'linkwiz',
+                'title'  => $lang['qb_link'],
+                'icon'   => 'link.png',
+                'key'    => 'l',
+                'open'   => '[[',
+                'close'  => ']]',
+                'block'  => false
+                ),
+           array(
+                'type'   => 'format',
+                'title'  => $lang['qb_extlink'],
+                'icon'   => 'linkextern.png',
+                'open'   => '[[',
+                'close'  => ']]',
+                'sample' => 'http://example.com|'.$lang['qb_extlink'],
+                'block'  => false
+                ),
+           array(
+                'type'   => 'formatln',
+                'title'  => $lang['qb_ol'],
+                'icon'   => 'ol.png',
+                'open'   => '  - ',
+                'close'  => '',
+                'key'    => '-',
+                'block'  => true
+                ),
+           array(
+                'type'   => 'formatln',
+                'title'  => $lang['qb_ul'],
+                'icon'   => 'ul.png',
+                'open'   => '  * ',
+                'close'  => '',
+                'key'    => '.',
+                'block'  => true
+                ),
+           array(
+                'type'   => 'insert',
+                'title'  => $lang['qb_hr'],
+                'icon'   => 'hr.png',
+                'insert' => '\n----\n',
+                'block'  => true
+                ),
+           array(
+                'type'   => 'mediapopup',
+                'title'  => $lang['qb_media'],
+                'icon'   => 'image.png',
+                'url'    => 'lib/exe/mediamanager.php?ns=',
+                'name'   => 'mediaselect',
+                'options'=> 'width=750,height=500,left=20,top=20,scrollbars=yes,resizable=yes',
+                'block'  => false
+                ),
+          array(
+                'type'   => 'picker',
+                'title'  => $lang['qb_smileys'],
+                'icon'   => 'smiley.png',
+                'list'   => getSmileys(),
+                'icobase'=> 'smileys',
+                'block'  => false
+               ),
+          array(
+                'type'   => 'picker',
+                'title'  => $lang['qb_chars'],
+                'icon'   => 'chars.png',
+                'list'   => explode(' ','À à Á á  â à ã Ä ä Ǎ ǎ Ă ă Å å Ā ā Ą ą Æ æ Ć ć Ç ç Č č Ĉ ĉ Ċ ċ Ð đ ð Ď ď È è É é Ê ê Ë ë Ě ě Ē ē Ė ė Ę ę Ģ ģ Ĝ ĝ Ğ ğ Ġ ġ Ĥ ĥ Ì ì Í í Î î Ï ï Ǐ ǐ Ī ī İ ı Į į Ĵ ĵ Ķ ķ Ĺ ĺ Ļ ļ Ľ ľ Ł ł Ŀ ŀ Ń ń Ñ ñ Ņ ņ Ň ň Ò ò Ó ó Ô ô Õ õ Ö ö Ǒ ǒ Ō ō Ő ő Œ œ Ø ø Ŕ ŕ Ŗ ŗ Ř ř Ś ś Ş ş Š š Ŝ ŝ Ţ ţ Ť ť Ù ù Ú ú Û û Ü ü Ǔ ǔ Ŭ ŭ Ū ū Ů ů ǖ ǘ ǚ ǜ Ų ų Ű ű Ŵ ŵ Ý ý Ÿ ÿ Ŷ ŷ Ź ź Ž ž Ż ż Þ þ ß Ħ ħ ¿ ¡ ¢ £ ¤ ¥ € ¦ § ª ¬ ¯ ° ± ÷ ‰ ¼ ½ ¾ ¹ ² ³ µ ¶ † ‡ · • º ∀ ∂ ∃ Ə ə ∅ ∇ ∈ ∉ ∋ ∏ ∑ ‾ − ∗ × ⁄ √ ∝ ∞ ∠ ∧ ∨ ∩ ∪ ∫ ∴ ∼ ≅ ≈ ≠ ≡ ≤ ≥ ⊂ ⊃ ⊄ ⊆ ⊇ ⊕ ⊗ ⊥ ⋅ ◊ ℘ ℑ ℜ ℵ ♠ ♣ ♥ ♦ α β Γ γ Δ δ ε ζ η Θ θ ι κ Λ λ μ Ξ ξ Π π ρ Σ σ Τ τ υ Φ φ χ Ψ ψ Ω ω ★ ☆ ☎ ☚ ☛ ☜ ☝ ☞ ☟ ☹ ☺ ✔ ✘ „ “ ” ‚ ‘ ’ « » ‹ › — – … ← ↑ → ↓ ↔ ⇐ ⇑ ⇒ ⇓ ⇔ © ™ ® ′ ″ [ ] { } ~ ( ) % § $ # | @'),
+                'block'  => false
+               ),
+          array(
+                'type'   => 'signature',
+                'title'  => $lang['qb_sig'],
+                'icon'   => 'sig.png',
+                'key'    => 'y',
+                'block'  => false
+               ),
+        ));
+    } // end event TOOLBAR_DEFINE default action
+    $evt->advise_after();
+    unset($evt);
+
+    // use JSON to build the JavaScript array
+    $json = new JSON();
+    print "var $varname = ".$json->encode($menu).";\n";
+}
+
+/**
+ * prepares the signature string as configured in the config
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+function toolbar_signature(){
+    global $conf;
+    global $INFO;
+    /** @var Input $INPUT */
+    global $INPUT;
+
+    $sig = $conf['signature'];
+    $sig = dformat(null,$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);
+    $sig = str_replace('\\\\n','\\n',addslashes($sig));
+    return $sig;
+}
+
+//Setup VIM: ex: et ts=4 :
diff --git a/wiki/inc/utf8.php b/wiki/inc/utf8.php
new file mode 100644
index 0000000..4de2874
--- /dev/null
+++ b/wiki/inc/utf8.php
@@ -0,0 +1,1771 @@
+<?php
+/**
+ * UTF8 helper functions
+ *
+ * @license    LGPL 2.1 (http://www.gnu.org/copyleft/lesser.html)
+ * @author     Andreas Gohr <andi@splitbrain.org>
+ */
+
+/**
+ * check for mb_string support
+ */
+if(!defined('UTF8_MBSTRING')){
+    if(function_exists('mb_substr') && !defined('UTF8_NOMBSTRING')){
+        define('UTF8_MBSTRING',1);
+    }else{
+        define('UTF8_MBSTRING',0);
+    }
+}
+
+/**
+ * Check if PREG was compiled with UTF-8 support
+ *
+ * Without this many of the functions below will not work, so this is a minimal requirement
+ */
+if(!defined('UTF8_PREGSUPPORT')){
+    define('UTF8_PREGSUPPORT', (bool) @preg_match('/^.$/u', 'ñ'));
+}
+
+/**
+ * Check if PREG was compiled with Unicode Property support
+ *
+ * This is not required for the functions below, but might be needed in a UTF-8 aware application
+ */
+if(!defined('UTF8_PROPERTYSUPPORT')){
+    define('UTF8_PROPERTYSUPPORT', (bool) @preg_match('/^\pL$/u', 'ñ'));
+}
+
+
+if(UTF8_MBSTRING){ mb_internal_encoding('UTF-8'); }
+
+if(!function_exists('utf8_isASCII')){
+    /**
+     * Checks if a string contains 7bit ASCII only
+     *
+     * @author Andreas Haerter <andreas.haerter@dev.mail-node.com>
+     *
+     * @param string $str
+     * @return bool
+     */
+    function utf8_isASCII($str){
+        return (preg_match('/(?:[^\x00-\x7F])/', $str) !== 1);
+    }
+}
+
+if(!function_exists('utf8_strip')){
+    /**
+     * Strips all highbyte chars
+     *
+     * Returns a pure ASCII7 string
+     *
+     * @author Andreas Gohr <andi@splitbrain.org>
+     *
+     * @param string $str
+     * @return string
+     */
+    function utf8_strip($str){
+        $ascii = '';
+        $len = strlen($str);
+        for($i=0; $i<$len; $i++){
+            if(ord($str{$i}) <128){
+                $ascii .= $str{$i};
+            }
+        }
+        return $ascii;
+    }
+}
+
+if(!function_exists('utf8_check')){
+    /**
+     * Tries to detect if a string is in Unicode encoding
+     *
+     * @author <bmorel@ssi.fr>
+     * @link   http://php.net/manual/en/function.utf8-encode.php
+     *
+     * @param string $Str
+     * @return bool
+     */
+    function utf8_check($Str) {
+        $len = strlen($Str);
+        for ($i=0; $i<$len; $i++) {
+            $b = ord($Str[$i]);
+            if ($b < 0x80) continue; # 0bbbbbbb
+            elseif (($b & 0xE0) == 0xC0) $n=1; # 110bbbbb
+            elseif (($b & 0xF0) == 0xE0) $n=2; # 1110bbbb
+            elseif (($b & 0xF8) == 0xF0) $n=3; # 11110bbb
+            elseif (($b & 0xFC) == 0xF8) $n=4; # 111110bb
+            elseif (($b & 0xFE) == 0xFC) $n=5; # 1111110b
+            else return false; # Does not match any model
+
+            for ($j=0; $j<$n; $j++) { # n bytes matching 10bbbbbb follow ?
+                if ((++$i == $len) || ((ord($Str[$i]) & 0xC0) != 0x80))
+                    return false;
+            }
+        }
+        return true;
+    }
+}
+
+if(!function_exists('utf8_basename')){
+    /**
+     * A locale independent basename() implementation
+     *
+     * works around a bug in PHP's basename() implementation
+     *
+     * @see basename()
+     * @link   https://bugs.php.net/bug.php?id=37738
+     *
+     * @param string $path     A path
+     * @param string $suffix   If the name component ends in suffix this will also be cut off
+     * @return string
+     */
+    function utf8_basename($path, $suffix=''){
+        $path = trim($path,'\\/');
+        $rpos = max(strrpos($path, '/'), strrpos($path, '\\'));
+        if($rpos) $path = substr($path, $rpos+1);
+
+        $suflen = strlen($suffix);
+        if($suflen && (substr($path, -$suflen) == $suffix)){
+            $path = substr($path, 0, -$suflen);
+        }
+
+        return $path;
+    }
+}
+
+if(!function_exists('utf8_strlen')){
+    /**
+     * Unicode aware replacement for strlen()
+     *
+     * utf8_decode() converts characters that are not in ISO-8859-1
+     * to '?', which, for the purpose of counting, is alright - It's
+     * even faster than mb_strlen.
+     *
+     * @author <chernyshevsky at hotmail dot com>
+     * @see    strlen()
+     * @see    utf8_decode()
+     *
+     * @param string $string
+     * @return int
+     */
+    function utf8_strlen($string) {
+        if (function_exists('utf8_decode')) {
+            return strlen(utf8_decode($string));
+        } elseif (UTF8_MBSTRING) {
+            return mb_strlen($string, 'UTF-8');
+        } elseif (function_exists('iconv_strlen')) {
+            return iconv_strlen($string, 'UTF-8');
+        } else {
+            return strlen($string);
+        }
+    }
+}
+
+if(!function_exists('utf8_substr')){
+    /**
+     * UTF-8 aware alternative to substr
+     *
+     * Return part of a string given character offset (and optionally length)
+     *
+     * @author Harry Fuecks <hfuecks@gmail.com>
+     * @author Chris Smith <chris@jalakai.co.uk>
+     *
+     * @param string $str
+     * @param int $offset number of UTF-8 characters offset (from left)
+     * @param int $length (optional) length in UTF-8 characters from offset
+     * @return string
+     */
+    function utf8_substr($str, $offset, $length = null) {
+        if(UTF8_MBSTRING){
+            if( $length === null ){
+                return mb_substr($str, $offset);
+            }else{
+                return mb_substr($str, $offset, $length);
+            }
+        }
+
+        /*
+         * Notes:
+         *
+         * no mb string support, so we'll use pcre regex's with 'u' flag
+         * pcre only supports repetitions of less than 65536, in order to accept up to MAXINT values for
+         * offset and length, we'll repeat a group of 65535 characters when needed (ok, up to MAXINT-65536)
+         *
+         * substr documentation states false can be returned in some cases (e.g. offset > string length)
+         * mb_substr never returns false, it will return an empty string instead.
+         *
+         * calculating the number of characters in the string is a relatively expensive operation, so
+         * we only carry it out when necessary. It isn't necessary for +ve offsets and no specified length
+         */
+
+        // cast parameters to appropriate types to avoid multiple notices/warnings
+        $str = (string)$str;                          // generates E_NOTICE for PHP4 objects, but not PHP5 objects
+        $offset = (int)$offset;
+        if (!is_null($length)) $length = (int)$length;
+
+        // handle trivial cases
+        if ($length === 0) return '';
+        if ($offset < 0 && $length < 0 && $length < $offset) return '';
+
+        $offset_pattern = '';
+        $length_pattern = '';
+
+        // normalise -ve offsets (we could use a tail anchored pattern, but they are horribly slow!)
+        if ($offset < 0) {
+            $strlen = utf8_strlen($str);        // see notes
+            $offset = $strlen + $offset;
+            if ($offset < 0) $offset = 0;
+        }
+
+        // establish a pattern for offset, a non-captured group equal in length to offset
+        if ($offset > 0) {
+            $Ox = (int)($offset/65535);
+            $Oy = $offset%65535;
+
+            if ($Ox) $offset_pattern = '(?:.{65535}){'.$Ox.'}';
+            $offset_pattern = '^(?:'.$offset_pattern.'.{'.$Oy.'})';
+        } else {
+            $offset_pattern = '^';                      // offset == 0; just anchor the pattern
+        }
+
+        // establish a pattern for length
+        if (is_null($length)) {
+            $length_pattern = '(.*)$';                  // the rest of the string
+        } else {
+
+            if (!isset($strlen)) $strlen = utf8_strlen($str);    // see notes
+            if ($offset > $strlen) return '';           // another trivial case
+
+            if ($length > 0) {
+
+                $length = min($strlen-$offset, $length);  // reduce any length that would go passed the end of the string
+
+                $Lx = (int)($length/65535);
+                $Ly = $length%65535;
+
+                // +ve length requires ... a captured group of length characters
+                if ($Lx) $length_pattern = '(?:.{65535}){'.$Lx.'}';
+                    $length_pattern = '('.$length_pattern.'.{'.$Ly.'})';
+
+            } else if ($length < 0) {
+
+                if ($length < ($offset - $strlen)) return '';
+
+                $Lx = (int)((-$length)/65535);
+                $Ly = (-$length)%65535;
+
+                // -ve length requires ... capture everything except a group of -length characters
+                //                         anchored at the tail-end of the string
+                if ($Lx) $length_pattern = '(?:.{65535}){'.$Lx.'}';
+                $length_pattern = '(.*)(?:'.$length_pattern.'.{'.$Ly.'})$';
+            }
+        }
+
+        if (!preg_match('#'.$offset_pattern.$length_pattern.'#us',$str,$match)) return '';
+        return $match[1];
+    }
+}
+
+if(!function_exists('utf8_substr_replace')){
+    /**
+     * Unicode aware replacement for substr_replace()
+     *
+     * @author Andreas Gohr <andi@splitbrain.org>
+     * @see    substr_replace()
+     *
+     * @param string $string      input string
+     * @param string $replacement the replacement
+     * @param int    $start       the replacing will begin at the start'th offset into string.
+     * @param int    $length      If given and is positive, it represents the length of the portion of string which is
+     *                            to be replaced. If length is zero then this function will have the effect of inserting
+     *                            replacement into string at the given start offset.
+     * @return string
+     */
+    function utf8_substr_replace($string, $replacement, $start , $length=0 ){
+        $ret = '';
+        if($start>0) $ret .= utf8_substr($string, 0, $start);
+        $ret .= $replacement;
+        $ret .= utf8_substr($string, $start+$length);
+        return $ret;
+    }
+}
+
+if(!function_exists('utf8_ltrim')){
+    /**
+     * Unicode aware replacement for ltrim()
+     *
+     * @author Andreas Gohr <andi@splitbrain.org>
+     * @see    ltrim()
+     *
+     * @param  string $str
+     * @param  string $charlist
+     * @return string
+     */
+    function utf8_ltrim($str,$charlist=''){
+        if($charlist == '') return ltrim($str);
+
+        //quote charlist for use in a characterclass
+        $charlist = preg_replace('!([\\\\\\-\\]\\[/])!','\\\${1}',$charlist);
+
+        return preg_replace('/^['.$charlist.']+/u','',$str);
+    }
+}
+
+if(!function_exists('utf8_rtrim')){
+    /**
+     * Unicode aware replacement for rtrim()
+     *
+     * @author Andreas Gohr <andi@splitbrain.org>
+     * @see    rtrim()
+     *
+     * @param  string $str
+     * @param  string $charlist
+     * @return string
+     */
+    function  utf8_rtrim($str,$charlist=''){
+        if($charlist == '') return rtrim($str);
+
+        //quote charlist for use in a characterclass
+        $charlist = preg_replace('!([\\\\\\-\\]\\[/])!','\\\${1}',$charlist);
+
+        return preg_replace('/['.$charlist.']+$/u','',$str);
+    }
+}
+
+if(!function_exists('utf8_trim')){
+    /**
+     * Unicode aware replacement for trim()
+     *
+     * @author Andreas Gohr <andi@splitbrain.org>
+     * @see    trim()
+     *
+     * @param  string $str
+     * @param  string $charlist
+     * @return string
+     */
+    function  utf8_trim($str,$charlist='') {
+        if($charlist == '') return trim($str);
+
+        return utf8_ltrim(utf8_rtrim($str,$charlist),$charlist);
+    }
+}
+
+if(!function_exists('utf8_strtolower')){
+    /**
+     * This is a unicode aware replacement for strtolower()
+     *
+     * Uses mb_string extension if available
+     *
+     * @author Leo Feyer <leo@typolight.org>
+     * @see    strtolower()
+     * @see    utf8_strtoupper()
+     *
+     * @param string $string
+     * @return string
+     */
+    function utf8_strtolower($string){
+        if(UTF8_MBSTRING) {
+            if (class_exists("Normalizer", $autoload = false))
+                return normalizer::normalize(mb_strtolower($string,'utf-8'));
+            else
+                return (mb_strtolower($string,'utf-8'));
+        }
+        global $UTF8_UPPER_TO_LOWER;
+        return strtr($string,$UTF8_UPPER_TO_LOWER);
+    }
+}
+
+if(!function_exists('utf8_strtoupper')){
+    /**
+     * This is a unicode aware replacement for strtoupper()
+     *
+     * Uses mb_string extension if available
+     *
+     * @author Leo Feyer <leo@typolight.org>
+     * @see    strtoupper()
+     * @see    utf8_strtoupper()
+     *
+     * @param string $string
+     * @return string
+     */
+    function utf8_strtoupper($string){
+        if(UTF8_MBSTRING) return mb_strtoupper($string,'utf-8');
+
+        global $UTF8_LOWER_TO_UPPER;
+        return strtr($string,$UTF8_LOWER_TO_UPPER);
+    }
+}
+
+if(!function_exists('utf8_ucfirst')){
+    /**
+     * UTF-8 aware alternative to ucfirst
+     * Make a string's first character uppercase
+     *
+     * @author Harry Fuecks
+     *
+     * @param string $str
+     * @return string with first character as upper case (if applicable)
+     */
+    function utf8_ucfirst($str){
+        switch ( utf8_strlen($str) ) {
+            case 0:
+                return '';
+            case 1:
+                return utf8_strtoupper($str);
+            default:
+                preg_match('/^(.{1})(.*)$/us', $str, $matches);
+                return utf8_strtoupper($matches[1]).$matches[2];
+        }
+    }
+}
+
+if(!function_exists('utf8_ucwords')){
+    /**
+     * UTF-8 aware alternative to ucwords
+     * Uppercase the first character of each word in a string
+     *
+     * @author Harry Fuecks
+     * @see http://php.net/ucwords
+     *
+     * @param string $str
+     * @return string with first char of each word uppercase
+     */
+    function utf8_ucwords($str) {
+        // Note: [\x0c\x09\x0b\x0a\x0d\x20] matches;
+        // form feeds, horizontal tabs, vertical tabs, linefeeds and carriage returns
+        // This corresponds to the definition of a "word" defined at http://php.net/ucwords
+        $pattern = '/(^|([\x0c\x09\x0b\x0a\x0d\x20]+))([^\x0c\x09\x0b\x0a\x0d\x20]{1})[^\x0c\x09\x0b\x0a\x0d\x20]*/u';
+
+        return preg_replace_callback($pattern, 'utf8_ucwords_callback',$str);
+    }
+
+    /**
+     * Callback function for preg_replace_callback call in utf8_ucwords
+     * You don't need to call this yourself
+     *
+     * @author Harry Fuecks
+     * @see utf8_ucwords
+     * @see utf8_strtoupper
+     *
+     * @param  array $matches matches corresponding to a single word
+     * @return string with first char of the word in uppercase
+     */
+    function utf8_ucwords_callback($matches) {
+        $leadingws = $matches[2];
+        $ucfirst = utf8_strtoupper($matches[3]);
+        $ucword = utf8_substr_replace(ltrim($matches[0]),$ucfirst,0,1);
+        return $leadingws . $ucword;
+    }
+}
+
+if(!function_exists('utf8_deaccent')){
+    /**
+     * Replace accented UTF-8 characters by unaccented ASCII-7 equivalents
+     *
+     * Use the optional parameter to just deaccent lower ($case = -1) or upper ($case = 1)
+     * letters. Default is to deaccent both cases ($case = 0)
+     *
+     * @author Andreas Gohr <andi@splitbrain.org>
+     *
+     * @param string $string
+     * @param int $case
+     * @return string
+     */
+    function utf8_deaccent($string,$case=0){
+        if($case <= 0){
+            global $UTF8_LOWER_ACCENTS;
+            $string = strtr($string,$UTF8_LOWER_ACCENTS);
+        }
+        if($case >= 0){
+            global $UTF8_UPPER_ACCENTS;
+            $string = strtr($string,$UTF8_UPPER_ACCENTS);
+        }
+        return $string;
+    }
+}
+
+if(!function_exists('utf8_romanize')){
+    /**
+     * Romanize a non-latin string
+     *
+     * @author Andreas Gohr <andi@splitbrain.org>
+     *
+     * @param string $string
+     * @return string
+     */
+    function utf8_romanize($string){
+        if(utf8_isASCII($string)) return $string; //nothing to do
+
+        global $UTF8_ROMANIZATION;
+        return strtr($string,$UTF8_ROMANIZATION);
+    }
+}
+
+if(!function_exists('utf8_stripspecials')){
+    /**
+     * Removes special characters (nonalphanumeric) from a UTF-8 string
+     *
+     * This function adds the controlchars 0x00 to 0x19 to the array of
+     * stripped chars (they are not included in $UTF8_SPECIAL_CHARS)
+     *
+     * @author Andreas Gohr <andi@splitbrain.org>
+     *
+     * @param  string $string     The UTF8 string to strip of special chars
+     * @param  string $repl       Replace special with this string
+     * @param  string $additional Additional chars to strip (used in regexp char class)
+     * @return string
+     */
+    function utf8_stripspecials($string,$repl='',$additional=''){
+        global $UTF8_SPECIAL_CHARS2;
+
+        static $specials = null;
+        if(is_null($specials)){
+            #$specials = preg_quote(unicode_to_utf8($UTF8_SPECIAL_CHARS), '/');
+            $specials = preg_quote($UTF8_SPECIAL_CHARS2, '/');
+        }
+
+        return preg_replace('/['.$additional.'\x00-\x19'.$specials.']/u',$repl,$string);
+    }
+}
+
+if(!function_exists('utf8_strpos')){
+    /**
+     * This is an Unicode aware replacement for strpos
+     *
+     * @author Leo Feyer <leo@typolight.org>
+     * @see    strpos()
+     *
+     * @param  string  $haystack
+     * @param  string  $needle
+     * @param  integer $offset
+     * @return integer
+     */
+    function utf8_strpos($haystack, $needle, $offset=0){
+        $comp = 0;
+        $length = null;
+
+        while (is_null($length) || $length < $offset) {
+            $pos = strpos($haystack, $needle, $offset + $comp);
+
+            if ($pos === false)
+                return false;
+
+            $length = utf8_strlen(substr($haystack, 0, $pos));
+
+            if ($length < $offset)
+                $comp = $pos - $length;
+        }
+
+        return $length;
+    }
+}
+
+if(!function_exists('utf8_tohtml')){
+    /**
+     * Encodes UTF-8 characters to HTML entities
+     *
+     * @author Tom N Harris <tnharris@whoopdedo.org>
+     * @author <vpribish at shopping dot com>
+     * @link   http://php.net/manual/en/function.utf8-decode.php
+     *
+     * @param string $str
+     * @return string
+     */
+    function utf8_tohtml ($str) {
+        $ret = '';
+        foreach (utf8_to_unicode($str) as $cp) {
+            if ($cp < 0x80)
+                $ret .= chr($cp);
+            elseif ($cp < 0x100)
+                $ret .= "&#$cp;";
+            else
+                $ret .= '&#x'.dechex($cp).';';
+        }
+        return $ret;
+    }
+}
+
+if(!function_exists('utf8_unhtml')){
+    /**
+     * Decodes HTML entities to UTF-8 characters
+     *
+     * Convert any &#..; entity to a codepoint,
+     * The entities flag defaults to only decoding numeric entities.
+     * Pass HTML_ENTITIES and named entities, including &amp; &lt; etc.
+     * are handled as well. Avoids the problem that would occur if you
+     * had to decode "&amp;#38;&#38;amp;#38;"
+     *
+     * unhtmlspecialchars(utf8_unhtml($s)) -> "&#38;&#38;"
+     * utf8_unhtml(unhtmlspecialchars($s)) -> "&&amp#38;"
+     * what it should be                   -> "&#38;&amp#38;"
+     *
+     * @author Tom N Harris <tnharris@whoopdedo.org>
+     *
+     * @param  string  $str      UTF-8 encoded string
+     * @param  boolean $entities Flag controlling decoding of named entities.
+     * @return string  UTF-8 encoded string with numeric (and named) entities replaced.
+     */
+    function utf8_unhtml($str, $entities=null) {
+        static $decoder = null;
+        if (is_null($decoder))
+            $decoder = new utf8_entity_decoder();
+        if (is_null($entities))
+            return preg_replace_callback('/(&#([Xx])?([0-9A-Za-z]+);)/m',
+                                         'utf8_decode_numeric', $str);
+        else
+            return preg_replace_callback('/&(#)?([Xx])?([0-9A-Za-z]+);/m',
+                                         array(&$decoder, 'decode'), $str);
+    }
+}
+
+if(!function_exists('utf8_decode_numeric')){
+    /**
+     * Decodes numeric HTML entities to their correct UTF-8 characters
+     *
+     * @param $ent string A numeric entity
+     * @return string|false
+     */
+    function utf8_decode_numeric($ent) {
+        switch ($ent[2]) {
+            case 'X':
+            case 'x':
+                $cp = hexdec($ent[3]);
+                break;
+            default:
+                $cp = intval($ent[3]);
+                break;
+        }
+        return unicode_to_utf8(array($cp));
+    }
+}
+
+if(!class_exists('utf8_entity_decoder')){
+    /**
+     * Encapsulate HTML entity decoding tables
+     */
+    class utf8_entity_decoder {
+        protected $table;
+
+        /**
+         * Initializes the decoding tables
+         */
+        function __construct() {
+            $table = get_html_translation_table(HTML_ENTITIES);
+            $table = array_flip($table);
+            $this->table = array_map(array(&$this,'makeutf8'), $table);
+        }
+
+        /**
+         * Wrapper around unicode_to_utf8()
+         *
+         * @param string $c
+         * @return string|false
+         */
+        function makeutf8($c) {
+            return unicode_to_utf8(array(ord($c)));
+        }
+
+        /**
+         * Decodes any HTML entity to it's correct UTF-8 char equivalent
+         *
+         * @param string $ent An entity
+         * @return string|false
+         */
+        function decode($ent) {
+            if ($ent[1] == '#') {
+                return utf8_decode_numeric($ent);
+            } elseif (array_key_exists($ent[0],$this->table)) {
+                return $this->table[$ent[0]];
+            } else {
+                return $ent[0];
+            }
+        }
+    }
+}
+
+if(!function_exists('utf8_to_unicode')){
+    /**
+     * Takes an UTF-8 string and returns an array of ints representing the
+     * Unicode characters. Astral planes are supported ie. the ints in the
+     * output can be > 0xFFFF. Occurrances of the BOM are ignored. Surrogates
+     * are not allowed.
+     *
+     * If $strict is set to true the function returns false if the input
+     * string isn't a valid UTF-8 octet sequence and raises a PHP error at
+     * level E_USER_WARNING
+     *
+     * Note: this function has been modified slightly in this library to
+     * trigger errors on encountering bad bytes
+     *
+     * @author <hsivonen@iki.fi>
+     * @author Harry Fuecks <hfuecks@gmail.com>
+     * @see    unicode_to_utf8
+     * @link   http://hsivonen.iki.fi/php-utf8/
+     * @link   http://sourceforge.net/projects/phputf8/
+     *
+     * @param  string  $str UTF-8 encoded string
+     * @param  boolean $strict Check for invalid sequences?
+     * @return mixed array of unicode code points or false if UTF-8 invalid
+     */
+    function utf8_to_unicode($str,$strict=false) {
+        $mState = 0;     // cached expected number of octets after the current octet
+                         // until the beginning of the next UTF8 character sequence
+        $mUcs4  = 0;     // cached Unicode character
+        $mBytes = 1;     // cached expected number of octets in the current sequence
+
+        $out = array();
+
+        $len = strlen($str);
+
+        for($i = 0; $i < $len; $i++) {
+
+            $in = ord($str{$i});
+
+            if ( $mState == 0) {
+
+                // When mState is zero we expect either a US-ASCII character or a
+                // multi-octet sequence.
+                if (0 == (0x80 & ($in))) {
+                    // US-ASCII, pass straight through.
+                    $out[] = $in;
+                    $mBytes = 1;
+
+                } else if (0xC0 == (0xE0 & ($in))) {
+                    // First octet of 2 octet sequence
+                    $mUcs4 = ($in);
+                    $mUcs4 = ($mUcs4 & 0x1F) << 6;
+                    $mState = 1;
+                    $mBytes = 2;
+
+                } else if (0xE0 == (0xF0 & ($in))) {
+                    // First octet of 3 octet sequence
+                    $mUcs4 = ($in);
+                    $mUcs4 = ($mUcs4 & 0x0F) << 12;
+                    $mState = 2;
+                    $mBytes = 3;
+
+                } else if (0xF0 == (0xF8 & ($in))) {
+                    // First octet of 4 octet sequence
+                    $mUcs4 = ($in);
+                    $mUcs4 = ($mUcs4 & 0x07) << 18;
+                    $mState = 3;
+                    $mBytes = 4;
+
+                } else if (0xF8 == (0xFC & ($in))) {
+                    /* First octet of 5 octet sequence.
+                     *
+                     * This is illegal because the encoded codepoint must be either
+                     * (a) not the shortest form or
+                     * (b) outside the Unicode range of 0-0x10FFFF.
+                     * Rather than trying to resynchronize, we will carry on until the end
+                     * of the sequence and let the later error handling code catch it.
+                     */
+                    $mUcs4 = ($in);
+                    $mUcs4 = ($mUcs4 & 0x03) << 24;
+                    $mState = 4;
+                    $mBytes = 5;
+
+                } else if (0xFC == (0xFE & ($in))) {
+                    // First octet of 6 octet sequence, see comments for 5 octet sequence.
+                    $mUcs4 = ($in);
+                    $mUcs4 = ($mUcs4 & 1) << 30;
+                    $mState = 5;
+                    $mBytes = 6;
+
+                } elseif($strict) {
+                    /* Current octet is neither in the US-ASCII range nor a legal first
+                     * octet of a multi-octet sequence.
+                     */
+                    trigger_error(
+                            'utf8_to_unicode: Illegal sequence identifier '.
+                                'in UTF-8 at byte '.$i,
+                            E_USER_WARNING
+                        );
+                    return false;
+
+                }
+
+            } else {
+
+                // When mState is non-zero, we expect a continuation of the multi-octet
+                // sequence
+                if (0x80 == (0xC0 & ($in))) {
+
+                    // Legal continuation.
+                    $shift = ($mState - 1) * 6;
+                    $tmp = $in;
+                    $tmp = ($tmp & 0x0000003F) << $shift;
+                    $mUcs4 |= $tmp;
+
+                    /**
+                     * End of the multi-octet sequence. mUcs4 now contains the final
+                     * Unicode codepoint to be output
+                     */
+                    if (0 == --$mState) {
+
+                        /*
+                         * Check for illegal sequences and codepoints.
+                         */
+                        // From Unicode 3.1, non-shortest form is illegal
+                        if (((2 == $mBytes) && ($mUcs4 < 0x0080)) ||
+                            ((3 == $mBytes) && ($mUcs4 < 0x0800)) ||
+                            ((4 == $mBytes) && ($mUcs4 < 0x10000)) ||
+                            (4 < $mBytes) ||
+                            // From Unicode 3.2, surrogate characters are illegal
+                            (($mUcs4 & 0xFFFFF800) == 0xD800) ||
+                            // Codepoints outside the Unicode range are illegal
+                            ($mUcs4 > 0x10FFFF)) {
+
+                            if($strict){
+                                trigger_error(
+                                        'utf8_to_unicode: Illegal sequence or codepoint '.
+                                            'in UTF-8 at byte '.$i,
+                                        E_USER_WARNING
+                                    );
+
+                                return false;
+                            }
+
+                        }
+
+                        if (0xFEFF != $mUcs4) {
+                            // BOM is legal but we don't want to output it
+                            $out[] = $mUcs4;
+                        }
+
+                        //initialize UTF8 cache
+                        $mState = 0;
+                        $mUcs4  = 0;
+                        $mBytes = 1;
+                    }
+
+                } elseif($strict) {
+                    /**
+                     *((0xC0 & (*in) != 0x80) && (mState != 0))
+                     * Incomplete multi-octet sequence.
+                     */
+                    trigger_error(
+                            'utf8_to_unicode: Incomplete multi-octet '.
+                            '   sequence in UTF-8 at byte '.$i,
+                            E_USER_WARNING
+                        );
+
+                    return false;
+                }
+            }
+        }
+        return $out;
+    }
+}
+
+if(!function_exists('unicode_to_utf8')){
+    /**
+     * Takes an array of ints representing the Unicode characters and returns
+     * a UTF-8 string. Astral planes are supported ie. the ints in the
+     * input can be > 0xFFFF. Occurrances of the BOM are ignored. Surrogates
+     * are not allowed.
+     *
+     * If $strict is set to true the function returns false if the input
+     * array contains ints that represent surrogates or are outside the
+     * Unicode range and raises a PHP error at level E_USER_WARNING
+     *
+     * Note: this function has been modified slightly in this library to use
+     * output buffering to concatenate the UTF-8 string (faster) as well as
+     * reference the array by it's keys
+     *
+     * @param  array $arr of unicode code points representing a string
+     * @param  boolean $strict Check for invalid sequences?
+     * @return string|false UTF-8 string or false if array contains invalid code points
+     *
+     * @author <hsivonen@iki.fi>
+     * @author Harry Fuecks <hfuecks@gmail.com>
+     * @see    utf8_to_unicode
+     * @link   http://hsivonen.iki.fi/php-utf8/
+     * @link   http://sourceforge.net/projects/phputf8/
+     */
+    function unicode_to_utf8($arr,$strict=false) {
+        if (!is_array($arr)) return '';
+        ob_start();
+
+        foreach (array_keys($arr) as $k) {
+
+            if ( ($arr[$k] >= 0) && ($arr[$k] <= 0x007f) ) {
+                # ASCII range (including control chars)
+
+                echo chr($arr[$k]);
+
+            } else if ($arr[$k] <= 0x07ff) {
+                # 2 byte sequence
+
+                echo chr(0xc0 | ($arr[$k] >> 6));
+                echo chr(0x80 | ($arr[$k] & 0x003f));
+
+            } else if($arr[$k] == 0xFEFF) {
+                # Byte order mark (skip)
+
+                // nop -- zap the BOM
+
+            } else if ($arr[$k] >= 0xD800 && $arr[$k] <= 0xDFFF) {
+                # Test for illegal surrogates
+
+                // found a surrogate
+                if($strict){
+                    trigger_error(
+                        'unicode_to_utf8: Illegal surrogate '.
+                            'at index: '.$k.', value: '.$arr[$k],
+                        E_USER_WARNING
+                        );
+                    return false;
+                }
+
+            } else if ($arr[$k] <= 0xffff) {
+                # 3 byte sequence
+
+                echo chr(0xe0 | ($arr[$k] >> 12));
+                echo chr(0x80 | (($arr[$k] >> 6) & 0x003f));
+                echo chr(0x80 | ($arr[$k] & 0x003f));
+
+            } else if ($arr[$k] <= 0x10ffff) {
+                # 4 byte sequence
+
+                echo chr(0xf0 | ($arr[$k] >> 18));
+                echo chr(0x80 | (($arr[$k] >> 12) & 0x3f));
+                echo chr(0x80 | (($arr[$k] >> 6) & 0x3f));
+                echo chr(0x80 | ($arr[$k] & 0x3f));
+
+            } elseif($strict) {
+
+                trigger_error(
+                    'unicode_to_utf8: Codepoint out of Unicode range '.
+                        'at index: '.$k.', value: '.$arr[$k],
+                    E_USER_WARNING
+                    );
+
+                // out of range
+                return false;
+            }
+        }
+
+        $result = ob_get_contents();
+        ob_end_clean();
+        return $result;
+    }
+}
+
+if(!function_exists('utf8_to_utf16be')){
+    /**
+     * UTF-8 to UTF-16BE conversion.
+     *
+     * Maybe really UCS-2 without mb_string due to utf8_to_unicode limits
+     *
+     * @param string $str
+     * @param bool $bom
+     * @return string
+     */
+    function utf8_to_utf16be(&$str, $bom = false) {
+        $out = $bom ? "\xFE\xFF" : '';
+        if(UTF8_MBSTRING) return $out.mb_convert_encoding($str,'UTF-16BE','UTF-8');
+
+        $uni = utf8_to_unicode($str);
+        foreach($uni as $cp){
+            $out .= pack('n',$cp);
+        }
+        return $out;
+    }
+}
+
+if(!function_exists('utf16be_to_utf8')){
+    /**
+     * UTF-8 to UTF-16BE conversion.
+     *
+     * Maybe really UCS-2 without mb_string due to utf8_to_unicode limits
+     *
+     * @param string $str
+     * @return false|string
+     */
+    function utf16be_to_utf8(&$str) {
+        $uni = unpack('n*',$str);
+        return unicode_to_utf8($uni);
+    }
+}
+
+if(!function_exists('utf8_bad_replace')){
+    /**
+     * Replace bad bytes with an alternative character
+     *
+     * ASCII character is recommended for replacement char
+     *
+     * PCRE Pattern to locate bad bytes in a UTF-8 string
+     * Comes from W3 FAQ: Multilingual Forms
+     * Note: modified to include full ASCII range including control chars
+     *
+     * @author Harry Fuecks <hfuecks@gmail.com>
+     * @see http://www.w3.org/International/questions/qa-forms-utf-8
+     *
+     * @param string $str to search
+     * @param string $replace to replace bad bytes with (defaults to '?') - use ASCII
+     * @return string
+     */
+    function utf8_bad_replace($str, $replace = '') {
+        $UTF8_BAD =
+         '([\x00-\x7F]'.                          # ASCII (including control chars)
+         '|[\xC2-\xDF][\x80-\xBF]'.               # non-overlong 2-byte
+         '|\xE0[\xA0-\xBF][\x80-\xBF]'.           # excluding overlongs
+         '|[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}'.    # straight 3-byte
+         '|\xED[\x80-\x9F][\x80-\xBF]'.           # excluding surrogates
+         '|\xF0[\x90-\xBF][\x80-\xBF]{2}'.        # planes 1-3
+         '|[\xF1-\xF3][\x80-\xBF]{3}'.            # planes 4-15
+         '|\xF4[\x80-\x8F][\x80-\xBF]{2}'.        # plane 16
+         '|(.{1}))';                              # invalid byte
+        ob_start();
+        while (preg_match('/'.$UTF8_BAD.'/S', $str, $matches)) {
+            if ( !isset($matches[2])) {
+                echo $matches[0];
+            } else {
+                echo $replace;
+            }
+            $str = substr($str,strlen($matches[0]));
+        }
+        $result = ob_get_contents();
+        ob_end_clean();
+        return $result;
+    }
+}
+
+if(!function_exists('utf8_correctIdx')){
+    /**
+     * adjust a byte index into a utf8 string to a utf8 character boundary
+     *
+     * @param string $str   utf8 character string
+     * @param int    $i     byte index into $str
+     * @param $next  bool     direction to search for boundary,
+     *                           false = up (current character)
+     *                           true = down (next character)
+     *
+     * @return int            byte index into $str now pointing to a utf8 character boundary
+     *
+     * @author       chris smith <chris@jalakai.co.uk>
+     */
+    function utf8_correctIdx(&$str,$i,$next=false) {
+
+        if ($i <= 0) return 0;
+
+        $limit = strlen($str);
+        if ($i>=$limit) return $limit;
+
+        if ($next) {
+            while (($i<$limit) && ((ord($str[$i]) & 0xC0) == 0x80)) $i++;
+        } else {
+            while ($i && ((ord($str[$i]) & 0xC0) == 0x80)) $i--;
+        }
+
+        return $i;
+    }
+}
+
+// only needed if no mb_string available
+if(!UTF8_MBSTRING){
+    /**
+     * UTF-8 Case lookup table
+     *
+     * This lookuptable defines the upper case letters to their correspponding
+     * lower case letter in UTF-8
+     *
+     * @author Andreas Gohr <andi@splitbrain.org>
+     */
+    global $UTF8_LOWER_TO_UPPER;
+    if(empty($UTF8_LOWER_TO_UPPER)) $UTF8_LOWER_TO_UPPER = array(
+            "z"=>"Z","y"=>"Y","x"=>"X","w"=>"W","v"=>"V","u"=>"U","t"=>"T","s"=>"S","r"=>"R","q"=>"Q",
+            "p"=>"P","o"=>"O","n"=>"N","m"=>"M","l"=>"L","k"=>"K","j"=>"J","i"=>"I","h"=>"H","g"=>"G",
+            "f"=>"F","e"=>"E","d"=>"D","c"=>"C","b"=>"B","a"=>"A","ῳ"=>"ῼ","ῥ"=>"Ῥ","ῡ"=>"Ῡ","ῑ"=>"Ῑ",
+            "ῐ"=>"Ῐ","ῃ"=>"ῌ","ι"=>"Ι","ᾳ"=>"ᾼ","ᾱ"=>"Ᾱ","ᾰ"=>"Ᾰ","ᾧ"=>"ᾯ","ᾦ"=>"ᾮ","ᾥ"=>"ᾭ","ᾤ"=>"ᾬ",
+            "ᾣ"=>"ᾫ","ᾢ"=>"ᾪ","ᾡ"=>"ᾩ","ᾗ"=>"ᾟ","ᾖ"=>"ᾞ","ᾕ"=>"ᾝ","ᾔ"=>"ᾜ","ᾓ"=>"ᾛ","ᾒ"=>"ᾚ","ᾑ"=>"ᾙ",
+            "ᾐ"=>"ᾘ","ᾇ"=>"ᾏ","ᾆ"=>"ᾎ","ᾅ"=>"ᾍ","ᾄ"=>"ᾌ","ᾃ"=>"ᾋ","ᾂ"=>"ᾊ","ᾁ"=>"ᾉ","ᾀ"=>"ᾈ","ώ"=>"Ώ",
+            "ὼ"=>"Ὼ","ύ"=>"Ύ","ὺ"=>"Ὺ","ό"=>"Ό","ὸ"=>"Ὸ","ί"=>"Ί","ὶ"=>"Ὶ","ή"=>"Ή","ὴ"=>"Ὴ","έ"=>"Έ",
+            "ὲ"=>"Ὲ","ά"=>"Ά","ὰ"=>"Ὰ","ὧ"=>"Ὧ","ὦ"=>"Ὦ","ὥ"=>"Ὥ","ὤ"=>"Ὤ","ὣ"=>"Ὣ","ὢ"=>"Ὢ","ὡ"=>"Ὡ",
+            "ὗ"=>"Ὗ","ὕ"=>"Ὕ","ὓ"=>"Ὓ","ὑ"=>"Ὑ","ὅ"=>"Ὅ","ὄ"=>"Ὄ","ὃ"=>"Ὃ","ὂ"=>"Ὂ","ὁ"=>"Ὁ","ὀ"=>"Ὀ",
+            "ἷ"=>"Ἷ","ἶ"=>"Ἶ","ἵ"=>"Ἵ","ἴ"=>"Ἴ","ἳ"=>"Ἳ","ἲ"=>"Ἲ","ἱ"=>"Ἱ","ἰ"=>"Ἰ","ἧ"=>"Ἧ","ἦ"=>"Ἦ",
+            "ἥ"=>"Ἥ","ἤ"=>"Ἤ","ἣ"=>"Ἣ","ἢ"=>"Ἢ","ἡ"=>"Ἡ","ἕ"=>"Ἕ","ἔ"=>"Ἔ","ἓ"=>"Ἓ","ἒ"=>"Ἒ","ἑ"=>"Ἑ",
+            "ἐ"=>"Ἐ","ἇ"=>"Ἇ","ἆ"=>"Ἆ","ἅ"=>"Ἅ","ἄ"=>"Ἄ","ἃ"=>"Ἃ","ἂ"=>"Ἂ","ἁ"=>"Ἁ","ἀ"=>"Ἀ","ỹ"=>"Ỹ",
+            "ỷ"=>"Ỷ","ỵ"=>"Ỵ","ỳ"=>"Ỳ","ự"=>"Ự","ữ"=>"Ữ","ử"=>"Ử","ừ"=>"Ừ","ứ"=>"Ứ","ủ"=>"Ủ","ụ"=>"Ụ",
+            "ợ"=>"Ợ","ỡ"=>"Ỡ","ở"=>"Ở","ờ"=>"Ờ","ớ"=>"Ớ","ộ"=>"Ộ","ỗ"=>"Ỗ","ổ"=>"Ổ","ồ"=>"Ồ","ố"=>"Ố",
+            "ỏ"=>"Ỏ","ọ"=>"Ọ","ị"=>"Ị","ỉ"=>"Ỉ","ệ"=>"Ệ","ễ"=>"Ễ","ể"=>"Ể","ề"=>"Ề","ế"=>"Ế","ẽ"=>"Ẽ",
+            "ẻ"=>"Ẻ","ẹ"=>"Ẹ","ặ"=>"Ặ","ẵ"=>"Ẵ","ẳ"=>"Ẳ","ằ"=>"Ằ","ắ"=>"Ắ","ậ"=>"Ậ","ẫ"=>"Ẫ","ẩ"=>"Ẩ",
+            "ầ"=>"Ầ","ấ"=>"Ấ","ả"=>"Ả","ạ"=>"Ạ","ẛ"=>"Ṡ","ẕ"=>"Ẕ","ẓ"=>"Ẓ","ẑ"=>"Ẑ","ẏ"=>"Ẏ","ẍ"=>"Ẍ",
+            "ẋ"=>"Ẋ","ẉ"=>"Ẉ","ẇ"=>"Ẇ","ẅ"=>"Ẅ","ẃ"=>"Ẃ","ẁ"=>"Ẁ","ṿ"=>"Ṿ","ṽ"=>"Ṽ","ṻ"=>"Ṻ","ṹ"=>"Ṹ",
+            "ṷ"=>"Ṷ","ṵ"=>"Ṵ","ṳ"=>"Ṳ","ṱ"=>"Ṱ","ṯ"=>"Ṯ","ṭ"=>"Ṭ","ṫ"=>"Ṫ","ṩ"=>"Ṩ","ṧ"=>"Ṧ","ṥ"=>"Ṥ",
+            "ṣ"=>"Ṣ","ṡ"=>"Ṡ","ṟ"=>"Ṟ","ṝ"=>"Ṝ","ṛ"=>"Ṛ","ṙ"=>"Ṙ","ṗ"=>"Ṗ","ṕ"=>"Ṕ","ṓ"=>"Ṓ","ṑ"=>"Ṑ",
+            "ṏ"=>"Ṏ","ṍ"=>"Ṍ","ṋ"=>"Ṋ","ṉ"=>"Ṉ","ṇ"=>"Ṇ","ṅ"=>"Ṅ","ṃ"=>"Ṃ","ṁ"=>"Ṁ","ḿ"=>"Ḿ","ḽ"=>"Ḽ",
+            "ḻ"=>"Ḻ","ḹ"=>"Ḹ","ḷ"=>"Ḷ","ḵ"=>"Ḵ","ḳ"=>"Ḳ","ḱ"=>"Ḱ","ḯ"=>"Ḯ","ḭ"=>"Ḭ","ḫ"=>"Ḫ","ḩ"=>"Ḩ",
+            "ḧ"=>"Ḧ","ḥ"=>"Ḥ","ḣ"=>"Ḣ","ḡ"=>"Ḡ","ḟ"=>"Ḟ","ḝ"=>"Ḝ","ḛ"=>"Ḛ","ḙ"=>"Ḙ","ḗ"=>"Ḗ","ḕ"=>"Ḕ",
+            "ḓ"=>"Ḓ","ḑ"=>"Ḑ","ḏ"=>"Ḏ","ḍ"=>"Ḍ","ḋ"=>"Ḋ","ḉ"=>"Ḉ","ḇ"=>"Ḇ","ḅ"=>"Ḅ","ḃ"=>"Ḃ","ḁ"=>"Ḁ",
+            "ֆ"=>"Ֆ","օ"=>"Օ","ք"=>"Ք","փ"=>"Փ","ւ"=>"Ւ","ց"=>"Ց","ր"=>"Ր","տ"=>"Տ","վ"=>"Վ","ս"=>"Ս",
+            "ռ"=>"Ռ","ջ"=>"Ջ","պ"=>"Պ","չ"=>"Չ","ո"=>"Ո","շ"=>"Շ","ն"=>"Ն","յ"=>"Յ","մ"=>"Մ","ճ"=>"Ճ",
+            "ղ"=>"Ղ","ձ"=>"Ձ","հ"=>"Հ","կ"=>"Կ","ծ"=>"Ծ","խ"=>"Խ","լ"=>"Լ","ի"=>"Ի","ժ"=>"Ժ","թ"=>"Թ",
+            "ը"=>"Ը","է"=>"Է","զ"=>"Զ","ե"=>"Ե","դ"=>"Դ","գ"=>"Գ","բ"=>"Բ","ա"=>"Ա","ԏ"=>"Ԏ","ԍ"=>"Ԍ",
+            "ԋ"=>"Ԋ","ԉ"=>"Ԉ","ԇ"=>"Ԇ","ԅ"=>"Ԅ","ԃ"=>"Ԃ","ԁ"=>"Ԁ","ӹ"=>"Ӹ","ӵ"=>"Ӵ","ӳ"=>"Ӳ","ӱ"=>"Ӱ",
+            "ӯ"=>"Ӯ","ӭ"=>"Ӭ","ӫ"=>"Ӫ","ө"=>"Ө","ӧ"=>"Ӧ","ӥ"=>"Ӥ","ӣ"=>"Ӣ","ӡ"=>"Ӡ","ӟ"=>"Ӟ","ӝ"=>"Ӝ",
+            "ӛ"=>"Ӛ","ә"=>"Ә","ӗ"=>"Ӗ","ӕ"=>"Ӕ","ӓ"=>"Ӓ","ӑ"=>"Ӑ","ӎ"=>"Ӎ","ӌ"=>"Ӌ","ӊ"=>"Ӊ","ӈ"=>"Ӈ",
+            "ӆ"=>"Ӆ","ӄ"=>"Ӄ","ӂ"=>"Ӂ","ҿ"=>"Ҿ","ҽ"=>"Ҽ","һ"=>"Һ","ҹ"=>"Ҹ","ҷ"=>"Ҷ","ҵ"=>"Ҵ","ҳ"=>"Ҳ",
+            "ұ"=>"Ұ","ү"=>"Ү","ҭ"=>"Ҭ","ҫ"=>"Ҫ","ҩ"=>"Ҩ","ҧ"=>"Ҧ","ҥ"=>"Ҥ","ң"=>"Ң","ҡ"=>"Ҡ","ҟ"=>"Ҟ",
+            "ҝ"=>"Ҝ","қ"=>"Қ","ҙ"=>"Ҙ","җ"=>"Җ","ҕ"=>"Ҕ","ғ"=>"Ғ","ґ"=>"Ґ","ҏ"=>"Ҏ","ҍ"=>"Ҍ","ҋ"=>"Ҋ",
+            "ҁ"=>"Ҁ","ѿ"=>"Ѿ","ѽ"=>"Ѽ","ѻ"=>"Ѻ","ѹ"=>"Ѹ","ѷ"=>"Ѷ","ѵ"=>"Ѵ","ѳ"=>"Ѳ","ѱ"=>"Ѱ","ѯ"=>"Ѯ",
+            "ѭ"=>"Ѭ","ѫ"=>"Ѫ","ѩ"=>"Ѩ","ѧ"=>"Ѧ","ѥ"=>"Ѥ","ѣ"=>"Ѣ","ѡ"=>"Ѡ","џ"=>"Џ","ў"=>"Ў","ѝ"=>"Ѝ",
+            "ќ"=>"Ќ","ћ"=>"Ћ","њ"=>"Њ","љ"=>"Љ","ј"=>"Ј","ї"=>"Ї","і"=>"І","ѕ"=>"Ѕ","є"=>"Є","ѓ"=>"Ѓ",
+            "ђ"=>"Ђ","ё"=>"Ё","ѐ"=>"Ѐ","я"=>"Я","ю"=>"Ю","э"=>"Э","ь"=>"Ь","ы"=>"Ы","ъ"=>"Ъ","щ"=>"Щ",
+            "ш"=>"Ш","ч"=>"Ч","ц"=>"Ц","х"=>"Х","ф"=>"Ф","у"=>"У","т"=>"Т","с"=>"С","р"=>"Р","п"=>"П",
+            "о"=>"О","н"=>"Н","м"=>"М","л"=>"Л","к"=>"К","й"=>"Й","и"=>"И","з"=>"З","ж"=>"Ж","е"=>"Е",
+            "д"=>"Д","г"=>"Г","в"=>"В","б"=>"Б","а"=>"А","ϵ"=>"Ε","ϲ"=>"Σ","ϱ"=>"Ρ","ϰ"=>"Κ","ϯ"=>"Ϯ",
+            "ϭ"=>"Ϭ","ϫ"=>"Ϫ","ϩ"=>"Ϩ","ϧ"=>"Ϧ","ϥ"=>"Ϥ","ϣ"=>"Ϣ","ϡ"=>"Ϡ","ϟ"=>"Ϟ","ϝ"=>"Ϝ","ϛ"=>"Ϛ",
+            "ϙ"=>"Ϙ","ϖ"=>"Π","ϕ"=>"Φ","ϑ"=>"Θ","ϐ"=>"Β","ώ"=>"Ώ","ύ"=>"Ύ","ό"=>"Ό","ϋ"=>"Ϋ","ϊ"=>"Ϊ",
+            "ω"=>"Ω","ψ"=>"Ψ","χ"=>"Χ","φ"=>"Φ","υ"=>"Υ","τ"=>"Τ","σ"=>"Σ","ς"=>"Σ","ρ"=>"Ρ","π"=>"Π",
+            "ο"=>"Ο","ξ"=>"Ξ","ν"=>"Ν","μ"=>"Μ","λ"=>"Λ","κ"=>"Κ","ι"=>"Ι","θ"=>"Θ","η"=>"Η","ζ"=>"Ζ",
+            "ε"=>"Ε","δ"=>"Δ","γ"=>"Γ","β"=>"Β","α"=>"Α","ί"=>"Ί","ή"=>"Ή","έ"=>"Έ","ά"=>"Ά","ʒ"=>"Ʒ",
+            "ʋ"=>"Ʋ","ʊ"=>"Ʊ","ʈ"=>"Ʈ","ʃ"=>"Ʃ","ʀ"=>"Ʀ","ɵ"=>"Ɵ","ɲ"=>"Ɲ","ɯ"=>"Ɯ","ɩ"=>"Ɩ","ɨ"=>"Ɨ",
+            "ɣ"=>"Ɣ","ɛ"=>"Ɛ","ə"=>"Ə","ɗ"=>"Ɗ","ɖ"=>"Ɖ","ɔ"=>"Ɔ","ɓ"=>"Ɓ","ȳ"=>"Ȳ","ȱ"=>"Ȱ","ȯ"=>"Ȯ",
+            "ȭ"=>"Ȭ","ȫ"=>"Ȫ","ȩ"=>"Ȩ","ȧ"=>"Ȧ","ȥ"=>"Ȥ","ȣ"=>"Ȣ","ȟ"=>"Ȟ","ȝ"=>"Ȝ","ț"=>"Ț","ș"=>"Ș",
+            "ȗ"=>"Ȗ","ȕ"=>"Ȕ","ȓ"=>"Ȓ","ȑ"=>"Ȑ","ȏ"=>"Ȏ","ȍ"=>"Ȍ","ȋ"=>"Ȋ","ȉ"=>"Ȉ","ȇ"=>"Ȇ","ȅ"=>"Ȅ",
+            "ȃ"=>"Ȃ","ȁ"=>"Ȁ","ǿ"=>"Ǿ","ǽ"=>"Ǽ","ǻ"=>"Ǻ","ǹ"=>"Ǹ","ǵ"=>"Ǵ","dz"=>"Dz","ǯ"=>"Ǯ","ǭ"=>"Ǭ",
+            "ǫ"=>"Ǫ","ǩ"=>"Ǩ","ǧ"=>"Ǧ","ǥ"=>"Ǥ","ǣ"=>"Ǣ","ǡ"=>"Ǡ","ǟ"=>"Ǟ","ǝ"=>"Ǝ","ǜ"=>"Ǜ","ǚ"=>"Ǚ",
+            "ǘ"=>"Ǘ","ǖ"=>"Ǖ","ǔ"=>"Ǔ","ǒ"=>"Ǒ","ǐ"=>"Ǐ","ǎ"=>"Ǎ","nj"=>"Nj","lj"=>"Lj","dž"=>"Dž","ƿ"=>"Ƿ",
+            "ƽ"=>"Ƽ","ƹ"=>"Ƹ","ƶ"=>"Ƶ","ƴ"=>"Ƴ","ư"=>"Ư","ƭ"=>"Ƭ","ƨ"=>"Ƨ","ƥ"=>"Ƥ","ƣ"=>"Ƣ","ơ"=>"Ơ",
+            "ƞ"=>"Ƞ","ƙ"=>"Ƙ","ƕ"=>"Ƕ","ƒ"=>"Ƒ","ƌ"=>"Ƌ","ƈ"=>"Ƈ","ƅ"=>"Ƅ","ƃ"=>"Ƃ","ſ"=>"S","ž"=>"Ž",
+            "ż"=>"Ż","ź"=>"Ź","ŷ"=>"Ŷ","ŵ"=>"Ŵ","ų"=>"Ų","ű"=>"Ű","ů"=>"Ů","ŭ"=>"Ŭ","ū"=>"Ū","ũ"=>"Ũ",
+            "ŧ"=>"Ŧ","ť"=>"Ť","ţ"=>"Ţ","š"=>"Š","ş"=>"Ş","ŝ"=>"Ŝ","ś"=>"Ś","ř"=>"Ř","ŗ"=>"Ŗ","ŕ"=>"Ŕ",
+            "œ"=>"Œ","ő"=>"Ő","ŏ"=>"Ŏ","ō"=>"Ō","ŋ"=>"Ŋ","ň"=>"Ň","ņ"=>"Ņ","ń"=>"Ń","ł"=>"Ł","ŀ"=>"Ŀ",
+            "ľ"=>"Ľ","ļ"=>"Ļ","ĺ"=>"Ĺ","ķ"=>"Ķ","ĵ"=>"Ĵ","ij"=>"IJ","ı"=>"I","į"=>"Į","ĭ"=>"Ĭ","ī"=>"Ī",
+            "ĩ"=>"Ĩ","ħ"=>"Ħ","ĥ"=>"Ĥ","ģ"=>"Ģ","ġ"=>"Ġ","ğ"=>"Ğ","ĝ"=>"Ĝ","ě"=>"Ě","ę"=>"Ę","ė"=>"Ė",
+            "ĕ"=>"Ĕ","ē"=>"Ē","đ"=>"Đ","ď"=>"Ď","č"=>"Č","ċ"=>"Ċ","ĉ"=>"Ĉ","ć"=>"Ć","ą"=>"Ą","ă"=>"Ă",
+            "ā"=>"Ā","ÿ"=>"Ÿ","þ"=>"Þ","ý"=>"Ý","ü"=>"Ü","û"=>"Û","ú"=>"Ú","ù"=>"Ù","ø"=>"Ø","ö"=>"Ö",
+            "õ"=>"Õ","ô"=>"Ô","ó"=>"Ó","ò"=>"Ò","ñ"=>"Ñ","ð"=>"Ð","ï"=>"Ï","î"=>"Î","í"=>"Í","ì"=>"Ì",
+            "ë"=>"Ë","ê"=>"Ê","é"=>"É","è"=>"È","ç"=>"Ç","æ"=>"Æ","å"=>"Å","ä"=>"Ä","ã"=>"Ã","â"=>"Â",
+            "á"=>"Á","à"=>"À","µ"=>"Μ","z"=>"Z","y"=>"Y","x"=>"X","w"=>"W","v"=>"V","u"=>"U","t"=>"T",
+            "s"=>"S","r"=>"R","q"=>"Q","p"=>"P","o"=>"O","n"=>"N","m"=>"M","l"=>"L","k"=>"K","j"=>"J",
+            "i"=>"I","h"=>"H","g"=>"G","f"=>"F","e"=>"E","d"=>"D","c"=>"C","b"=>"B","a"=>"A"
+                );
+
+    /**
+     * UTF-8 Case lookup table
+     *
+     * This lookuptable defines the lower case letters to their corresponding
+     * upper case letter in UTF-8
+     *
+     * @author Andreas Gohr <andi@splitbrain.org>
+     */
+    global $UTF8_UPPER_TO_LOWER;
+    if(empty($UTF8_UPPER_TO_LOWER)) $UTF8_UPPER_TO_LOWER = array (
+            "Z"=>"z","Y"=>"y","X"=>"x","W"=>"w","V"=>"v","U"=>"u","T"=>"t","S"=>"s","R"=>"r","Q"=>"q",
+            "P"=>"p","O"=>"o","N"=>"n","M"=>"m","L"=>"l","K"=>"k","J"=>"j","I"=>"i","H"=>"h","G"=>"g",
+            "F"=>"f","E"=>"e","D"=>"d","C"=>"c","B"=>"b","A"=>"a","ῼ"=>"ῳ","Ῥ"=>"ῥ","Ῡ"=>"ῡ","Ῑ"=>"ῑ",
+            "Ῐ"=>"ῐ","ῌ"=>"ῃ","Ι"=>"ι","ᾼ"=>"ᾳ","Ᾱ"=>"ᾱ","Ᾰ"=>"ᾰ","ᾯ"=>"ᾧ","ᾮ"=>"ᾦ","ᾭ"=>"ᾥ","ᾬ"=>"ᾤ",
+            "ᾫ"=>"ᾣ","ᾪ"=>"ᾢ","ᾩ"=>"ᾡ","ᾟ"=>"ᾗ","ᾞ"=>"ᾖ","ᾝ"=>"ᾕ","ᾜ"=>"ᾔ","ᾛ"=>"ᾓ","ᾚ"=>"ᾒ","ᾙ"=>"ᾑ",
+            "ᾘ"=>"ᾐ","ᾏ"=>"ᾇ","ᾎ"=>"ᾆ","ᾍ"=>"ᾅ","ᾌ"=>"ᾄ","ᾋ"=>"ᾃ","ᾊ"=>"ᾂ","ᾉ"=>"ᾁ","ᾈ"=>"ᾀ","Ώ"=>"ώ",
+            "Ὼ"=>"ὼ","Ύ"=>"ύ","Ὺ"=>"ὺ","Ό"=>"ό","Ὸ"=>"ὸ","Ί"=>"ί","Ὶ"=>"ὶ","Ή"=>"ή","Ὴ"=>"ὴ","Έ"=>"έ",
+            "Ὲ"=>"ὲ","Ά"=>"ά","Ὰ"=>"ὰ","Ὧ"=>"ὧ","Ὦ"=>"ὦ","Ὥ"=>"ὥ","Ὤ"=>"ὤ","Ὣ"=>"ὣ","Ὢ"=>"ὢ","Ὡ"=>"ὡ",
+            "Ὗ"=>"ὗ","Ὕ"=>"ὕ","Ὓ"=>"ὓ","Ὑ"=>"ὑ","Ὅ"=>"ὅ","Ὄ"=>"ὄ","Ὃ"=>"ὃ","Ὂ"=>"ὂ","Ὁ"=>"ὁ","Ὀ"=>"ὀ",
+            "Ἷ"=>"ἷ","Ἶ"=>"ἶ","Ἵ"=>"ἵ","Ἴ"=>"ἴ","Ἳ"=>"ἳ","Ἲ"=>"ἲ","Ἱ"=>"ἱ","Ἰ"=>"ἰ","Ἧ"=>"ἧ","Ἦ"=>"ἦ",
+            "Ἥ"=>"ἥ","Ἤ"=>"ἤ","Ἣ"=>"ἣ","Ἢ"=>"ἢ","Ἡ"=>"ἡ","Ἕ"=>"ἕ","Ἔ"=>"ἔ","Ἓ"=>"ἓ","Ἒ"=>"ἒ","Ἑ"=>"ἑ",
+            "Ἐ"=>"ἐ","Ἇ"=>"ἇ","Ἆ"=>"ἆ","Ἅ"=>"ἅ","Ἄ"=>"ἄ","Ἃ"=>"ἃ","Ἂ"=>"ἂ","Ἁ"=>"ἁ","Ἀ"=>"ἀ","Ỹ"=>"ỹ",
+            "Ỷ"=>"ỷ","Ỵ"=>"ỵ","Ỳ"=>"ỳ","Ự"=>"ự","Ữ"=>"ữ","Ử"=>"ử","Ừ"=>"ừ","Ứ"=>"ứ","Ủ"=>"ủ","Ụ"=>"ụ",
+            "Ợ"=>"ợ","Ỡ"=>"ỡ","Ở"=>"ở","Ờ"=>"ờ","Ớ"=>"ớ","Ộ"=>"ộ","Ỗ"=>"ỗ","Ổ"=>"ổ","Ồ"=>"ồ","Ố"=>"ố",
+            "Ỏ"=>"ỏ","Ọ"=>"ọ","Ị"=>"ị","Ỉ"=>"ỉ","Ệ"=>"ệ","Ễ"=>"ễ","Ể"=>"ể","Ề"=>"ề","Ế"=>"ế","Ẽ"=>"ẽ",
+            "Ẻ"=>"ẻ","Ẹ"=>"ẹ","Ặ"=>"ặ","Ẵ"=>"ẵ","Ẳ"=>"ẳ","Ằ"=>"ằ","Ắ"=>"ắ","Ậ"=>"ậ","Ẫ"=>"ẫ","Ẩ"=>"ẩ",
+            "Ầ"=>"ầ","Ấ"=>"ấ","Ả"=>"ả","Ạ"=>"ạ","Ṡ"=>"ẛ","Ẕ"=>"ẕ","Ẓ"=>"ẓ","Ẑ"=>"ẑ","Ẏ"=>"ẏ","Ẍ"=>"ẍ",
+            "Ẋ"=>"ẋ","Ẉ"=>"ẉ","Ẇ"=>"ẇ","Ẅ"=>"ẅ","Ẃ"=>"ẃ","Ẁ"=>"ẁ","Ṿ"=>"ṿ","Ṽ"=>"ṽ","Ṻ"=>"ṻ","Ṹ"=>"ṹ",
+            "Ṷ"=>"ṷ","Ṵ"=>"ṵ","Ṳ"=>"ṳ","Ṱ"=>"ṱ","Ṯ"=>"ṯ","Ṭ"=>"ṭ","Ṫ"=>"ṫ","Ṩ"=>"ṩ","Ṧ"=>"ṧ","Ṥ"=>"ṥ",
+            "Ṣ"=>"ṣ","Ṡ"=>"ṡ","Ṟ"=>"ṟ","Ṝ"=>"ṝ","Ṛ"=>"ṛ","Ṙ"=>"ṙ","Ṗ"=>"ṗ","Ṕ"=>"ṕ","Ṓ"=>"ṓ","Ṑ"=>"ṑ",
+            "Ṏ"=>"ṏ","Ṍ"=>"ṍ","Ṋ"=>"ṋ","Ṉ"=>"ṉ","Ṇ"=>"ṇ","Ṅ"=>"ṅ","Ṃ"=>"ṃ","Ṁ"=>"ṁ","Ḿ"=>"ḿ","Ḽ"=>"ḽ",
+            "Ḻ"=>"ḻ","Ḹ"=>"ḹ","Ḷ"=>"ḷ","Ḵ"=>"ḵ","Ḳ"=>"ḳ","Ḱ"=>"ḱ","Ḯ"=>"ḯ","Ḭ"=>"ḭ","Ḫ"=>"ḫ","Ḩ"=>"ḩ",
+            "Ḧ"=>"ḧ","Ḥ"=>"ḥ","Ḣ"=>"ḣ","Ḡ"=>"ḡ","Ḟ"=>"ḟ","Ḝ"=>"ḝ","Ḛ"=>"ḛ","Ḙ"=>"ḙ","Ḗ"=>"ḗ","Ḕ"=>"ḕ",
+            "Ḓ"=>"ḓ","Ḑ"=>"ḑ","Ḏ"=>"ḏ","Ḍ"=>"ḍ","Ḋ"=>"ḋ","Ḉ"=>"ḉ","Ḇ"=>"ḇ","Ḅ"=>"ḅ","Ḃ"=>"ḃ","Ḁ"=>"ḁ",
+            "Ֆ"=>"ֆ","Օ"=>"օ","Ք"=>"ք","Փ"=>"փ","Ւ"=>"ւ","Ց"=>"ց","Ր"=>"ր","Տ"=>"տ","Վ"=>"վ","Ս"=>"ս",
+            "Ռ"=>"ռ","Ջ"=>"ջ","Պ"=>"պ","Չ"=>"չ","Ո"=>"ո","Շ"=>"շ","Ն"=>"ն","Յ"=>"յ","Մ"=>"մ","Ճ"=>"ճ",
+            "Ղ"=>"ղ","Ձ"=>"ձ","Հ"=>"հ","Կ"=>"կ","Ծ"=>"ծ","Խ"=>"խ","Լ"=>"լ","Ի"=>"ի","Ժ"=>"ժ","Թ"=>"թ",
+            "Ը"=>"ը","Է"=>"է","Զ"=>"զ","Ե"=>"ե","Դ"=>"դ","Գ"=>"գ","Բ"=>"բ","Ա"=>"ա","Ԏ"=>"ԏ","Ԍ"=>"ԍ",
+            "Ԋ"=>"ԋ","Ԉ"=>"ԉ","Ԇ"=>"ԇ","Ԅ"=>"ԅ","Ԃ"=>"ԃ","Ԁ"=>"ԁ","Ӹ"=>"ӹ","Ӵ"=>"ӵ","Ӳ"=>"ӳ","Ӱ"=>"ӱ",
+            "Ӯ"=>"ӯ","Ӭ"=>"ӭ","Ӫ"=>"ӫ","Ө"=>"ө","Ӧ"=>"ӧ","Ӥ"=>"ӥ","Ӣ"=>"ӣ","Ӡ"=>"ӡ","Ӟ"=>"ӟ","Ӝ"=>"ӝ",
+            "Ӛ"=>"ӛ","Ә"=>"ә","Ӗ"=>"ӗ","Ӕ"=>"ӕ","Ӓ"=>"ӓ","Ӑ"=>"ӑ","Ӎ"=>"ӎ","Ӌ"=>"ӌ","Ӊ"=>"ӊ","Ӈ"=>"ӈ",
+            "Ӆ"=>"ӆ","Ӄ"=>"ӄ","Ӂ"=>"ӂ","Ҿ"=>"ҿ","Ҽ"=>"ҽ","Һ"=>"һ","Ҹ"=>"ҹ","Ҷ"=>"ҷ","Ҵ"=>"ҵ","Ҳ"=>"ҳ",
+            "Ұ"=>"ұ","Ү"=>"ү","Ҭ"=>"ҭ","Ҫ"=>"ҫ","Ҩ"=>"ҩ","Ҧ"=>"ҧ","Ҥ"=>"ҥ","Ң"=>"ң","Ҡ"=>"ҡ","Ҟ"=>"ҟ",
+            "Ҝ"=>"ҝ","Қ"=>"қ","Ҙ"=>"ҙ","Җ"=>"җ","Ҕ"=>"ҕ","Ғ"=>"ғ","Ґ"=>"ґ","Ҏ"=>"ҏ","Ҍ"=>"ҍ","Ҋ"=>"ҋ",
+            "Ҁ"=>"ҁ","Ѿ"=>"ѿ","Ѽ"=>"ѽ","Ѻ"=>"ѻ","Ѹ"=>"ѹ","Ѷ"=>"ѷ","Ѵ"=>"ѵ","Ѳ"=>"ѳ","Ѱ"=>"ѱ","Ѯ"=>"ѯ",
+            "Ѭ"=>"ѭ","Ѫ"=>"ѫ","Ѩ"=>"ѩ","Ѧ"=>"ѧ","Ѥ"=>"ѥ","Ѣ"=>"ѣ","Ѡ"=>"ѡ","Џ"=>"џ","Ў"=>"ў","Ѝ"=>"ѝ",
+            "Ќ"=>"ќ","Ћ"=>"ћ","Њ"=>"њ","Љ"=>"љ","Ј"=>"ј","Ї"=>"ї","І"=>"і","Ѕ"=>"ѕ","Є"=>"є","Ѓ"=>"ѓ",
+            "Ђ"=>"ђ","Ё"=>"ё","Ѐ"=>"ѐ","Я"=>"я","Ю"=>"ю","Э"=>"э","Ь"=>"ь","Ы"=>"ы","Ъ"=>"ъ","Щ"=>"щ",
+            "Ш"=>"ш","Ч"=>"ч","Ц"=>"ц","Х"=>"х","Ф"=>"ф","У"=>"у","Т"=>"т","С"=>"с","Р"=>"р","П"=>"п",
+            "О"=>"о","Н"=>"н","М"=>"м","Л"=>"л","К"=>"к","Й"=>"й","И"=>"и","З"=>"з","Ж"=>"ж","Е"=>"е",
+            "Д"=>"д","Г"=>"г","В"=>"в","Б"=>"б","А"=>"а","Ε"=>"ϵ","Σ"=>"ϲ","Ρ"=>"ϱ","Κ"=>"ϰ","Ϯ"=>"ϯ",
+            "Ϭ"=>"ϭ","Ϫ"=>"ϫ","Ϩ"=>"ϩ","Ϧ"=>"ϧ","Ϥ"=>"ϥ","Ϣ"=>"ϣ","Ϡ"=>"ϡ","Ϟ"=>"ϟ","Ϝ"=>"ϝ","Ϛ"=>"ϛ",
+            "Ϙ"=>"ϙ","Π"=>"ϖ","Φ"=>"ϕ","Θ"=>"ϑ","Β"=>"ϐ","Ώ"=>"ώ","Ύ"=>"ύ","Ό"=>"ό","Ϋ"=>"ϋ","Ϊ"=>"ϊ",
+            "Ω"=>"ω","Ψ"=>"ψ","Χ"=>"χ","Φ"=>"φ","Υ"=>"υ","Τ"=>"τ","Σ"=>"σ","Σ"=>"ς","Ρ"=>"ρ","Π"=>"π",
+            "Ο"=>"ο","Ξ"=>"ξ","Ν"=>"ν","Μ"=>"μ","Λ"=>"λ","Κ"=>"κ","Ι"=>"ι","Θ"=>"θ","Η"=>"η","Ζ"=>"ζ",
+            "Ε"=>"ε","Δ"=>"δ","Γ"=>"γ","Β"=>"β","Α"=>"α","Ί"=>"ί","Ή"=>"ή","Έ"=>"έ","Ά"=>"ά","Ʒ"=>"ʒ",
+            "Ʋ"=>"ʋ","Ʊ"=>"ʊ","Ʈ"=>"ʈ","Ʃ"=>"ʃ","Ʀ"=>"ʀ","Ɵ"=>"ɵ","Ɲ"=>"ɲ","Ɯ"=>"ɯ","Ɩ"=>"ɩ","Ɨ"=>"ɨ",
+            "Ɣ"=>"ɣ","Ɛ"=>"ɛ","Ə"=>"ə","Ɗ"=>"ɗ","Ɖ"=>"ɖ","Ɔ"=>"ɔ","Ɓ"=>"ɓ","Ȳ"=>"ȳ","Ȱ"=>"ȱ","Ȯ"=>"ȯ",
+            "Ȭ"=>"ȭ","Ȫ"=>"ȫ","Ȩ"=>"ȩ","Ȧ"=>"ȧ","Ȥ"=>"ȥ","Ȣ"=>"ȣ","Ȟ"=>"ȟ","Ȝ"=>"ȝ","Ț"=>"ț","Ș"=>"ș",
+            "Ȗ"=>"ȗ","Ȕ"=>"ȕ","Ȓ"=>"ȓ","Ȑ"=>"ȑ","Ȏ"=>"ȏ","Ȍ"=>"ȍ","Ȋ"=>"ȋ","Ȉ"=>"ȉ","Ȇ"=>"ȇ","Ȅ"=>"ȅ",
+            "Ȃ"=>"ȃ","Ȁ"=>"ȁ","Ǿ"=>"ǿ","Ǽ"=>"ǽ","Ǻ"=>"ǻ","Ǹ"=>"ǹ","Ǵ"=>"ǵ","Dz"=>"dz","Ǯ"=>"ǯ","Ǭ"=>"ǭ",
+            "Ǫ"=>"ǫ","Ǩ"=>"ǩ","Ǧ"=>"ǧ","Ǥ"=>"ǥ","Ǣ"=>"ǣ","Ǡ"=>"ǡ","Ǟ"=>"ǟ","Ǝ"=>"ǝ","Ǜ"=>"ǜ","Ǚ"=>"ǚ",
+            "Ǘ"=>"ǘ","Ǖ"=>"ǖ","Ǔ"=>"ǔ","Ǒ"=>"ǒ","Ǐ"=>"ǐ","Ǎ"=>"ǎ","Nj"=>"nj","Lj"=>"lj","Dž"=>"dž","Ƿ"=>"ƿ",
+            "Ƽ"=>"ƽ","Ƹ"=>"ƹ","Ƶ"=>"ƶ","Ƴ"=>"ƴ","Ư"=>"ư","Ƭ"=>"ƭ","Ƨ"=>"ƨ","Ƥ"=>"ƥ","Ƣ"=>"ƣ","Ơ"=>"ơ",
+            "Ƞ"=>"ƞ","Ƙ"=>"ƙ","Ƕ"=>"ƕ","Ƒ"=>"ƒ","Ƌ"=>"ƌ","Ƈ"=>"ƈ","Ƅ"=>"ƅ","Ƃ"=>"ƃ","S"=>"ſ","Ž"=>"ž",
+            "Ż"=>"ż","Ź"=>"ź","Ŷ"=>"ŷ","Ŵ"=>"ŵ","Ų"=>"ų","Ű"=>"ű","Ů"=>"ů","Ŭ"=>"ŭ","Ū"=>"ū","Ũ"=>"ũ",
+            "Ŧ"=>"ŧ","Ť"=>"ť","Ţ"=>"ţ","Š"=>"š","Ş"=>"ş","Ŝ"=>"ŝ","Ś"=>"ś","Ř"=>"ř","Ŗ"=>"ŗ","Ŕ"=>"ŕ",
+            "Œ"=>"œ","Ő"=>"ő","Ŏ"=>"ŏ","Ō"=>"ō","Ŋ"=>"ŋ","Ň"=>"ň","Ņ"=>"ņ","Ń"=>"ń","Ł"=>"ł","Ŀ"=>"ŀ",
+            "Ľ"=>"ľ","Ļ"=>"ļ","Ĺ"=>"ĺ","Ķ"=>"ķ","Ĵ"=>"ĵ","IJ"=>"ij","I"=>"ı","Į"=>"į","Ĭ"=>"ĭ","Ī"=>"ī",
+            "Ĩ"=>"ĩ","Ħ"=>"ħ","Ĥ"=>"ĥ","Ģ"=>"ģ","Ġ"=>"ġ","Ğ"=>"ğ","Ĝ"=>"ĝ","Ě"=>"ě","Ę"=>"ę","Ė"=>"ė",
+            "Ĕ"=>"ĕ","Ē"=>"ē","Đ"=>"đ","Ď"=>"ď","Č"=>"č","Ċ"=>"ċ","Ĉ"=>"ĉ","Ć"=>"ć","Ą"=>"ą","Ă"=>"ă",
+            "Ā"=>"ā","Ÿ"=>"ÿ","Þ"=>"þ","Ý"=>"ý","Ü"=>"ü","Û"=>"û","Ú"=>"ú","Ù"=>"ù","Ø"=>"ø","Ö"=>"ö",
+            "Õ"=>"õ","Ô"=>"ô","Ó"=>"ó","Ò"=>"ò","Ñ"=>"ñ","Ð"=>"ð","Ï"=>"ï","Î"=>"î","Í"=>"í","Ì"=>"ì",
+            "Ë"=>"ë","Ê"=>"ê","É"=>"é","È"=>"è","Ç"=>"ç","Æ"=>"æ","Å"=>"å","Ä"=>"ä","Ã"=>"ã","Â"=>"â",
+            "Á"=>"á","À"=>"à","Μ"=>"µ","Z"=>"z","Y"=>"y","X"=>"x","W"=>"w","V"=>"v","U"=>"u","T"=>"t",
+            "S"=>"s","R"=>"r","Q"=>"q","P"=>"p","O"=>"o","N"=>"n","M"=>"m","L"=>"l","K"=>"k","J"=>"j",
+            "I"=>"i","H"=>"h","G"=>"g","F"=>"f","E"=>"e","D"=>"d","C"=>"c","B"=>"b","A"=>"a"
+                );
+}; // end of case lookup tables
+
+/**
+ * UTF-8 lookup table for lower case accented letters
+ *
+ * This lookuptable defines replacements for accented characters from the ASCII-7
+ * range. This are lower case letters only.
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @see    utf8_deaccent()
+ */
+global $UTF8_LOWER_ACCENTS;
+if(empty($UTF8_LOWER_ACCENTS)) $UTF8_LOWER_ACCENTS = array(
+  'à' => 'a', 'ô' => 'o', 'ď' => 'd', 'ḟ' => 'f', 'ë' => 'e', 'š' => 's', 'ơ' => 'o',
+  'ß' => 'ss', 'ă' => 'a', 'ř' => 'r', 'ț' => 't', 'ň' => 'n', 'ā' => 'a', 'ķ' => 'k',
+  'ŝ' => 's', 'ỳ' => 'y', 'ņ' => 'n', 'ĺ' => 'l', 'ħ' => 'h', 'ṗ' => 'p', 'ó' => 'o',
+  'ú' => 'u', 'ě' => 'e', 'é' => 'e', 'ç' => 'c', 'ẁ' => 'w', 'ċ' => 'c', 'õ' => 'o',
+  'ṡ' => 's', 'ø' => 'o', 'ģ' => 'g', 'ŧ' => 't', 'ș' => 's', 'ė' => 'e', 'ĉ' => 'c',
+  'ś' => 's', 'î' => 'i', 'ű' => 'u', 'ć' => 'c', 'ę' => 'e', 'ŵ' => 'w', 'ṫ' => 't',
+  'ū' => 'u', 'č' => 'c', 'ö' => 'oe', 'è' => 'e', 'ŷ' => 'y', 'ą' => 'a', 'ł' => 'l',
+  'ų' => 'u', 'ů' => 'u', 'ş' => 's', 'ğ' => 'g', 'ļ' => 'l', 'ƒ' => 'f', 'ž' => 'z',
+  'ẃ' => 'w', 'ḃ' => 'b', 'å' => 'a', 'ì' => 'i', 'ï' => 'i', 'ḋ' => 'd', 'ť' => 't',
+  'ŗ' => 'r', 'ä' => 'ae', 'í' => 'i', 'ŕ' => 'r', 'ê' => 'e', 'ü' => 'ue', 'ò' => 'o',
+  'ē' => 'e', 'ñ' => 'n', 'ń' => 'n', 'ĥ' => 'h', 'ĝ' => 'g', 'đ' => 'd', 'ĵ' => 'j',
+  'ÿ' => 'y', 'ũ' => 'u', 'ŭ' => 'u', 'ư' => 'u', 'ţ' => 't', 'ý' => 'y', 'ő' => 'o',
+  'â' => 'a', 'ľ' => 'l', 'ẅ' => 'w', 'ż' => 'z', 'ī' => 'i', 'ã' => 'a', 'ġ' => 'g',
+  'ṁ' => 'm', 'ō' => 'o', 'ĩ' => 'i', 'ù' => 'u', 'į' => 'i', 'ź' => 'z', 'á' => 'a',
+  'û' => 'u', 'þ' => 'th', 'ð' => 'dh', 'æ' => 'ae', 'µ' => 'u', 'ĕ' => 'e',
+);
+
+/**
+ * UTF-8 lookup table for upper case accented letters
+ *
+ * This lookuptable defines replacements for accented characters from the ASCII-7
+ * range. This are upper case letters only.
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @see    utf8_deaccent()
+ */
+global $UTF8_UPPER_ACCENTS;
+if(empty($UTF8_UPPER_ACCENTS)) $UTF8_UPPER_ACCENTS = array(
+  'À' => 'A', 'Ô' => 'O', 'Ď' => 'D', 'Ḟ' => 'F', 'Ë' => 'E', 'Š' => 'S', 'Ơ' => 'O',
+  'Ă' => 'A', 'Ř' => 'R', 'Ț' => 'T', 'Ň' => 'N', 'Ā' => 'A', 'Ķ' => 'K',
+  'Ŝ' => 'S', 'Ỳ' => 'Y', 'Ņ' => 'N', 'Ĺ' => 'L', 'Ħ' => 'H', 'Ṗ' => 'P', 'Ó' => 'O',
+  'Ú' => 'U', 'Ě' => 'E', 'É' => 'E', 'Ç' => 'C', 'Ẁ' => 'W', 'Ċ' => 'C', 'Õ' => 'O',
+  'Ṡ' => 'S', 'Ø' => 'O', 'Ģ' => 'G', 'Ŧ' => 'T', 'Ș' => 'S', 'Ė' => 'E', 'Ĉ' => 'C',
+  'Ś' => 'S', 'Î' => 'I', 'Ű' => 'U', 'Ć' => 'C', 'Ę' => 'E', 'Ŵ' => 'W', 'Ṫ' => 'T',
+  'Ū' => 'U', 'Č' => 'C', 'Ö' => 'Oe', 'È' => 'E', 'Ŷ' => 'Y', 'Ą' => 'A', 'Ł' => 'L',
+  'Ų' => 'U', 'Ů' => 'U', 'Ş' => 'S', 'Ğ' => 'G', 'Ļ' => 'L', 'Ƒ' => 'F', 'Ž' => 'Z',
+  'Ẃ' => 'W', 'Ḃ' => 'B', 'Å' => 'A', 'Ì' => 'I', 'Ï' => 'I', 'Ḋ' => 'D', 'Ť' => 'T',
+  'Ŗ' => 'R', 'Ä' => 'Ae', 'Í' => 'I', 'Ŕ' => 'R', 'Ê' => 'E', 'Ü' => 'Ue', 'Ò' => 'O',
+  'Ē' => 'E', 'Ñ' => 'N', 'Ń' => 'N', 'Ĥ' => 'H', 'Ĝ' => 'G', 'Đ' => 'D', 'Ĵ' => 'J',
+  'Ÿ' => 'Y', 'Ũ' => 'U', 'Ŭ' => 'U', 'Ư' => 'U', 'Ţ' => 'T', 'Ý' => 'Y', 'Ő' => 'O',
+  'Â' => 'A', 'Ľ' => 'L', 'Ẅ' => 'W', 'Ż' => 'Z', 'Ī' => 'I', 'Ã' => 'A', 'Ġ' => 'G',
+  'Ṁ' => 'M', 'Ō' => 'O', 'Ĩ' => 'I', 'Ù' => 'U', 'Į' => 'I', 'Ź' => 'Z', 'Á' => 'A',
+  'Û' => 'U', 'Þ' => 'Th', 'Ð' => 'Dh', 'Æ' => 'Ae', 'Ĕ' => 'E',
+);
+
+/**
+ * UTF-8 array of common special characters
+ *
+ * This array should contain all special characters (not a letter or digit)
+ * defined in the various local charsets - it's not a complete list of non-alphanum
+ * characters in UTF-8. It's not perfect but should match most cases of special
+ * chars.
+ *
+ * The controlchars 0x00 to 0x19 are _not_ included in this array. The space 0x20 is!
+ * These chars are _not_ in the array either:  _ (0x5f), : 0x3a, . 0x2e, - 0x2d, * 0x2a
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @see    utf8_stripspecials()
+ */
+global $UTF8_SPECIAL_CHARS;
+if(empty($UTF8_SPECIAL_CHARS)) $UTF8_SPECIAL_CHARS = array(
+  0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023,
+  0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029,         0x002b, 0x002c,
+          0x002f,         0x003b, 0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x005b,
+  0x005c, 0x005d, 0x005e,         0x0060, 0x007b, 0x007c, 0x007d, 0x007e,
+  0x007f, 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088,
+  0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, 0x0090, 0x0091, 0x0092,
+  0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009a, 0x009b, 0x009c,
+  0x009d, 0x009e, 0x009f, 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6,
+  0x00a7, 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, 0x00b0,
+  0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x00b9, 0x00ba,
+  0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf, 0x00d7, 0x00f7, 0x02c7, 0x02d8, 0x02d9,
+  0x02da, 0x02db, 0x02dc, 0x02dd, 0x0300, 0x0301, 0x0303, 0x0309, 0x0323, 0x0384,
+  0x0385, 0x0387, 0x03c6, 0x03d1, 0x03d2, 0x03d5, 0x03d6, 0x05b0, 0x05b1,
+  0x05b2, 0x05b3, 0x05b4, 0x05b5, 0x05b6, 0x05b7, 0x05b8, 0x05b9, 0x05bb, 0x05bc,
+  0x05bd, 0x05be, 0x05bf, 0x05c0, 0x05c1, 0x05c2, 0x05c3, 0x05f3, 0x05f4, 0x060c,
+  0x061b, 0x061f, 0x0640, 0x064b, 0x064c, 0x064d, 0x064e, 0x064f, 0x0650, 0x0651,
+  0x0652, 0x066a, 0x0e3f, 0x200c, 0x200d, 0x200e, 0x200f, 0x2013, 0x2014, 0x2015,
+  0x2017, 0x2018, 0x2019, 0x201a, 0x201c, 0x201d, 0x201e, 0x2020, 0x2021, 0x2022,
+  0x2026, 0x2030, 0x2032, 0x2033, 0x2039, 0x203a, 0x2044, 0x20a7, 0x20aa, 0x20ab,
+  0x20ac, 0x2116, 0x2118, 0x2122, 0x2126, 0x2135, 0x2190, 0x2191, 0x2192, 0x2193,
+  0x2194, 0x2195, 0x21b5, 0x21d0, 0x21d1, 0x21d2, 0x21d3, 0x21d4, 0x2200, 0x2202,
+  0x2203, 0x2205, 0x2206, 0x2207, 0x2208, 0x2209, 0x220b, 0x220f, 0x2211, 0x2212,
+  0x2215, 0x2217, 0x2219, 0x221a, 0x221d, 0x221e, 0x2220, 0x2227, 0x2228, 0x2229,
+  0x222a, 0x222b, 0x2234, 0x223c, 0x2245, 0x2248, 0x2260, 0x2261, 0x2264, 0x2265,
+  0x2282, 0x2283, 0x2284, 0x2286, 0x2287, 0x2295, 0x2297, 0x22a5, 0x22c5, 0x2310,
+  0x2320, 0x2321, 0x2329, 0x232a, 0x2469, 0x2500, 0x2502, 0x250c, 0x2510, 0x2514,
+  0x2518, 0x251c, 0x2524, 0x252c, 0x2534, 0x253c, 0x2550, 0x2551, 0x2552, 0x2553,
+  0x2554, 0x2555, 0x2556, 0x2557, 0x2558, 0x2559, 0x255a, 0x255b, 0x255c, 0x255d,
+  0x255e, 0x255f, 0x2560, 0x2561, 0x2562, 0x2563, 0x2564, 0x2565, 0x2566, 0x2567,
+  0x2568, 0x2569, 0x256a, 0x256b, 0x256c, 0x2580, 0x2584, 0x2588, 0x258c, 0x2590,
+  0x2591, 0x2592, 0x2593, 0x25a0, 0x25b2, 0x25bc, 0x25c6, 0x25ca, 0x25cf, 0x25d7,
+  0x2605, 0x260e, 0x261b, 0x261e, 0x2660, 0x2663, 0x2665, 0x2666, 0x2701, 0x2702,
+  0x2703, 0x2704, 0x2706, 0x2707, 0x2708, 0x2709, 0x270c, 0x270d, 0x270e, 0x270f,
+  0x2710, 0x2711, 0x2712, 0x2713, 0x2714, 0x2715, 0x2716, 0x2717, 0x2718, 0x2719,
+  0x271a, 0x271b, 0x271c, 0x271d, 0x271e, 0x271f, 0x2720, 0x2721, 0x2722, 0x2723,
+  0x2724, 0x2725, 0x2726, 0x2727, 0x2729, 0x272a, 0x272b, 0x272c, 0x272d, 0x272e,
+  0x272f, 0x2730, 0x2731, 0x2732, 0x2733, 0x2734, 0x2735, 0x2736, 0x2737, 0x2738,
+  0x2739, 0x273a, 0x273b, 0x273c, 0x273d, 0x273e, 0x273f, 0x2740, 0x2741, 0x2742,
+  0x2743, 0x2744, 0x2745, 0x2746, 0x2747, 0x2748, 0x2749, 0x274a, 0x274b, 0x274d,
+  0x274f, 0x2750, 0x2751, 0x2752, 0x2756, 0x2758, 0x2759, 0x275a, 0x275b, 0x275c,
+  0x275d, 0x275e, 0x2761, 0x2762, 0x2763, 0x2764, 0x2765, 0x2766, 0x2767, 0x277f,
+  0x2789, 0x2793, 0x2794, 0x2798, 0x2799, 0x279a, 0x279b, 0x279c, 0x279d, 0x279e,
+  0x279f, 0x27a0, 0x27a1, 0x27a2, 0x27a3, 0x27a4, 0x27a5, 0x27a6, 0x27a7, 0x27a8,
+  0x27a9, 0x27aa, 0x27ab, 0x27ac, 0x27ad, 0x27ae, 0x27af, 0x27b1, 0x27b2, 0x27b3,
+  0x27b4, 0x27b5, 0x27b6, 0x27b7, 0x27b8, 0x27b9, 0x27ba, 0x27bb, 0x27bc, 0x27bd,
+  0x27be, 0x3000, 0x3001, 0x3002, 0x3003, 0x3008, 0x3009, 0x300a, 0x300b, 0x300c,
+  0x300d, 0x300e, 0x300f, 0x3010, 0x3011, 0x3012, 0x3014, 0x3015, 0x3016, 0x3017,
+  0x3018, 0x3019, 0x301a, 0x301b, 0x3036,
+  0xf6d9, 0xf6da, 0xf6db, 0xf8d7, 0xf8d8, 0xf8d9, 0xf8da, 0xf8db, 0xf8dc,
+  0xf8dd, 0xf8de, 0xf8df, 0xf8e0, 0xf8e1, 0xf8e2, 0xf8e3, 0xf8e4, 0xf8e5, 0xf8e6,
+  0xf8e7, 0xf8e8, 0xf8e9, 0xf8ea, 0xf8eb, 0xf8ec, 0xf8ed, 0xf8ee, 0xf8ef, 0xf8f0,
+  0xf8f1, 0xf8f2, 0xf8f3, 0xf8f4, 0xf8f5, 0xf8f6, 0xf8f7, 0xf8f8, 0xf8f9, 0xf8fa,
+  0xf8fb, 0xf8fc, 0xf8fd, 0xf8fe, 0xfe7c, 0xfe7d,
+          0xff01, 0xff02, 0xff03, 0xff04, 0xff05, 0xff06, 0xff07, 0xff08, 0xff09,
+  0xff09, 0xff0a, 0xff0b, 0xff0c, 0xff0d, 0xff0e, 0xff0f, 0xff1a, 0xff1b, 0xff1c,
+  0xff1d, 0xff1e, 0xff1f, 0xff20, 0xff3b, 0xff3c, 0xff3d, 0xff3e, 0xff40, 0xff5b,
+  0xff5c, 0xff5d, 0xff5e, 0xff5f, 0xff60, 0xff61, 0xff62, 0xff63, 0xff64, 0xff65,
+  0xffe0, 0xffe1, 0xffe2, 0xffe3, 0xffe4, 0xffe5, 0xffe6, 0xffe8, 0xffe9, 0xffea,
+  0xffeb, 0xffec, 0xffed, 0xffee,
+  0x01d6fc, 0x01d6fd, 0x01d6fe, 0x01d6ff, 0x01d700, 0x01d701, 0x01d702, 0x01d703,
+  0x01d704, 0x01d705, 0x01d706, 0x01d707, 0x01d708, 0x01d709, 0x01d70a, 0x01d70b,
+  0x01d70c, 0x01d70d, 0x01d70e, 0x01d70f, 0x01d710, 0x01d711, 0x01d712, 0x01d713,
+  0x01d714, 0x01d715, 0x01d716, 0x01d717, 0x01d718, 0x01d719, 0x01d71a, 0x01d71b,
+  0xc2a0, 0xe28087, 0xe280af, 0xe281a0, 0xefbbbf,
+);
+
+// utf8 version of above data
+global $UTF8_SPECIAL_CHARS2;
+if(empty($UTF8_SPECIAL_CHARS2)) $UTF8_SPECIAL_CHARS2 =
+    "\x1A".' !"#$%&\'()+,/;<=>?@[\]^`{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•�'.
+    '�—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½�'.
+    '�¿×÷ˇ˘˙˚˛˜˝̣̀́̃̉΄΅·ϖְֱֲֳִֵֶַָֹֻּֽ־ֿ�'.
+    '�ׁׂ׃׳״،؛؟ـًٌٍَُِّْ٪฿‌‍‎‏–—―‗‘’‚“”�'.
+    '��†‡•…‰′″‹›⁄₧₪₫€№℘™Ωℵ←↑→↓↔↕↵'.
+    '⇐⇑⇒⇓⇔∀∂∃∅∆∇∈∉∋∏∑−∕∗∙√∝∞∠∧∨�'.
+    '�∪∫∴∼≅≈≠≡≤≥⊂⊃⊄⊆⊇⊕⊗⊥⋅⌐⌠⌡〈〉⑩─�'.
+    '��┌┐└┘├┤┬┴┼═║╒╓╔╕╖╗╘╙╚╛╜╝╞╟╠'.
+    '╡╢╣╤╥╦╧╨╩╪╫╬▀▄█▌▐░▒▓■▲▼◆◊●�'.
+    '�★☎☛☞♠♣♥♦✁✂✃✄✆✇✈✉✌✍✎✏✐✑✒✓✔✕�'.
+    '��✗✘✙✚✛✜✝✞✟✠✡✢✣✤✥✦✧✩✪✫✬✭✮✯✰✱'.
+    '✲✳✴✵✶✷✸✹✺✻✼✽✾✿❀❁❂❃❄❅❆❇❈❉❊❋�'.
+    '�❏❐❑❒❖❘❙❚❛❜❝❞❡❢❣❤❥❦❧❿➉➓➔➘➙➚�'.
+    '��➜➝➞➟➠➡➢➣➤➥➦➧➨➩➪➫➬➭➮➯➱➲➳➴➵➶'.
+    '➷➸➹➺➻➼➽➾'.
+    ' 、。〃〈〉《》「」『』【】〒〔〕〖〗〘〙〚〛〶'.
+    '�'.
+    '�ﹼﹽ'.
+    '!"#$%&'()*+,-./:;<=>?@[\]^`{|}~'.
+    '⦅⦆。「」、・¢£¬ ̄¦¥₩│←↑→↓■○'.
+    '𝛼𝛽𝛾𝛿𝜀𝜁𝜂𝜃𝜄𝜅𝜆𝜇𝜈𝜉𝜊𝜋𝜌𝜍𝜎𝜏𝜐𝜑𝜒𝜓𝜔𝜕𝜖𝜗𝜘𝜙𝜚𝜛'.
+    '   ⁠';
+
+/**
+ * Romanization lookup table
+ *
+ * This lookup tables provides a way to transform strings written in a language
+ * different from the ones based upon latin letters into plain ASCII.
+ *
+ * Please note: this is not a scientific transliteration table. It only works
+ * oneway from nonlatin to ASCII and it works by simple character replacement
+ * only. Specialities of each language are not supported.
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @author Vitaly Blokhin <vitinfo@vitn.com>
+ * @link   http://www.uconv.com/translit.htm
+ * @author Bisqwit <bisqwit@iki.fi>
+ * @link   http://kanjidict.stc.cx/hiragana.php?src=2
+ * @link   http://www.translatum.gr/converter/greek-transliteration.htm
+ * @link   http://en.wikipedia.org/wiki/Royal_Thai_General_System_of_Transcription
+ * @link   http://www.btranslations.com/resources/romanization/korean.asp
+ * @author Arthit Suriyawongkul <arthit@gmail.com>
+ * @author Denis Scheither <amorphis@uni-bremen.de>
+ * @author Eivind Morland <eivind.morland@gmail.com>
+ */
+global $UTF8_ROMANIZATION;
+if(empty($UTF8_ROMANIZATION)) $UTF8_ROMANIZATION = array(
+  // scandinavian - differs from what we do in deaccent
+  'å'=>'a','Å'=>'A','ä'=>'a','Ä'=>'A','ö'=>'o','Ö'=>'O',
+
+  //russian cyrillic
+  'а'=>'a','А'=>'A','б'=>'b','Б'=>'B','в'=>'v','В'=>'V','г'=>'g','Г'=>'G',
+  'д'=>'d','Д'=>'D','е'=>'e','Е'=>'E','ё'=>'jo','Ё'=>'Jo','ж'=>'zh','Ж'=>'Zh',
+  'з'=>'z','З'=>'Z','и'=>'i','И'=>'I','й'=>'j','Й'=>'J','к'=>'k','К'=>'K',
+  'л'=>'l','Л'=>'L','м'=>'m','М'=>'M','н'=>'n','Н'=>'N','о'=>'o','О'=>'O',
+  'п'=>'p','П'=>'P','р'=>'r','Р'=>'R','с'=>'s','С'=>'S','т'=>'t','Т'=>'T',
+  'у'=>'u','У'=>'U','ф'=>'f','Ф'=>'F','х'=>'x','Х'=>'X','ц'=>'c','Ц'=>'C',
+  'ч'=>'ch','Ч'=>'Ch','ш'=>'sh','Ш'=>'Sh','щ'=>'sch','Щ'=>'Sch','ъ'=>'',
+  'Ъ'=>'','ы'=>'y','Ы'=>'Y','ь'=>'','Ь'=>'','э'=>'eh','Э'=>'Eh','ю'=>'ju',
+  'Ю'=>'Ju','я'=>'ja','Я'=>'Ja',
+  // Ukrainian cyrillic
+  'Ґ'=>'Gh','ґ'=>'gh','Є'=>'Je','є'=>'je','І'=>'I','і'=>'i','Ї'=>'Ji','ї'=>'ji',
+  // Georgian
+  'ა'=>'a','ბ'=>'b','გ'=>'g','დ'=>'d','ე'=>'e','ვ'=>'v','ზ'=>'z','თ'=>'th',
+  'ი'=>'i','კ'=>'p','ლ'=>'l','მ'=>'m','ნ'=>'n','ო'=>'o','პ'=>'p','ჟ'=>'zh',
+  'რ'=>'r','ს'=>'s','ტ'=>'t','უ'=>'u','ფ'=>'ph','ქ'=>'kh','ღ'=>'gh','ყ'=>'q',
+  'შ'=>'sh','ჩ'=>'ch','ც'=>'c','ძ'=>'dh','წ'=>'w','ჭ'=>'j','ხ'=>'x','ჯ'=>'jh',
+  'ჰ'=>'xh',
+  //Sanskrit
+  'अ'=>'a','आ'=>'ah','इ'=>'i','ई'=>'ih','उ'=>'u','ऊ'=>'uh','ऋ'=>'ry',
+  'ॠ'=>'ryh','ऌ'=>'ly','ॡ'=>'lyh','ए'=>'e','ऐ'=>'ay','ओ'=>'o','औ'=>'aw',
+  'अं'=>'amh','अः'=>'aq','क'=>'k','ख'=>'kh','ग'=>'g','घ'=>'gh','ङ'=>'nh',
+  'च'=>'c','छ'=>'ch','ज'=>'j','झ'=>'jh','ञ'=>'ny','ट'=>'tq','ठ'=>'tqh',
+  'ड'=>'dq','ढ'=>'dqh','ण'=>'nq','त'=>'t','थ'=>'th','द'=>'d','ध'=>'dh',
+  'न'=>'n','प'=>'p','फ'=>'ph','ब'=>'b','भ'=>'bh','म'=>'m','य'=>'z','र'=>'r',
+  'ल'=>'l','व'=>'v','श'=>'sh','ष'=>'sqh','स'=>'s','ह'=>'x',
+  //Sanskrit diacritics
+  'Ā'=>'A','Ī'=>'I','Ū'=>'U','Ṛ'=>'R','Ṝ'=>'R','Ṅ'=>'N','Ñ'=>'N','Ṭ'=>'T',
+  'Ḍ'=>'D','Ṇ'=>'N','Ś'=>'S','Ṣ'=>'S','Ṁ'=>'M','Ṃ'=>'M','Ḥ'=>'H','Ḷ'=>'L','Ḹ'=>'L',
+  'ā'=>'a','ī'=>'i','ū'=>'u','ṛ'=>'r','ṝ'=>'r','ṅ'=>'n','ñ'=>'n','ṭ'=>'t',
+  'ḍ'=>'d','ṇ'=>'n','ś'=>'s','ṣ'=>'s','ṁ'=>'m','ṃ'=>'m','ḥ'=>'h','ḷ'=>'l','ḹ'=>'l',
+  //Hebrew
+  'א'=>'a', 'ב'=>'b','ג'=>'g','ד'=>'d','ה'=>'h','ו'=>'v','ז'=>'z','ח'=>'kh','ט'=>'th',
+  'י'=>'y','ך'=>'h','כ'=>'k','ל'=>'l','ם'=>'m','מ'=>'m','ן'=>'n','נ'=>'n',
+  'ס'=>'s','ע'=>'ah','ף'=>'f','פ'=>'p','ץ'=>'c','צ'=>'c','ק'=>'q','ר'=>'r',
+  'ש'=>'sh','ת'=>'t',
+  //Arabic
+  'ا'=>'a','ب'=>'b','ت'=>'t','ث'=>'th','ج'=>'g','ح'=>'xh','خ'=>'x','د'=>'d',
+  'ذ'=>'dh','ر'=>'r','ز'=>'z','س'=>'s','ش'=>'sh','ص'=>'s\'','ض'=>'d\'',
+  'ط'=>'t\'','ظ'=>'z\'','ع'=>'y','غ'=>'gh','ف'=>'f','ق'=>'q','ك'=>'k',
+  'ل'=>'l','م'=>'m','ن'=>'n','ه'=>'x\'','و'=>'u','ي'=>'i',
+
+  // Japanese characters  (last update: 2008-05-09)
+
+  // Japanese hiragana
+
+  // 3 character syllables, っ doubles the consonant after
+  'っちゃ'=>'ccha','っちぇ'=>'cche','っちょ'=>'ccho','っちゅ'=>'cchu',
+  'っびゃ'=>'bbya','っびぇ'=>'bbye','っびぃ'=>'bbyi','っびょ'=>'bbyo','っびゅ'=>'bbyu',
+  'っぴゃ'=>'ppya','っぴぇ'=>'ppye','っぴぃ'=>'ppyi','っぴょ'=>'ppyo','っぴゅ'=>'ppyu',
+  'っちゃ'=>'ccha','っちぇ'=>'cche','っち'=>'cchi','っちょ'=>'ccho','っちゅ'=>'cchu',
+  // 'っひゃ'=>'hya','っひぇ'=>'hye','っひぃ'=>'hyi','っひょ'=>'hyo','っひゅ'=>'hyu',
+  'っきゃ'=>'kkya','っきぇ'=>'kkye','っきぃ'=>'kkyi','っきょ'=>'kkyo','っきゅ'=>'kkyu',
+  'っぎゃ'=>'ggya','っぎぇ'=>'ggye','っぎぃ'=>'ggyi','っぎょ'=>'ggyo','っぎゅ'=>'ggyu',
+  'っみゃ'=>'mmya','っみぇ'=>'mmye','っみぃ'=>'mmyi','っみょ'=>'mmyo','っみゅ'=>'mmyu',
+  'っにゃ'=>'nnya','っにぇ'=>'nnye','っにぃ'=>'nnyi','っにょ'=>'nnyo','っにゅ'=>'nnyu',
+  'っりゃ'=>'rrya','っりぇ'=>'rrye','っりぃ'=>'rryi','っりょ'=>'rryo','っりゅ'=>'rryu',
+  'っしゃ'=>'ssha','っしぇ'=>'sshe','っし'=>'sshi','っしょ'=>'ssho','っしゅ'=>'sshu',
+
+  // seperate hiragana 'n' ('n' + 'i' != 'ni', normally we would write "kon'nichi wa" but the apostrophe would be converted to _ anyway)
+  'んあ'=>'n_a','んえ'=>'n_e','んい'=>'n_i','んお'=>'n_o','んう'=>'n_u',
+  'んや'=>'n_ya','んよ'=>'n_yo','んゆ'=>'n_yu',
+
+   // 2 character syllables - normal
+  'ふぁ'=>'fa','ふぇ'=>'fe','ふぃ'=>'fi','ふぉ'=>'fo',
+  'ちゃ'=>'cha','ちぇ'=>'che','ち'=>'chi','ちょ'=>'cho','ちゅ'=>'chu',
+  'ひゃ'=>'hya','ひぇ'=>'hye','ひぃ'=>'hyi','ひょ'=>'hyo','ひゅ'=>'hyu',
+  'びゃ'=>'bya','びぇ'=>'bye','びぃ'=>'byi','びょ'=>'byo','びゅ'=>'byu',
+  'ぴゃ'=>'pya','ぴぇ'=>'pye','ぴぃ'=>'pyi','ぴょ'=>'pyo','ぴゅ'=>'pyu',
+  'きゃ'=>'kya','きぇ'=>'kye','きぃ'=>'kyi','きょ'=>'kyo','きゅ'=>'kyu',
+  'ぎゃ'=>'gya','ぎぇ'=>'gye','ぎぃ'=>'gyi','ぎょ'=>'gyo','ぎゅ'=>'gyu',
+  'みゃ'=>'mya','みぇ'=>'mye','みぃ'=>'myi','みょ'=>'myo','みゅ'=>'myu',
+  'にゃ'=>'nya','にぇ'=>'nye','にぃ'=>'nyi','にょ'=>'nyo','にゅ'=>'nyu',
+  'りゃ'=>'rya','りぇ'=>'rye','りぃ'=>'ryi','りょ'=>'ryo','りゅ'=>'ryu',
+  'しゃ'=>'sha','しぇ'=>'she','し'=>'shi','しょ'=>'sho','しゅ'=>'shu',
+  'じゃ'=>'ja','じぇ'=>'je','じょ'=>'jo','じゅ'=>'ju',
+  'うぇ'=>'we','うぃ'=>'wi',
+  'いぇ'=>'ye',
+
+  // 2 character syllables, っ doubles the consonant after
+  'っば'=>'bba','っべ'=>'bbe','っび'=>'bbi','っぼ'=>'bbo','っぶ'=>'bbu',
+  'っぱ'=>'ppa','っぺ'=>'ppe','っぴ'=>'ppi','っぽ'=>'ppo','っぷ'=>'ppu',
+  'った'=>'tta','って'=>'tte','っち'=>'cchi','っと'=>'tto','っつ'=>'ttsu',
+  'っだ'=>'dda','っで'=>'dde','っぢ'=>'ddi','っど'=>'ddo','っづ'=>'ddu',
+  'っが'=>'gga','っげ'=>'gge','っぎ'=>'ggi','っご'=>'ggo','っぐ'=>'ggu',
+  'っか'=>'kka','っけ'=>'kke','っき'=>'kki','っこ'=>'kko','っく'=>'kku',
+  'っま'=>'mma','っめ'=>'mme','っみ'=>'mmi','っも'=>'mmo','っむ'=>'mmu',
+  'っな'=>'nna','っね'=>'nne','っに'=>'nni','っの'=>'nno','っぬ'=>'nnu',
+  'っら'=>'rra','っれ'=>'rre','っり'=>'rri','っろ'=>'rro','っる'=>'rru',
+  'っさ'=>'ssa','っせ'=>'sse','っし'=>'sshi','っそ'=>'sso','っす'=>'ssu',
+  'っざ'=>'zza','っぜ'=>'zze','っじ'=>'jji','っぞ'=>'zzo','っず'=>'zzu',
+
+  // 1 character syllabels
+  'あ'=>'a','え'=>'e','い'=>'i','お'=>'o','う'=>'u','ん'=>'n',
+  'は'=>'ha','へ'=>'he','ひ'=>'hi','ほ'=>'ho','ふ'=>'fu',
+  'ば'=>'ba','べ'=>'be','び'=>'bi','ぼ'=>'bo','ぶ'=>'bu',
+  'ぱ'=>'pa','ぺ'=>'pe','ぴ'=>'pi','ぽ'=>'po','ぷ'=>'pu',
+  'た'=>'ta','て'=>'te','ち'=>'chi','と'=>'to','つ'=>'tsu',
+  'だ'=>'da','で'=>'de','ぢ'=>'di','ど'=>'do','づ'=>'du',
+  'が'=>'ga','げ'=>'ge','ぎ'=>'gi','ご'=>'go','ぐ'=>'gu',
+  'か'=>'ka','け'=>'ke','き'=>'ki','こ'=>'ko','く'=>'ku',
+  'ま'=>'ma','め'=>'me','み'=>'mi','も'=>'mo','む'=>'mu',
+  'な'=>'na','ね'=>'ne','に'=>'ni','の'=>'no','ぬ'=>'nu',
+  'ら'=>'ra','れ'=>'re','り'=>'ri','ろ'=>'ro','る'=>'ru',
+  'さ'=>'sa','せ'=>'se','し'=>'shi','そ'=>'so','す'=>'su',
+  'わ'=>'wa','を'=>'wo',
+  'ざ'=>'za','ぜ'=>'ze','じ'=>'ji','ぞ'=>'zo','ず'=>'zu',
+  'や'=>'ya','よ'=>'yo','ゆ'=>'yu',
+  // old characters
+  'ゑ'=>'we','ゐ'=>'wi',
+
+  //  convert what's left (probably only kicks in when something's missing above)
+  // 'ぁ'=>'a','ぇ'=>'e','ぃ'=>'i','ぉ'=>'o','ぅ'=>'u',
+  // 'ゃ'=>'ya','ょ'=>'yo','ゅ'=>'yu',
+
+  // never seen one of those (disabled for the moment)
+  // 'ヴぁ'=>'va','ヴぇ'=>'ve','ヴぃ'=>'vi','ヴぉ'=>'vo','ヴ'=>'vu',
+  // 'でゃ'=>'dha','でぇ'=>'dhe','でぃ'=>'dhi','でょ'=>'dho','でゅ'=>'dhu',
+  // 'どぁ'=>'dwa','どぇ'=>'dwe','どぃ'=>'dwi','どぉ'=>'dwo','どぅ'=>'dwu',
+  // 'ぢゃ'=>'dya','ぢぇ'=>'dye','ぢぃ'=>'dyi','ぢょ'=>'dyo','ぢゅ'=>'dyu',
+  // 'ふぁ'=>'fwa','ふぇ'=>'fwe','ふぃ'=>'fwi','ふぉ'=>'fwo','ふぅ'=>'fwu',
+  // 'ふゃ'=>'fya','ふぇ'=>'fye','ふぃ'=>'fyi','ふょ'=>'fyo','ふゅ'=>'fyu',
+  // 'すぁ'=>'swa','すぇ'=>'swe','すぃ'=>'swi','すぉ'=>'swo','すぅ'=>'swu',
+  // 'てゃ'=>'tha','てぇ'=>'the','てぃ'=>'thi','てょ'=>'tho','てゅ'=>'thu',
+  // 'つゃ'=>'tsa','つぇ'=>'tse','つぃ'=>'tsi','つょ'=>'tso','つ'=>'tsu',
+  // 'とぁ'=>'twa','とぇ'=>'twe','とぃ'=>'twi','とぉ'=>'two','とぅ'=>'twu',
+  // 'ヴゃ'=>'vya','ヴぇ'=>'vye','ヴぃ'=>'vyi','ヴょ'=>'vyo','ヴゅ'=>'vyu',
+  // 'うぁ'=>'wha','うぇ'=>'whe','うぃ'=>'whi','うぉ'=>'who','うぅ'=>'whu',
+  // 'じゃ'=>'zha','じぇ'=>'zhe','じぃ'=>'zhi','じょ'=>'zho','じゅ'=>'zhu',
+  // 'じゃ'=>'zya','じぇ'=>'zye','じぃ'=>'zyi','じょ'=>'zyo','じゅ'=>'zyu',
+
+  // 'spare' characters from other romanization systems
+  // 'だ'=>'da','で'=>'de','ぢ'=>'di','ど'=>'do','づ'=>'du',
+  // 'ら'=>'la','れ'=>'le','り'=>'li','ろ'=>'lo','る'=>'lu',
+  // 'さ'=>'sa','せ'=>'se','し'=>'si','そ'=>'so','す'=>'su',
+  // 'ちゃ'=>'cya','ちぇ'=>'cye','ちぃ'=>'cyi','ちょ'=>'cyo','ちゅ'=>'cyu',
+  //'じゃ'=>'jya','じぇ'=>'jye','じぃ'=>'jyi','じょ'=>'jyo','じゅ'=>'jyu',
+  //'りゃ'=>'lya','りぇ'=>'lye','りぃ'=>'lyi','りょ'=>'lyo','りゅ'=>'lyu',
+  //'しゃ'=>'sya','しぇ'=>'sye','しぃ'=>'syi','しょ'=>'syo','しゅ'=>'syu',
+  //'ちゃ'=>'tya','ちぇ'=>'tye','ちぃ'=>'tyi','ちょ'=>'tyo','ちゅ'=>'tyu',
+  //'し'=>'ci',,い'=>'yi','ぢ'=>'dzi',
+  //'っじゃ'=>'jja','っじぇ'=>'jje','っじ'=>'jji','っじょ'=>'jjo','っじゅ'=>'jju',
+
+
+  // Japanese katakana
+
+  // 4 character syllables: ッ doubles the consonant after, ー doubles the vowel before (usualy written with macron, but we don't want that in our URLs)
+  'ッビャー'=>'bbyaa','ッビェー'=>'bbyee','ッビィー'=>'bbyii','ッビョー'=>'bbyoo','ッビュー'=>'bbyuu',
+  'ッピャー'=>'ppyaa','ッピェー'=>'ppyee','ッピィー'=>'ppyii','ッピョー'=>'ppyoo','ッピュー'=>'ppyuu',
+  'ッキャー'=>'kkyaa','ッキェー'=>'kkyee','ッキィー'=>'kkyii','ッキョー'=>'kkyoo','ッキュー'=>'kkyuu',
+  'ッギャー'=>'ggyaa','ッギェー'=>'ggyee','ッギィー'=>'ggyii','ッギョー'=>'ggyoo','ッギュー'=>'ggyuu',
+  'ッミャー'=>'mmyaa','ッミェー'=>'mmyee','ッミィー'=>'mmyii','ッミョー'=>'mmyoo','ッミュー'=>'mmyuu',
+  'ッニャー'=>'nnyaa','ッニェー'=>'nnyee','ッニィー'=>'nnyii','ッニョー'=>'nnyoo','ッニュー'=>'nnyuu',
+  'ッリャー'=>'rryaa','ッリェー'=>'rryee','ッリィー'=>'rryii','ッリョー'=>'rryoo','ッリュー'=>'rryuu',
+  'ッシャー'=>'sshaa','ッシェー'=>'sshee','ッシー'=>'sshii','ッショー'=>'sshoo','ッシュー'=>'sshuu',
+  'ッチャー'=>'cchaa','ッチェー'=>'cchee','ッチー'=>'cchii','ッチョー'=>'cchoo','ッチュー'=>'cchuu',
+  'ッティー'=>'ttii',
+  'ッヂィー'=>'ddii',
+
+  // 3 character syllables - doubled vowels
+  'ファー'=>'faa','フェー'=>'fee','フィー'=>'fii','フォー'=>'foo',
+  'フャー'=>'fyaa','フェー'=>'fyee','フィー'=>'fyii','フョー'=>'fyoo','フュー'=>'fyuu',
+  'ヒャー'=>'hyaa','ヒェー'=>'hyee','ヒィー'=>'hyii','ヒョー'=>'hyoo','ヒュー'=>'hyuu',
+  'ビャー'=>'byaa','ビェー'=>'byee','ビィー'=>'byii','ビョー'=>'byoo','ビュー'=>'byuu',
+  'ピャー'=>'pyaa','ピェー'=>'pyee','ピィー'=>'pyii','ピョー'=>'pyoo','ピュー'=>'pyuu',
+  'キャー'=>'kyaa','キェー'=>'kyee','キィー'=>'kyii','キョー'=>'kyoo','キュー'=>'kyuu',
+  'ギャー'=>'gyaa','ギェー'=>'gyee','ギィー'=>'gyii','ギョー'=>'gyoo','ギュー'=>'gyuu',
+  'ミャー'=>'myaa','ミェー'=>'myee','ミィー'=>'myii','ミョー'=>'myoo','ミュー'=>'myuu',
+  'ニャー'=>'nyaa','ニェー'=>'nyee','ニィー'=>'nyii','ニョー'=>'nyoo','ニュー'=>'nyuu',
+  'リャー'=>'ryaa','リェー'=>'ryee','リィー'=>'ryii','リョー'=>'ryoo','リュー'=>'ryuu',
+  'シャー'=>'shaa','シェー'=>'shee','シー'=>'shii','ショー'=>'shoo','シュー'=>'shuu',
+  'ジャー'=>'jaa','ジェー'=>'jee','ジー'=>'jii','ジョー'=>'joo','ジュー'=>'juu',
+  'スァー'=>'swaa','スェー'=>'swee','スィー'=>'swii','スォー'=>'swoo','スゥー'=>'swuu',
+  'デァー'=>'daa','デェー'=>'dee','ディー'=>'dii','デォー'=>'doo','デゥー'=>'duu',
+  'チャー'=>'chaa','チェー'=>'chee','チー'=>'chii','チョー'=>'choo','チュー'=>'chuu',
+  'ヂャー'=>'dyaa','ヂェー'=>'dyee','ヂィー'=>'dyii','ヂョー'=>'dyoo','ヂュー'=>'dyuu',
+  'ツャー'=>'tsaa','ツェー'=>'tsee','ツィー'=>'tsii','ツョー'=>'tsoo','ツー'=>'tsuu',
+  'トァー'=>'twaa','トェー'=>'twee','トィー'=>'twii','トォー'=>'twoo','トゥー'=>'twuu',
+  'ドァー'=>'dwaa','ドェー'=>'dwee','ドィー'=>'dwii','ドォー'=>'dwoo','ドゥー'=>'dwuu',
+  'ウァー'=>'whaa','ウェー'=>'whee','ウィー'=>'whii','ウォー'=>'whoo','ウゥー'=>'whuu',
+  'ヴャー'=>'vyaa','ヴェー'=>'vyee','ヴィー'=>'vyii','ヴョー'=>'vyoo','ヴュー'=>'vyuu',
+  'ヴァー'=>'vaa','ヴェー'=>'vee','ヴィー'=>'vii','ヴォー'=>'voo','ヴー'=>'vuu',
+  'ウェー'=>'wee','ウィー'=>'wii',
+  'イェー'=>'yee',
+  'ティー'=>'tii',
+  'ヂィー'=>'dii',
+
+  // 3 character syllables - doubled consonants
+  'ッビャ'=>'bbya','ッビェ'=>'bbye','ッビィ'=>'bbyi','ッビョ'=>'bbyo','ッビュ'=>'bbyu',
+  'ッピャ'=>'ppya','ッピェ'=>'ppye','ッピィ'=>'ppyi','ッピョ'=>'ppyo','ッピュ'=>'ppyu',
+  'ッキャ'=>'kkya','ッキェ'=>'kkye','ッキィ'=>'kkyi','ッキョ'=>'kkyo','ッキュ'=>'kkyu',
+  'ッギャ'=>'ggya','ッギェ'=>'ggye','ッギィ'=>'ggyi','ッギョ'=>'ggyo','ッギュ'=>'ggyu',
+  'ッミャ'=>'mmya','ッミェ'=>'mmye','ッミィ'=>'mmyi','ッミョ'=>'mmyo','ッミュ'=>'mmyu',
+  'ッニャ'=>'nnya','ッニェ'=>'nnye','ッニィ'=>'nnyi','ッニョ'=>'nnyo','ッニュ'=>'nnyu',
+  'ッリャ'=>'rrya','ッリェ'=>'rrye','ッリィ'=>'rryi','ッリョ'=>'rryo','ッリュ'=>'rryu',
+  'ッシャ'=>'ssha','ッシェ'=>'sshe','ッシ'=>'sshi','ッショ'=>'ssho','ッシュ'=>'sshu',
+  'ッチャ'=>'ccha','ッチェ'=>'cche','ッチ'=>'cchi','ッチョ'=>'ccho','ッチュ'=>'cchu',
+  'ッティ'=>'tti',
+  'ッヂィ'=>'ddi',
+
+  // 3 character syllables - doubled vowel and consonants
+  'ッバー'=>'bbaa','ッベー'=>'bbee','ッビー'=>'bbii','ッボー'=>'bboo','ッブー'=>'bbuu',
+  'ッパー'=>'ppaa','ッペー'=>'ppee','ッピー'=>'ppii','ッポー'=>'ppoo','ップー'=>'ppuu',
+  'ッケー'=>'kkee','ッキー'=>'kkii','ッコー'=>'kkoo','ックー'=>'kkuu','ッカー'=>'kkaa',
+  'ッガー'=>'ggaa','ッゲー'=>'ggee','ッギー'=>'ggii','ッゴー'=>'ggoo','ッグー'=>'gguu',
+  'ッマー'=>'maa','ッメー'=>'mee','ッミー'=>'mii','ッモー'=>'moo','ッムー'=>'muu',
+  'ッナー'=>'nnaa','ッネー'=>'nnee','ッニー'=>'nnii','ッノー'=>'nnoo','ッヌー'=>'nnuu',
+  'ッラー'=>'rraa','ッレー'=>'rree','ッリー'=>'rrii','ッロー'=>'rroo','ッルー'=>'rruu',
+  'ッサー'=>'ssaa','ッセー'=>'ssee','ッシー'=>'sshii','ッソー'=>'ssoo','ッスー'=>'ssuu',
+  'ッザー'=>'zzaa','ッゼー'=>'zzee','ッジー'=>'jjii','ッゾー'=>'zzoo','ッズー'=>'zzuu',
+  'ッター'=>'ttaa','ッテー'=>'ttee','ッチー'=>'chii','ットー'=>'ttoo','ッツー'=>'ttsuu',
+  'ッダー'=>'ddaa','ッデー'=>'ddee','ッヂー'=>'ddii','ッドー'=>'ddoo','ッヅー'=>'dduu',
+
+  // 2 character syllables - normal
+  'ファ'=>'fa','フェ'=>'fe','フィ'=>'fi','フォ'=>'fo','フゥ'=>'fu',
+  // 'フャ'=>'fya','フェ'=>'fye','フィ'=>'fyi','フョ'=>'fyo','フュ'=>'fyu',
+  'フャ'=>'fa','フェ'=>'fe','フィ'=>'fi','フョ'=>'fo','フュ'=>'fu',
+  'ヒャ'=>'hya','ヒェ'=>'hye','ヒィ'=>'hyi','ヒョ'=>'hyo','ヒュ'=>'hyu',
+  'ビャ'=>'bya','ビェ'=>'bye','ビィ'=>'byi','ビョ'=>'byo','ビュ'=>'byu',
+  'ピャ'=>'pya','ピェ'=>'pye','ピィ'=>'pyi','ピョ'=>'pyo','ピュ'=>'pyu',
+  'キャ'=>'kya','キェ'=>'kye','キィ'=>'kyi','キョ'=>'kyo','キュ'=>'kyu',
+  'ギャ'=>'gya','ギェ'=>'gye','ギィ'=>'gyi','ギョ'=>'gyo','ギュ'=>'gyu',
+  'ミャ'=>'mya','ミェ'=>'mye','ミィ'=>'myi','ミョ'=>'myo','ミュ'=>'myu',
+  'ニャ'=>'nya','ニェ'=>'nye','ニィ'=>'nyi','ニョ'=>'nyo','ニュ'=>'nyu',
+  'リャ'=>'rya','リェ'=>'rye','リィ'=>'ryi','リョ'=>'ryo','リュ'=>'ryu',
+  'シャ'=>'sha','シェ'=>'she','ショ'=>'sho','シュ'=>'shu',
+  'ジャ'=>'ja','ジェ'=>'je','ジョ'=>'jo','ジュ'=>'ju',
+  'スァ'=>'swa','スェ'=>'swe','スィ'=>'swi','スォ'=>'swo','スゥ'=>'swu',
+  'デァ'=>'da','デェ'=>'de','ディ'=>'di','デォ'=>'do','デゥ'=>'du',
+  'チャ'=>'cha','チェ'=>'che','チ'=>'chi','チョ'=>'cho','チュ'=>'chu',
+  // 'ヂャ'=>'dya','ヂェ'=>'dye','ヂィ'=>'dyi','ヂョ'=>'dyo','ヂュ'=>'dyu',
+  'ツャ'=>'tsa','ツェ'=>'tse','ツィ'=>'tsi','ツョ'=>'tso','ツ'=>'tsu',
+  'トァ'=>'twa','トェ'=>'twe','トィ'=>'twi','トォ'=>'two','トゥ'=>'twu',
+  'ドァ'=>'dwa','ドェ'=>'dwe','ドィ'=>'dwi','ドォ'=>'dwo','ドゥ'=>'dwu',
+  'ウァ'=>'wha','ウェ'=>'whe','ウィ'=>'whi','ウォ'=>'who','ウゥ'=>'whu',
+  'ヴャ'=>'vya','ヴェ'=>'vye','ヴィ'=>'vyi','ヴョ'=>'vyo','ヴュ'=>'vyu',
+  'ヴァ'=>'va','ヴェ'=>'ve','ヴィ'=>'vi','ヴォ'=>'vo','ヴ'=>'vu',
+  'ウェ'=>'we','ウィ'=>'wi',
+  'イェ'=>'ye',
+  'ティ'=>'ti',
+  'ヂィ'=>'di',
+
+  // 2 character syllables - doubled vocal
+  'アー'=>'aa','エー'=>'ee','イー'=>'ii','オー'=>'oo','ウー'=>'uu',
+  'ダー'=>'daa','デー'=>'dee','ヂー'=>'dii','ドー'=>'doo','ヅー'=>'duu',
+  'ハー'=>'haa','ヘー'=>'hee','ヒー'=>'hii','ホー'=>'hoo','フー'=>'fuu',
+  'バー'=>'baa','ベー'=>'bee','ビー'=>'bii','ボー'=>'boo','ブー'=>'buu',
+  'パー'=>'paa','ペー'=>'pee','ピー'=>'pii','ポー'=>'poo','プー'=>'puu',
+  'ケー'=>'kee','キー'=>'kii','コー'=>'koo','クー'=>'kuu','カー'=>'kaa',
+  'ガー'=>'gaa','ゲー'=>'gee','ギー'=>'gii','ゴー'=>'goo','グー'=>'guu',
+  'マー'=>'maa','メー'=>'mee','ミー'=>'mii','モー'=>'moo','ムー'=>'muu',
+  'ナー'=>'naa','ネー'=>'nee','ニー'=>'nii','ノー'=>'noo','ヌー'=>'nuu',
+  'ラー'=>'raa','レー'=>'ree','リー'=>'rii','ロー'=>'roo','ルー'=>'ruu',
+  'サー'=>'saa','セー'=>'see','シー'=>'shii','ソー'=>'soo','スー'=>'suu',
+  'ザー'=>'zaa','ゼー'=>'zee','ジー'=>'jii','ゾー'=>'zoo','ズー'=>'zuu',
+  'ター'=>'taa','テー'=>'tee','チー'=>'chii','トー'=>'too','ツー'=>'tsuu',
+  'ワー'=>'waa','ヲー'=>'woo',
+  'ヤー'=>'yaa','ヨー'=>'yoo','ユー'=>'yuu',
+  'ヵー'=>'kaa','ヶー'=>'kee',
+  // old characters
+  'ヱー'=>'wee','ヰー'=>'wii',
+
+  // seperate katakana 'n'
+  'ンア'=>'n_a','ンエ'=>'n_e','ンイ'=>'n_i','ンオ'=>'n_o','ンウ'=>'n_u',
+  'ンヤ'=>'n_ya','ンヨ'=>'n_yo','ンユ'=>'n_yu',
+
+  // 2 character syllables - doubled consonants
+  'ッバ'=>'bba','ッベ'=>'bbe','ッビ'=>'bbi','ッボ'=>'bbo','ッブ'=>'bbu',
+  'ッパ'=>'ppa','ッペ'=>'ppe','ッピ'=>'ppi','ッポ'=>'ppo','ップ'=>'ppu',
+  'ッケ'=>'kke','ッキ'=>'kki','ッコ'=>'kko','ック'=>'kku','ッカ'=>'kka',
+  'ッガ'=>'gga','ッゲ'=>'gge','ッギ'=>'ggi','ッゴ'=>'ggo','ッグ'=>'ggu',
+  'ッマ'=>'ma','ッメ'=>'me','ッミ'=>'mi','ッモ'=>'mo','ッム'=>'mu',
+  'ッナ'=>'nna','ッネ'=>'nne','ッニ'=>'nni','ッノ'=>'nno','ッヌ'=>'nnu',
+  'ッラ'=>'rra','ッレ'=>'rre','ッリ'=>'rri','ッロ'=>'rro','ッル'=>'rru',
+  'ッサ'=>'ssa','ッセ'=>'sse','ッシ'=>'sshi','ッソ'=>'sso','ッス'=>'ssu',
+  'ッザ'=>'zza','ッゼ'=>'zze','ッジ'=>'jji','ッゾ'=>'zzo','ッズ'=>'zzu',
+  'ッタ'=>'tta','ッテ'=>'tte','ッチ'=>'cchi','ット'=>'tto','ッツ'=>'ttsu',
+  'ッダ'=>'dda','ッデ'=>'dde','ッヂ'=>'ddi','ッド'=>'ddo','ッヅ'=>'ddu',
+
+  // 1 character syllables
+  'ア'=>'a','エ'=>'e','イ'=>'i','オ'=>'o','ウ'=>'u','ン'=>'n',
+  'ハ'=>'ha','ヘ'=>'he','ヒ'=>'hi','ホ'=>'ho','フ'=>'fu',
+  'バ'=>'ba','ベ'=>'be','ビ'=>'bi','ボ'=>'bo','ブ'=>'bu',
+  'パ'=>'pa','ペ'=>'pe','ピ'=>'pi','ポ'=>'po','プ'=>'pu',
+  'ケ'=>'ke','キ'=>'ki','コ'=>'ko','ク'=>'ku','カ'=>'ka',
+  'ガ'=>'ga','ゲ'=>'ge','ギ'=>'gi','ゴ'=>'go','グ'=>'gu',
+  'マ'=>'ma','メ'=>'me','ミ'=>'mi','モ'=>'mo','ム'=>'mu',
+  'ナ'=>'na','ネ'=>'ne','ニ'=>'ni','ノ'=>'no','ヌ'=>'nu',
+  'ラ'=>'ra','レ'=>'re','リ'=>'ri','ロ'=>'ro','ル'=>'ru',
+  'サ'=>'sa','セ'=>'se','シ'=>'shi','ソ'=>'so','ス'=>'su',
+  'ザ'=>'za','ゼ'=>'ze','ジ'=>'ji','ゾ'=>'zo','ズ'=>'zu',
+  'タ'=>'ta','テ'=>'te','チ'=>'chi','ト'=>'to','ツ'=>'tsu',
+  'ダ'=>'da','デ'=>'de','ヂ'=>'di','ド'=>'do','ヅ'=>'du',
+  'ワ'=>'wa','ヲ'=>'wo',
+  'ヤ'=>'ya','ヨ'=>'yo','ユ'=>'yu',
+  'ヵ'=>'ka','ヶ'=>'ke',
+  // old characters
+  'ヱ'=>'we','ヰ'=>'wi',
+
+  //  convert what's left (probably only kicks in when something's missing above)
+  'ァ'=>'a','ェ'=>'e','ィ'=>'i','ォ'=>'o','ゥ'=>'u',
+  'ャ'=>'ya','ョ'=>'yo','ュ'=>'yu',
+
+  // special characters
+  '・'=>'_','、'=>'_',
+  'ー'=>'_', // when used with hiragana (seldom), this character would not be converted otherwise
+
+  // 'ラ'=>'la','レ'=>'le','リ'=>'li','ロ'=>'lo','ル'=>'lu',
+  // 'チャ'=>'cya','チェ'=>'cye','チィ'=>'cyi','チョ'=>'cyo','チュ'=>'cyu',
+  //'デャ'=>'dha','デェ'=>'dhe','ディ'=>'dhi','デョ'=>'dho','デュ'=>'dhu',
+  // 'リャ'=>'lya','リェ'=>'lye','リィ'=>'lyi','リョ'=>'lyo','リュ'=>'lyu',
+  // 'テャ'=>'tha','テェ'=>'the','ティ'=>'thi','テョ'=>'tho','テュ'=>'thu',
+  //'ファ'=>'fwa','フェ'=>'fwe','フィ'=>'fwi','フォ'=>'fwo','フゥ'=>'fwu',
+  //'チャ'=>'tya','チェ'=>'tye','チィ'=>'tyi','チョ'=>'tyo','チュ'=>'tyu',
+  // 'ジャ'=>'jya','ジェ'=>'jye','ジィ'=>'jyi','ジョ'=>'jyo','ジュ'=>'jyu',
+  // 'ジャ'=>'zha','ジェ'=>'zhe','ジィ'=>'zhi','ジョ'=>'zho','ジュ'=>'zhu',
+  //'ジャ'=>'zya','ジェ'=>'zye','ジィ'=>'zyi','ジョ'=>'zyo','ジュ'=>'zyu',
+  //'シャ'=>'sya','シェ'=>'sye','シィ'=>'syi','ショ'=>'syo','シュ'=>'syu',
+  //'シ'=>'ci','フ'=>'hu',シ'=>'si','チ'=>'ti','ツ'=>'tu','イ'=>'yi','ヂ'=>'dzi',
+
+  // "Greeklish"
+  'Γ'=>'G','Δ'=>'E','Θ'=>'Th','Λ'=>'L','Ξ'=>'X','Π'=>'P','Σ'=>'S','Φ'=>'F','Ψ'=>'Ps',
+  'γ'=>'g','δ'=>'e','θ'=>'th','λ'=>'l','ξ'=>'x','π'=>'p','σ'=>'s','φ'=>'f','ψ'=>'ps',
+
+  // Thai
+  'ก'=>'k','ข'=>'kh','ฃ'=>'kh','ค'=>'kh','ฅ'=>'kh','ฆ'=>'kh','ง'=>'ng','จ'=>'ch',
+  'ฉ'=>'ch','ช'=>'ch','ซ'=>'s','ฌ'=>'ch','ญ'=>'y','ฎ'=>'d','ฏ'=>'t','ฐ'=>'th',
+  'ฑ'=>'d','ฒ'=>'th','ณ'=>'n','ด'=>'d','ต'=>'t','ถ'=>'th','ท'=>'th','ธ'=>'th',
+  'น'=>'n','บ'=>'b','ป'=>'p','ผ'=>'ph','ฝ'=>'f','พ'=>'ph','ฟ'=>'f','ภ'=>'ph',
+  'ม'=>'m','ย'=>'y','ร'=>'r','ฤ'=>'rue','ฤๅ'=>'rue','ล'=>'l','ฦ'=>'lue',
+  'ฦๅ'=>'lue','ว'=>'w','ศ'=>'s','ษ'=>'s','ส'=>'s','ห'=>'h','ฬ'=>'l','ฮ'=>'h',
+  'ะ'=>'a','ั'=>'a','รร'=>'a','า'=>'a','ๅ'=>'a','ำ'=>'am','ํา'=>'am',
+  'ิ'=>'i','ี'=>'i','ึ'=>'ue','ี'=>'ue','ุ'=>'u','ู'=>'u',
+  'เ'=>'e','แ'=>'ae','โ'=>'o','อ'=>'o',
+  'ียะ'=>'ia','ีย'=>'ia','ือะ'=>'uea','ือ'=>'uea','ัวะ'=>'ua','ัว'=>'ua',
+  'ใ'=>'ai','ไ'=>'ai','ัย'=>'ai','าย'=>'ai','าว'=>'ao',
+  'ุย'=>'ui','อย'=>'oi','ือย'=>'ueai','วย'=>'uai',
+  'ิว'=>'io','็ว'=>'eo','ียว'=>'iao',
+  '่'=>'','้'=>'','๊'=>'','๋'=>'','็'=>'',
+  '์'=>'','๎'=>'','ํ'=>'','ฺ'=>'',
+  'ๆ'=>'2','๏'=>'o','ฯ'=>'-','๚'=>'-','๛'=>'-',
+  '๐'=>'0','๑'=>'1','๒'=>'2','๓'=>'3','๔'=>'4',
+  '๕'=>'5','๖'=>'6','๗'=>'7','๘'=>'8','๙'=>'9',
+
+  // Korean
+  'ㄱ'=>'k','ㅋ'=>'kh','ㄲ'=>'kk','ㄷ'=>'t','ㅌ'=>'th','ㄸ'=>'tt','ㅂ'=>'p',
+  'ㅍ'=>'ph','ㅃ'=>'pp','ㅈ'=>'c','ㅊ'=>'ch','ㅉ'=>'cc','ㅅ'=>'s','ㅆ'=>'ss',
+  'ㅎ'=>'h','ㅇ'=>'ng','ㄴ'=>'n','ㄹ'=>'l','ㅁ'=>'m', 'ㅏ'=>'a','ㅓ'=>'e','ㅗ'=>'o',
+  'ㅜ'=>'wu','ㅡ'=>'u','ㅣ'=>'i','ㅐ'=>'ay','ㅔ'=>'ey','ㅚ'=>'oy','ㅘ'=>'wa','ㅝ'=>'we',
+  'ㅟ'=>'wi','ㅙ'=>'way','ㅞ'=>'wey','ㅢ'=>'uy','ㅑ'=>'ya','ㅕ'=>'ye','ㅛ'=>'oy',
+  'ㅠ'=>'yu','ㅒ'=>'yay','ㅖ'=>'yey',
+);
+
+